From 17c342ac6174a8a4e070bf24f2afbcbb77893a68 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 25 Aug 2021 21:00:17 +0200 Subject: [PATCH] [ts] Modularize player, add package.json files, fix up module paths. --- spine-ts/build/spine-canvas.js | 8888 +---------------- spine-ts/build/spine-canvas.js.map | 4 +- spine-ts/package-lock.json | 30 +- spine-ts/package.json | 6 +- spine-ts/spine-canvas/package.json | 4 + spine-ts/spine-canvas/src/AssetManager.ts | 2 +- spine-ts/spine-canvas/src/CanvasTexture.ts | 2 +- spine-ts/spine-canvas/src/SkeletonRenderer.ts | 2 +- spine-ts/spine-canvas/src/index.ts | 8 +- spine-ts/spine-canvas/tsconfig.json | 2 +- spine-ts/spine-core/package.json | 4 + spine-ts/spine-player/package.json | 30 + spine-ts/spine-player/src/Player.ts | 2059 ++-- spine-ts/spine-player/src/PlayerEditor.ts | 106 +- spine-ts/spine-player/src/index.ts | 27 + spine-ts/spine-player/tsconfig.json | 30 + spine-ts/spine-webgl/package.json | 4 + spine-ts/spine-webgl/src/AssetManager.ts | 5 +- spine-ts/spine-webgl/src/GLTexture.ts | 2 +- spine-ts/spine-webgl/src/Input.ts | 4 +- spine-ts/spine-webgl/src/LoadingScreen.ts | 7 +- spine-ts/spine-webgl/src/Mesh.ts | 2 +- spine-ts/spine-webgl/src/PolygonBatcher.ts | 2 +- spine-ts/spine-webgl/src/SceneRenderer.ts | 2 +- spine-ts/spine-webgl/src/Shader.ts | 2 +- spine-ts/spine-webgl/src/ShapeRenderer.ts | 2 +- .../spine-webgl/src/SkeletonDebugRenderer.ts | 2 +- spine-ts/spine-webgl/src/SkeletonRenderer.ts | 4 +- spine-ts/spine-webgl/src/WebGL.ts | 2 +- spine-ts/spine-webgl/src/index.ts | 8 +- spine-ts/spine-webgl/tsconfig.json | 2 +- spine-ts/tsconfig.base.json | 1 - spine-ts/tsconfig.json | 6 + 33 files changed, 1251 insertions(+), 10010 deletions(-) create mode 100644 spine-ts/spine-player/package.json create mode 100644 spine-ts/spine-player/src/index.ts create mode 100644 spine-ts/spine-player/tsconfig.json diff --git a/spine-ts/build/spine-canvas.js b/spine-ts/build/spine-canvas.js index 12f3c29f8..437f681d2 100644 --- a/spine-ts/build/spine-canvas.js +++ b/spine-ts/build/spine-canvas.js @@ -1,8887 +1,3 @@ -var spine = (() => { - var __defProp = Object.defineProperty; - var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); - var __export = (target, all) => { - __markAsModule(target); - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); - }; - - // spine-canvas/src/index.ts - var src_exports = {}; - __export(src_exports, { - AlphaTimeline: () => AlphaTimeline, - Animation: () => Animation, - AnimationState: () => AnimationState, - AnimationStateAdapter: () => AnimationStateAdapter, - AnimationStateData: () => AnimationStateData, - AssetManager: () => AssetManager, - AssetManagerBase: () => AssetManagerBase, - AtlasAttachmentLoader: () => AtlasAttachmentLoader, - Attachment: () => Attachment, - AttachmentTimeline: () => AttachmentTimeline, - BinaryInput: () => BinaryInput, - BlendMode: () => BlendMode, - Bone: () => Bone, - BoneData: () => BoneData, - BoundingBoxAttachment: () => BoundingBoxAttachment, - CURRENT: () => CURRENT, - CanvasTexture: () => CanvasTexture, - ClippingAttachment: () => ClippingAttachment, - Color: () => Color, - ConstraintData: () => ConstraintData, - CurveTimeline: () => CurveTimeline, - CurveTimeline1: () => CurveTimeline1, - CurveTimeline2: () => CurveTimeline2, - DebugUtils: () => DebugUtils, - DeformTimeline: () => DeformTimeline, - Downloader: () => Downloader, - DrawOrderTimeline: () => DrawOrderTimeline, - Event: () => Event, - EventData: () => EventData, - EventQueue: () => EventQueue, - EventTimeline: () => EventTimeline, - EventType: () => EventType, - FIRST: () => FIRST, - FakeTexture: () => FakeTexture, - HOLD_FIRST: () => HOLD_FIRST, - HOLD_MIX: () => HOLD_MIX, - HOLD_SUBSEQUENT: () => HOLD_SUBSEQUENT, - IkConstraint: () => IkConstraint, - IkConstraintData: () => IkConstraintData, - IkConstraintTimeline: () => IkConstraintTimeline, - IntSet: () => IntSet, - Interpolation: () => Interpolation, - JitterEffect: () => JitterEffect, - MathUtils: () => MathUtils, - MeshAttachment: () => MeshAttachment, - MixBlend: () => MixBlend, - MixDirection: () => MixDirection, - PathAttachment: () => PathAttachment, - PathConstraint: () => PathConstraint, - PathConstraintData: () => PathConstraintData, - PathConstraintMixTimeline: () => PathConstraintMixTimeline, - PathConstraintPositionTimeline: () => PathConstraintPositionTimeline, - PathConstraintSpacingTimeline: () => PathConstraintSpacingTimeline, - PointAttachment: () => PointAttachment, - Pool: () => Pool, - PositionMode: () => PositionMode, - Pow: () => Pow, - PowOut: () => PowOut, - RGB2Timeline: () => RGB2Timeline, - RGBA2Timeline: () => RGBA2Timeline, - RGBATimeline: () => RGBATimeline, - RGBTimeline: () => RGBTimeline, - RegionAttachment: () => RegionAttachment, - RotateMode: () => RotateMode, - RotateTimeline: () => RotateTimeline, - SETUP: () => SETUP, - SUBSEQUENT: () => SUBSEQUENT, - ScaleTimeline: () => ScaleTimeline, - ScaleXTimeline: () => ScaleXTimeline, - ScaleYTimeline: () => ScaleYTimeline, - ShearTimeline: () => ShearTimeline, - ShearXTimeline: () => ShearXTimeline, - ShearYTimeline: () => ShearYTimeline, - Skeleton: () => Skeleton, - SkeletonBinary: () => SkeletonBinary, - SkeletonBounds: () => SkeletonBounds, - SkeletonClipping: () => SkeletonClipping, - SkeletonData: () => SkeletonData, - SkeletonJson: () => SkeletonJson, - SkeletonRenderer: () => SkeletonRenderer, - Skin: () => Skin, - SkinEntry: () => SkinEntry, - Slot: () => Slot, - SlotData: () => SlotData, - SpacingMode: () => SpacingMode, - StringSet: () => StringSet, - SwirlEffect: () => SwirlEffect, - Texture: () => Texture, - TextureAtlas: () => TextureAtlas, - TextureAtlasPage: () => TextureAtlasPage, - TextureAtlasRegion: () => TextureAtlasRegion, - TextureFilter: () => TextureFilter, - TextureRegion: () => TextureRegion, - TextureWrap: () => TextureWrap, - TimeKeeper: () => TimeKeeper, - Timeline: () => Timeline, - TrackEntry: () => TrackEntry, - TransformConstraint: () => TransformConstraint, - TransformConstraintData: () => TransformConstraintData, - TransformConstraintTimeline: () => TransformConstraintTimeline, - TransformMode: () => TransformMode, - TranslateTimeline: () => TranslateTimeline, - TranslateXTimeline: () => TranslateXTimeline, - TranslateYTimeline: () => TranslateYTimeline, - Triangulator: () => Triangulator, - Utils: () => Utils, - Vector2: () => Vector2, - VertexAttachment: () => VertexAttachment, - WindowedMean: () => WindowedMean - }); - - // spine-core/src/Utils.ts - var IntSet = class { - constructor() { - this.array = new Array(); - } - add(value) { - let contains = this.contains(value); - this.array[value | 0] = value | 0; - return !contains; - } - contains(value) { - return this.array[value | 0] != void 0; - } - remove(value) { - this.array[value | 0] = void 0; - } - clear() { - this.array.length = 0; - } - }; - var StringSet = class { - constructor() { - this.entries = {}; - this.size = 0; - } - add(value) { - let contains = this.entries[value]; - this.entries[value] = true; - if (!contains) { - this.size++; - return true; - } - return false; - } - addAll(values) { - let oldSize = this.size; - for (var i = 0, n = values.length; i < n; i++) - this.add(values[i]); - return oldSize != this.size; - } - contains(value) { - return this.entries[value]; - } - clear() { - this.entries = {}; - this.size = 0; - } - }; - var _Color = class { - constructor(r = 0, g = 0, b = 0, a = 0) { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } - set(r, g, b, a) { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - return this.clamp(); - } - setFromColor(c) { - this.r = c.r; - this.g = c.g; - this.b = c.b; - this.a = c.a; - return this; - } - setFromString(hex) { - hex = hex.charAt(0) == "#" ? hex.substr(1) : hex; - this.r = parseInt(hex.substr(0, 2), 16) / 255; - this.g = parseInt(hex.substr(2, 2), 16) / 255; - this.b = parseInt(hex.substr(4, 2), 16) / 255; - this.a = hex.length != 8 ? 1 : parseInt(hex.substr(6, 2), 16) / 255; - return this; - } - add(r, g, b, a) { - this.r += r; - this.g += g; - this.b += b; - this.a += a; - return this.clamp(); - } - clamp() { - if (this.r < 0) - this.r = 0; - else if (this.r > 1) - this.r = 1; - if (this.g < 0) - this.g = 0; - else if (this.g > 1) - this.g = 1; - if (this.b < 0) - this.b = 0; - else if (this.b > 1) - this.b = 1; - if (this.a < 0) - this.a = 0; - else if (this.a > 1) - this.a = 1; - return this; - } - static rgba8888ToColor(color, value) { - color.r = ((value & 4278190080) >>> 24) / 255; - color.g = ((value & 16711680) >>> 16) / 255; - color.b = ((value & 65280) >>> 8) / 255; - color.a = (value & 255) / 255; - } - static rgb888ToColor(color, value) { - color.r = ((value & 16711680) >>> 16) / 255; - color.g = ((value & 65280) >>> 8) / 255; - color.b = (value & 255) / 255; - } - static fromString(hex) { - return new _Color().setFromString(hex); - } - }; - var Color = _Color; - Color.WHITE = new _Color(1, 1, 1, 1); - Color.RED = new _Color(1, 0, 0, 1); - Color.GREEN = new _Color(0, 1, 0, 1); - Color.BLUE = new _Color(0, 0, 1, 1); - Color.MAGENTA = new _Color(1, 0, 1, 1); - var _MathUtils = class { - static clamp(value, min, max) { - if (value < min) - return min; - if (value > max) - return max; - return value; - } - static cosDeg(degrees) { - return Math.cos(degrees * _MathUtils.degRad); - } - static sinDeg(degrees) { - return Math.sin(degrees * _MathUtils.degRad); - } - static signum(value) { - return value > 0 ? 1 : value < 0 ? -1 : 0; - } - static toInt(x) { - return x > 0 ? Math.floor(x) : Math.ceil(x); - } - static cbrt(x) { - let y = Math.pow(Math.abs(x), 1 / 3); - return x < 0 ? -y : y; - } - static randomTriangular(min, max) { - return _MathUtils.randomTriangularWith(min, max, (min + max) * 0.5); - } - static randomTriangularWith(min, max, mode) { - let u = Math.random(); - let d = max - min; - if (u <= (mode - min) / d) - return min + Math.sqrt(u * d * (mode - min)); - return max - Math.sqrt((1 - u) * d * (max - mode)); - } - static isPowerOfTwo(value) { - return value && (value & value - 1) === 0; - } - }; - var MathUtils = _MathUtils; - MathUtils.PI = 3.1415927; - MathUtils.PI2 = _MathUtils.PI * 2; - MathUtils.radiansToDegrees = 180 / _MathUtils.PI; - MathUtils.radDeg = _MathUtils.radiansToDegrees; - MathUtils.degreesToRadians = _MathUtils.PI / 180; - MathUtils.degRad = _MathUtils.degreesToRadians; - var Interpolation = class { - apply(start, end, a) { - return start + (end - start) * this.applyInternal(a); - } - }; - var Pow = class extends Interpolation { - constructor(power) { - super(); - this.power = 2; - this.power = power; - } - applyInternal(a) { - if (a <= 0.5) - return Math.pow(a * 2, this.power) / 2; - return Math.pow((a - 1) * 2, this.power) / (this.power % 2 == 0 ? -2 : 2) + 1; - } - }; - var PowOut = class extends Pow { - constructor(power) { - super(power); - } - applyInternal(a) { - return Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1; - } - }; - var _Utils = class { - static arrayCopy(source, sourceStart, dest, destStart, numElements) { - for (let i = sourceStart, j = destStart; i < sourceStart + numElements; i++, j++) { - dest[j] = source[i]; - } - } - static arrayFill(array, fromIndex, toIndex, value) { - for (let i = fromIndex; i < toIndex; i++) - array[i] = value; - } - static setArraySize(array, size, value = 0) { - let oldSize = array.length; - if (oldSize == size) - return array; - array.length = size; - if (oldSize < size) { - for (let i = oldSize; i < size; i++) - array[i] = value; - } - return array; - } - static ensureArrayCapacity(array, size, value = 0) { - if (array.length >= size) - return array; - return _Utils.setArraySize(array, size, value); - } - static newArray(size, defaultValue) { - let array = new Array(size); - for (let i = 0; i < size; i++) - array[i] = defaultValue; - return array; - } - static newFloatArray(size) { - if (_Utils.SUPPORTS_TYPED_ARRAYS) - return new Float32Array(size); - else { - let array = new Array(size); - for (let i = 0; i < array.length; i++) - array[i] = 0; - return array; - } - } - static newShortArray(size) { - if (_Utils.SUPPORTS_TYPED_ARRAYS) - return new Int16Array(size); - else { - let array = new Array(size); - for (let i = 0; i < array.length; i++) - array[i] = 0; - return array; - } - } - static toFloatArray(array) { - return _Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array; - } - static toSinglePrecision(value) { - return _Utils.SUPPORTS_TYPED_ARRAYS ? Math.fround(value) : value; - } - static webkit602BugfixHelper(alpha, blend) { - } - static contains(array, element, identity = true) { - for (var i = 0; i < array.length; i++) - if (array[i] == element) - return true; - return false; - } - static enumValue(type, name) { - return type[name[0].toUpperCase() + name.slice(1)]; - } - }; - var Utils = _Utils; - Utils.SUPPORTS_TYPED_ARRAYS = typeof Float32Array !== "undefined"; - var DebugUtils = class { - static logBones(skeleton) { - for (let i = 0; i < skeleton.bones.length; i++) { - let bone = skeleton.bones[i]; - console.log(bone.data.name + ", " + bone.a + ", " + bone.b + ", " + bone.c + ", " + bone.d + ", " + bone.worldX + ", " + bone.worldY); - } - } - }; - var Pool = class { - constructor(instantiator) { - this.items = new Array(); - this.instantiator = instantiator; - } - obtain() { - return this.items.length > 0 ? this.items.pop() : this.instantiator(); - } - free(item) { - if (item.reset) - item.reset(); - this.items.push(item); - } - freeAll(items) { - for (let i = 0; i < items.length; i++) - this.free(items[i]); - } - clear() { - this.items.length = 0; - } - }; - var Vector2 = class { - constructor(x = 0, y = 0) { - this.x = x; - this.y = y; - } - set(x, y) { - this.x = x; - this.y = y; - return this; - } - length() { - let x = this.x; - let y = this.y; - return Math.sqrt(x * x + y * y); - } - normalize() { - let len = this.length(); - if (len != 0) { - this.x /= len; - this.y /= len; - } - return this; - } - }; - var TimeKeeper = class { - constructor() { - this.maxDelta = 0.064; - this.framesPerSecond = 0; - this.delta = 0; - this.totalTime = 0; - this.lastTime = Date.now() / 1e3; - this.frameCount = 0; - this.frameTime = 0; - } - update() { - let now = Date.now() / 1e3; - this.delta = now - this.lastTime; - this.frameTime += this.delta; - this.totalTime += this.delta; - if (this.delta > this.maxDelta) - this.delta = this.maxDelta; - this.lastTime = now; - this.frameCount++; - if (this.frameTime > 1) { - this.framesPerSecond = this.frameCount / this.frameTime; - this.frameTime = 0; - this.frameCount = 0; - } - } - }; - var WindowedMean = class { - constructor(windowSize = 32) { - this.addedValues = 0; - this.lastValue = 0; - this.mean = 0; - this.dirty = true; - this.values = new Array(windowSize); - } - hasEnoughData() { - return this.addedValues >= this.values.length; - } - addValue(value) { - if (this.addedValues < this.values.length) - this.addedValues++; - this.values[this.lastValue++] = value; - if (this.lastValue > this.values.length - 1) - this.lastValue = 0; - this.dirty = true; - } - getMean() { - if (this.hasEnoughData()) { - if (this.dirty) { - let mean = 0; - for (let i = 0; i < this.values.length; i++) - mean += this.values[i]; - this.mean = mean / this.values.length; - this.dirty = false; - } - return this.mean; - } - return 0; - } - }; - - // spine-core/src/attachments/Attachment.ts - var Attachment = class { - constructor(name) { - if (!name) - throw new Error("name cannot be null."); - this.name = name; - } - }; - var _VertexAttachment = class extends Attachment { - constructor(name) { - super(name); - this.id = _VertexAttachment.nextID++; - this.worldVerticesLength = 0; - this.deformAttachment = this; - } - computeWorldVertices(slot, start, count, worldVertices, offset, stride) { - count = offset + (count >> 1) * stride; - let skeleton = slot.bone.skeleton; - let deformArray = slot.deform; - let vertices = this.vertices; - let bones = this.bones; - if (!bones) { - if (deformArray.length > 0) - vertices = deformArray; - let bone = slot.bone; - let x = bone.worldX; - let y = bone.worldY; - let a = bone.a, b = bone.b, c = bone.c, d = bone.d; - for (let v2 = start, w = offset; w < count; v2 += 2, w += stride) { - let vx = vertices[v2], vy = vertices[v2 + 1]; - worldVertices[w] = vx * a + vy * b + x; - worldVertices[w + 1] = vx * c + vy * d + y; - } - return; - } - let v = 0, skip = 0; - for (let i = 0; i < start; i += 2) { - let n = bones[v]; - v += n + 1; - skip += n; - } - let skeletonBones = skeleton.bones; - if (deformArray.length == 0) { - for (let w = offset, b = skip * 3; w < count; w += stride) { - let wx = 0, wy = 0; - let n = bones[v++]; - n += v; - for (; v < n; v++, b += 3) { - let bone = skeletonBones[bones[v]]; - let vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; - wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; - wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; - } - worldVertices[w] = wx; - worldVertices[w + 1] = wy; - } - } else { - let deform = deformArray; - for (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) { - let wx = 0, wy = 0; - let n = bones[v++]; - n += v; - for (; v < n; v++, b += 3, f += 2) { - let bone = skeletonBones[bones[v]]; - let vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2]; - wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; - wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; - } - worldVertices[w] = wx; - worldVertices[w + 1] = wy; - } - } - } - copyTo(attachment) { - if (this.bones) { - attachment.bones = new Array(this.bones.length); - Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length); - } else - attachment.bones = null; - if (this.vertices) { - attachment.vertices = Utils.newFloatArray(this.vertices.length); - Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length); - } else - attachment.vertices = null; - attachment.worldVerticesLength = this.worldVerticesLength; - attachment.deformAttachment = this.deformAttachment; - } - }; - var VertexAttachment = _VertexAttachment; - VertexAttachment.nextID = 0; - - // spine-core/src/Animation.ts - var Animation = class { - constructor(name, timelines, duration) { - if (!name) - throw new Error("name cannot be null."); - this.name = name; - this.setTimelines(timelines); - this.duration = duration; - } - setTimelines(timelines) { - if (!timelines) - throw new Error("timelines cannot be null."); - this.timelines = timelines; - this.timelineIds = new StringSet(); - for (var i = 0; i < timelines.length; i++) - this.timelineIds.addAll(timelines[i].getPropertyIds()); - } - hasTimeline(ids) { - for (let i = 0; i < ids.length; i++) - if (this.timelineIds.contains(ids[i])) - return true; - return false; - } - apply(skeleton, lastTime, time, loop, events, alpha, blend, direction) { - if (!skeleton) - throw new Error("skeleton cannot be null."); - if (loop && this.duration != 0) { - time %= this.duration; - if (lastTime > 0) - lastTime %= this.duration; - } - let timelines = this.timelines; - for (let i = 0, n = timelines.length; i < n; i++) - timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction); - } - }; - var MixBlend; - (function(MixBlend2) { - MixBlend2[MixBlend2["setup"] = 0] = "setup"; - MixBlend2[MixBlend2["first"] = 1] = "first"; - MixBlend2[MixBlend2["replace"] = 2] = "replace"; - MixBlend2[MixBlend2["add"] = 3] = "add"; - })(MixBlend || (MixBlend = {})); - var MixDirection; - (function(MixDirection2) { - MixDirection2[MixDirection2["mixIn"] = 0] = "mixIn"; - MixDirection2[MixDirection2["mixOut"] = 1] = "mixOut"; - })(MixDirection || (MixDirection = {})); - var Property = { - rotate: 0, - x: 1, - y: 2, - scaleX: 3, - scaleY: 4, - shearX: 5, - shearY: 6, - rgb: 7, - alpha: 8, - rgb2: 9, - attachment: 10, - deform: 11, - event: 12, - drawOrder: 13, - ikConstraint: 14, - transformConstraint: 15, - pathConstraintPosition: 16, - pathConstraintSpacing: 17, - pathConstraintMix: 18 - }; - var Timeline = class { - constructor(frameCount, propertyIds) { - this.propertyIds = propertyIds; - this.frames = Utils.newFloatArray(frameCount * this.getFrameEntries()); - } - getPropertyIds() { - return this.propertyIds; - } - getFrameEntries() { - return 1; - } - getFrameCount() { - return this.frames.length / this.getFrameEntries(); - } - getDuration() { - return this.frames[this.frames.length - this.getFrameEntries()]; - } - static search1(frames, time) { - let n = frames.length; - for (let i = 1; i < n; i++) - if (frames[i] > time) - return i - 1; - return n - 1; - } - static search(frames, time, step) { - let n = frames.length; - for (let i = step; i < n; i += step) - if (frames[i] > time) - return i - step; - return n - step; - } - }; - var CurveTimeline = class extends Timeline { - constructor(frameCount, bezierCount, propertyIds) { - super(frameCount, propertyIds); - this.curves = Utils.newFloatArray(frameCount + bezierCount * 18); - this.curves[frameCount - 1] = 1; - } - setLinear(frame) { - this.curves[frame] = 0; - } - setStepped(frame) { - this.curves[frame] = 1; - } - shrink(bezierCount) { - let size = this.getFrameCount() + bezierCount * 18; - if (this.curves.length > size) { - let newCurves = Utils.newFloatArray(size); - Utils.arrayCopy(this.curves, 0, newCurves, 0, size); - this.curves = newCurves; - } - } - setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) { - let curves = this.curves; - let i = this.getFrameCount() + bezier * 18; - if (value == 0) - curves[frame] = 2 + i; - let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03; - let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 6e-3, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 6e-3; - let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy; - let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = (cy1 - value1) * 0.3 + tmpy + dddy * 0.16666667; - let x = time1 + dx, y = value1 + dy; - for (let n = i + 18; i < n; i += 2) { - curves[i] = x; - curves[i + 1] = y; - dx += ddx; - dy += ddy; - ddx += dddx; - ddy += dddy; - x += dx; - y += dy; - } - } - getBezierValue(time, frameIndex, valueOffset, i) { - let curves = this.curves; - if (curves[i] > time) { - let x2 = this.frames[frameIndex], y2 = this.frames[frameIndex + valueOffset]; - return y2 + (time - x2) / (curves[i] - x2) * (curves[i + 1] - y2); - } - let n = i + 18; - for (i += 2; i < n; i += 2) { - if (curves[i] >= time) { - let x2 = curves[i - 2], y2 = curves[i - 1]; - return y2 + (time - x2) / (curves[i] - x2) * (curves[i + 1] - y2); - } - } - frameIndex += this.getFrameEntries(); - let x = curves[n - 2], y = curves[n - 1]; - return y + (time - x) / (this.frames[frameIndex] - x) * (this.frames[frameIndex + valueOffset] - y); - } - }; - var CurveTimeline1 = class extends CurveTimeline { - constructor(frameCount, bezierCount, propertyId) { - super(frameCount, bezierCount, [propertyId]); - } - getFrameEntries() { - return 2; - } - setFrame(frame, time, value) { - frame <<= 1; - this.frames[frame] = time; - this.frames[frame + 1] = value; - } - getCurveValue(time) { - let frames = this.frames; - let i = frames.length - 2; - for (let ii = 2; ii <= i; ii += 2) { - if (frames[ii] > time) { - i = ii - 2; - break; - } - } - let curveType = this.curves[i >> 1]; - switch (curveType) { - case 0: - let before = frames[i], value = frames[i + 1]; - return value + (time - before) / (frames[i + 2] - before) * (frames[i + 2 + 1] - value); - case 1: - return frames[i + 1]; - } - return this.getBezierValue(time, i, 1, curveType - 2); - } - }; - var CurveTimeline2 = class extends CurveTimeline { - constructor(frameCount, bezierCount, propertyId1, propertyId2) { - super(frameCount, bezierCount, [propertyId1, propertyId2]); - } - getFrameEntries() { - return 3; - } - setFrame(frame, time, value1, value2) { - frame *= 3; - this.frames[frame] = time; - this.frames[frame + 1] = value1; - this.frames[frame + 2] = value2; - } - }; - var RotateTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.rotate + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.rotation = bone.data.rotation; - return; - case 1: - bone.rotation += (bone.data.rotation - bone.rotation) * alpha; - } - return; - } - let r = this.getCurveValue(time); - switch (blend) { - case 0: - bone.rotation = bone.data.rotation + r * alpha; - break; - case 1: - case 2: - r += bone.data.rotation - bone.rotation; - case 3: - bone.rotation += r * alpha; - } - } - }; - var TranslateTimeline = class extends CurveTimeline2 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.x + "|" + boneIndex, Property.y + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.x = bone.data.x; - bone.y = bone.data.y; - return; - case 1: - bone.x += (bone.data.x - bone.x) * alpha; - bone.y += (bone.data.y - bone.y) * alpha; - } - return; - } - let x = 0, y = 0; - let i = Timeline.search(frames, time, 3); - let curveType = this.curves[i / 3]; - switch (curveType) { - case 0: - let before = frames[i]; - x = frames[i + 1]; - y = frames[i + 2]; - let t = (time - before) / (frames[i + 3] - before); - x += (frames[i + 3 + 1] - x) * t; - y += (frames[i + 3 + 2] - y) * t; - break; - case 1: - x = frames[i + 1]; - y = frames[i + 2]; - break; - default: - x = this.getBezierValue(time, i, 1, curveType - 2); - y = this.getBezierValue(time, i, 2, curveType + 18 - 2); - } - switch (blend) { - case 0: - bone.x = bone.data.x + x * alpha; - bone.y = bone.data.y + y * alpha; - break; - case 1: - case 2: - bone.x += (bone.data.x + x - bone.x) * alpha; - bone.y += (bone.data.y + y - bone.y) * alpha; - break; - case 3: - bone.x += x * alpha; - bone.y += y * alpha; - } - } - }; - var TranslateXTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.x + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.x = bone.data.x; - return; - case 1: - bone.x += (bone.data.x - bone.x) * alpha; - } - return; - } - let x = this.getCurveValue(time); - switch (blend) { - case 0: - bone.x = bone.data.x + x * alpha; - break; - case 1: - case 2: - bone.x += (bone.data.x + x - bone.x) * alpha; - break; - case 3: - bone.x += x * alpha; - } - } - }; - var TranslateYTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.y + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.y = bone.data.y; - return; - case 1: - bone.y += (bone.data.y - bone.y) * alpha; - } - return; - } - let y = this.getCurveValue(time); - switch (blend) { - case 0: - bone.y = bone.data.y + y * alpha; - break; - case 1: - case 2: - bone.y += (bone.data.y + y - bone.y) * alpha; - break; - case 3: - bone.y += y * alpha; - } - } - }; - var ScaleTimeline = class extends CurveTimeline2 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex, Property.scaleY + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.scaleX = bone.data.scaleX; - bone.scaleY = bone.data.scaleY; - return; - case 1: - bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha; - bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha; - } - return; - } - let x, y; - let i = Timeline.search(frames, time, 3); - let curveType = this.curves[i / 3]; - switch (curveType) { - case 0: - let before = frames[i]; - x = frames[i + 1]; - y = frames[i + 2]; - let t = (time - before) / (frames[i + 3] - before); - x += (frames[i + 3 + 1] - x) * t; - y += (frames[i + 3 + 2] - y) * t; - break; - case 1: - x = frames[i + 1]; - y = frames[i + 2]; - break; - default: - x = this.getBezierValue(time, i, 1, curveType - 2); - y = this.getBezierValue(time, i, 2, curveType + 18 - 2); - } - x *= bone.data.scaleX; - y *= bone.data.scaleY; - if (alpha == 1) { - if (blend == 3) { - bone.scaleX += x - bone.data.scaleX; - bone.scaleY += y - bone.data.scaleY; - } else { - bone.scaleX = x; - bone.scaleY = y; - } - } else { - let bx = 0, by = 0; - if (direction == 1) { - switch (blend) { - case 0: - bx = bone.data.scaleX; - by = bone.data.scaleY; - bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha; - bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha; - break; - case 1: - case 2: - bx = bone.scaleX; - by = bone.scaleY; - bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha; - bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha; - break; - case 3: - bx = bone.scaleX; - by = bone.scaleY; - bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha; - bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha; - } - } else { - switch (blend) { - case 0: - bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x); - by = Math.abs(bone.data.scaleY) * MathUtils.signum(y); - bone.scaleX = bx + (x - bx) * alpha; - bone.scaleY = by + (y - by) * alpha; - break; - case 1: - case 2: - bx = Math.abs(bone.scaleX) * MathUtils.signum(x); - by = Math.abs(bone.scaleY) * MathUtils.signum(y); - bone.scaleX = bx + (x - bx) * alpha; - bone.scaleY = by + (y - by) * alpha; - break; - case 3: - bx = MathUtils.signum(x); - by = MathUtils.signum(y); - bone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha; - bone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha; - } - } - } - } - }; - var ScaleXTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.scaleX = bone.data.scaleX; - return; - case 1: - bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha; - } - return; - } - let x = this.getCurveValue(time) * bone.data.scaleX; - if (alpha == 1) { - if (blend == 3) - bone.scaleX += x - bone.data.scaleX; - else - bone.scaleX = x; - } else { - let bx = 0; - if (direction == 1) { - switch (blend) { - case 0: - bx = bone.data.scaleX; - bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha; - break; - case 1: - case 2: - bx = bone.scaleX; - bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha; - break; - case 3: - bx = bone.scaleX; - bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha; - } - } else { - switch (blend) { - case 0: - bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x); - bone.scaleX = bx + (x - bx) * alpha; - break; - case 1: - case 2: - bx = Math.abs(bone.scaleX) * MathUtils.signum(x); - bone.scaleX = bx + (x - bx) * alpha; - break; - case 3: - bx = MathUtils.signum(x); - bone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha; - } - } - } - } - }; - var ScaleYTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.scaleY + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.scaleY = bone.data.scaleY; - return; - case 1: - bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha; - } - return; - } - let y = this.getCurveValue(time) * bone.data.scaleY; - if (alpha == 1) { - if (blend == 3) - bone.scaleY += y - bone.data.scaleY; - else - bone.scaleY = y; - } else { - let by = 0; - if (direction == 1) { - switch (blend) { - case 0: - by = bone.data.scaleY; - bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha; - break; - case 1: - case 2: - by = bone.scaleY; - bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha; - break; - case 3: - by = bone.scaleY; - bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha; - } - } else { - switch (blend) { - case 0: - by = Math.abs(bone.data.scaleY) * MathUtils.signum(y); - bone.scaleY = by + (y - by) * alpha; - break; - case 1: - case 2: - by = Math.abs(bone.scaleY) * MathUtils.signum(y); - bone.scaleY = by + (y - by) * alpha; - break; - case 3: - by = MathUtils.signum(y); - bone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha; - } - } - } - } - }; - var ShearTimeline = class extends CurveTimeline2 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.shearX + "|" + boneIndex, Property.shearY + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.shearX = bone.data.shearX; - bone.shearY = bone.data.shearY; - return; - case 1: - bone.shearX += (bone.data.shearX - bone.shearX) * alpha; - bone.shearY += (bone.data.shearY - bone.shearY) * alpha; - } - return; - } - let x = 0, y = 0; - let i = Timeline.search(frames, time, 3); - let curveType = this.curves[i / 3]; - switch (curveType) { - case 0: - let before = frames[i]; - x = frames[i + 1]; - y = frames[i + 2]; - let t = (time - before) / (frames[i + 3] - before); - x += (frames[i + 3 + 1] - x) * t; - y += (frames[i + 3 + 2] - y) * t; - break; - case 1: - x = frames[i + 1]; - y = frames[i + 2]; - break; - default: - x = this.getBezierValue(time, i, 1, curveType - 2); - y = this.getBezierValue(time, i, 2, curveType + 18 - 2); - } - switch (blend) { - case 0: - bone.shearX = bone.data.shearX + x * alpha; - bone.shearY = bone.data.shearY + y * alpha; - break; - case 1: - case 2: - bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha; - bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha; - break; - case 3: - bone.shearX += x * alpha; - bone.shearY += y * alpha; - } - } - }; - var ShearXTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.shearX + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.shearX = bone.data.shearX; - return; - case 1: - bone.shearX += (bone.data.shearX - bone.shearX) * alpha; - } - return; - } - let x = this.getCurveValue(time); - switch (blend) { - case 0: - bone.shearX = bone.data.shearX + x * alpha; - break; - case 1: - case 2: - bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha; - break; - case 3: - bone.shearX += x * alpha; - } - } - }; - var ShearYTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, boneIndex) { - super(frameCount, bezierCount, Property.shearY + "|" + boneIndex); - this.boneIndex = 0; - this.boneIndex = boneIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let bone = skeleton.bones[this.boneIndex]; - if (!bone.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - bone.shearY = bone.data.shearY; - return; - case 1: - bone.shearY += (bone.data.shearY - bone.shearY) * alpha; - } - return; - } - let y = this.getCurveValue(time); - switch (blend) { - case 0: - bone.shearY = bone.data.shearY + y * alpha; - break; - case 1: - case 2: - bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha; - break; - case 3: - bone.shearY += y * alpha; - } - } - }; - var RGBATimeline = class extends CurveTimeline { - constructor(frameCount, bezierCount, slotIndex) { - super(frameCount, bezierCount, [ - Property.rgb + "|" + slotIndex, - Property.alpha + "|" + slotIndex - ]); - this.slotIndex = 0; - this.slotIndex = slotIndex; - } - getFrameEntries() { - return 5; - } - setFrame(frame, time, r, g, b, a) { - frame *= 5; - this.frames[frame] = time; - this.frames[frame + 1] = r; - this.frames[frame + 2] = g; - this.frames[frame + 3] = b; - this.frames[frame + 4] = a; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - let frames = this.frames; - let color = slot.color; - if (time < frames[0]) { - let setup = slot.data.color; - switch (blend) { - case 0: - color.setFromColor(setup); - return; - case 1: - color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha, (setup.a - color.a) * alpha); - } - return; - } - let r = 0, g = 0, b = 0, a = 0; - let i = Timeline.search(frames, time, 5); - let curveType = this.curves[i / 5]; - switch (curveType) { - case 0: - let before = frames[i]; - r = frames[i + 1]; - g = frames[i + 2]; - b = frames[i + 3]; - a = frames[i + 4]; - let t = (time - before) / (frames[i + 5] - before); - r += (frames[i + 5 + 1] - r) * t; - g += (frames[i + 5 + 2] - g) * t; - b += (frames[i + 5 + 3] - b) * t; - a += (frames[i + 5 + 4] - a) * t; - break; - case 1: - r = frames[i + 1]; - g = frames[i + 2]; - b = frames[i + 3]; - a = frames[i + 4]; - break; - default: - r = this.getBezierValue(time, i, 1, curveType - 2); - g = this.getBezierValue(time, i, 2, curveType + 18 - 2); - b = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); - a = this.getBezierValue(time, i, 4, curveType + 18 * 3 - 2); - } - if (alpha == 1) - color.set(r, g, b, a); - else { - if (blend == 0) - color.setFromColor(slot.data.color); - color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha); - } - } - }; - var RGBTimeline = class extends CurveTimeline { - constructor(frameCount, bezierCount, slotIndex) { - super(frameCount, bezierCount, [ - Property.rgb + "|" + slotIndex - ]); - this.slotIndex = 0; - this.slotIndex = slotIndex; - } - getFrameEntries() { - return 4; - } - setFrame(frame, time, r, g, b) { - frame <<= 2; - this.frames[frame] = time; - this.frames[frame + 1] = r; - this.frames[frame + 2] = g; - this.frames[frame + 3] = b; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - let frames = this.frames; - let color = slot.color; - if (time < frames[0]) { - let setup = slot.data.color; - switch (blend) { - case 0: - color.r = setup.r; - color.g = setup.g; - color.b = setup.b; - return; - case 1: - color.r += (setup.r - color.r) * alpha; - color.g += (setup.g - color.g) * alpha; - color.b += (setup.b - color.b) * alpha; - } - return; - } - let r = 0, g = 0, b = 0; - let i = Timeline.search(frames, time, 4); - let curveType = this.curves[i >> 2]; - switch (curveType) { - case 0: - let before = frames[i]; - r = frames[i + 1]; - g = frames[i + 2]; - b = frames[i + 3]; - let t = (time - before) / (frames[i + 4] - before); - r += (frames[i + 4 + 1] - r) * t; - g += (frames[i + 4 + 2] - g) * t; - b += (frames[i + 4 + 3] - b) * t; - break; - case 1: - r = frames[i + 1]; - g = frames[i + 2]; - b = frames[i + 3]; - break; - default: - r = this.getBezierValue(time, i, 1, curveType - 2); - g = this.getBezierValue(time, i, 2, curveType + 18 - 2); - b = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); - } - if (alpha == 1) { - color.r = r; - color.g = g; - color.b = b; - } else { - if (blend == 0) { - let setup = slot.data.color; - color.r = setup.r; - color.g = setup.g; - color.b = setup.b; - } - color.r += (r - color.r) * alpha; - color.g += (g - color.g) * alpha; - color.b += (b - color.b) * alpha; - } - } - }; - var AlphaTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, slotIndex) { - super(frameCount, bezierCount, Property.alpha + "|" + slotIndex); - this.slotIndex = 0; - this.slotIndex = slotIndex; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - let color = slot.color; - if (time < this.frames[0]) { - let setup = slot.data.color; - switch (blend) { - case 0: - color.a = setup.a; - return; - case 1: - color.a += (setup.a - color.a) * alpha; - } - return; - } - let a = this.getCurveValue(time); - if (alpha == 1) - color.a = a; - else { - if (blend == 0) - color.a = slot.data.color.a; - color.a += (a - color.a) * alpha; - } - } - }; - var RGBA2Timeline = class extends CurveTimeline { - constructor(frameCount, bezierCount, slotIndex) { - super(frameCount, bezierCount, [ - Property.rgb + "|" + slotIndex, - Property.alpha + "|" + slotIndex, - Property.rgb2 + "|" + slotIndex - ]); - this.slotIndex = 0; - this.slotIndex = slotIndex; - } - getFrameEntries() { - return 8; - } - setFrame(frame, time, r, g, b, a, r2, g2, b2) { - frame <<= 3; - this.frames[frame] = time; - this.frames[frame + 1] = r; - this.frames[frame + 2] = g; - this.frames[frame + 3] = b; - this.frames[frame + 4] = a; - this.frames[frame + 5] = r2; - this.frames[frame + 6] = g2; - this.frames[frame + 7] = b2; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - let frames = this.frames; - let light = slot.color, dark = slot.darkColor; - if (time < frames[0]) { - let setupLight = slot.data.color, setupDark = slot.data.darkColor; - switch (blend) { - case 0: - light.setFromColor(setupLight); - dark.r = setupDark.r; - dark.g = setupDark.g; - dark.b = setupDark.b; - return; - case 1: - light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha, (setupLight.a - light.a) * alpha); - dark.r += (setupDark.r - dark.r) * alpha; - dark.g += (setupDark.g - dark.g) * alpha; - dark.b += (setupDark.b - dark.b) * alpha; - } - return; - } - let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0; - let i = Timeline.search(frames, time, 8); - let curveType = this.curves[i >> 3]; - switch (curveType) { - case 0: - let before = frames[i]; - r = frames[i + 1]; - g = frames[i + 2]; - b = frames[i + 3]; - a = frames[i + 4]; - r2 = frames[i + 5]; - g2 = frames[i + 6]; - b2 = frames[i + 7]; - let t = (time - before) / (frames[i + 8] - before); - r += (frames[i + 8 + 1] - r) * t; - g += (frames[i + 8 + 2] - g) * t; - b += (frames[i + 8 + 3] - b) * t; - a += (frames[i + 8 + 4] - a) * t; - r2 += (frames[i + 8 + 5] - r2) * t; - g2 += (frames[i + 8 + 6] - g2) * t; - b2 += (frames[i + 8 + 7] - b2) * t; - break; - case 1: - r = frames[i + 1]; - g = frames[i + 2]; - b = frames[i + 3]; - a = frames[i + 4]; - r2 = frames[i + 5]; - g2 = frames[i + 6]; - b2 = frames[i + 7]; - break; - default: - r = this.getBezierValue(time, i, 1, curveType - 2); - g = this.getBezierValue(time, i, 2, curveType + 18 - 2); - b = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); - a = this.getBezierValue(time, i, 4, curveType + 18 * 3 - 2); - r2 = this.getBezierValue(time, i, 5, curveType + 18 * 4 - 2); - g2 = this.getBezierValue(time, i, 6, curveType + 18 * 5 - 2); - b2 = this.getBezierValue(time, i, 7, curveType + 18 * 6 - 2); - } - if (alpha == 1) { - light.set(r, g, b, a); - dark.r = r2; - dark.g = g2; - dark.b = b2; - } else { - if (blend == 0) { - light.setFromColor(slot.data.color); - let setupDark = slot.data.darkColor; - dark.r = setupDark.r; - dark.g = setupDark.g; - dark.b = setupDark.b; - } - light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha); - dark.r += (r2 - dark.r) * alpha; - dark.g += (g2 - dark.g) * alpha; - dark.b += (b2 - dark.b) * alpha; - } - } - }; - var RGB2Timeline = class extends CurveTimeline { - constructor(frameCount, bezierCount, slotIndex) { - super(frameCount, bezierCount, [ - Property.rgb + "|" + slotIndex, - Property.rgb2 + "|" + slotIndex - ]); - this.slotIndex = 0; - this.slotIndex = slotIndex; - } - getFrameEntries() { - return 7; - } - setFrame(frame, time, r, g, b, r2, g2, b2) { - frame *= 7; - this.frames[frame] = time; - this.frames[frame + 1] = r; - this.frames[frame + 2] = g; - this.frames[frame + 3] = b; - this.frames[frame + 4] = r2; - this.frames[frame + 5] = g2; - this.frames[frame + 6] = b2; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - let frames = this.frames; - let light = slot.color, dark = slot.darkColor; - if (time < frames[0]) { - let setupLight = slot.data.color, setupDark = slot.data.darkColor; - switch (blend) { - case 0: - light.r = setupLight.r; - light.g = setupLight.g; - light.b = setupLight.b; - dark.r = setupDark.r; - dark.g = setupDark.g; - dark.b = setupDark.b; - return; - case 1: - light.r += (setupLight.r - light.r) * alpha; - light.g += (setupLight.g - light.g) * alpha; - light.b += (setupLight.b - light.b) * alpha; - dark.r += (setupDark.r - dark.r) * alpha; - dark.g += (setupDark.g - dark.g) * alpha; - dark.b += (setupDark.b - dark.b) * alpha; - } - return; - } - let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0; - let i = Timeline.search(frames, time, 7); - let curveType = this.curves[i / 7]; - switch (curveType) { - case 0: - let before = frames[i]; - r = frames[i + 1]; - g = frames[i + 2]; - b = frames[i + 3]; - r2 = frames[i + 4]; - g2 = frames[i + 5]; - b2 = frames[i + 6]; - let t = (time - before) / (frames[i + 7] - before); - r += (frames[i + 7 + 1] - r) * t; - g += (frames[i + 7 + 2] - g) * t; - b += (frames[i + 7 + 3] - b) * t; - r2 += (frames[i + 7 + 4] - r2) * t; - g2 += (frames[i + 7 + 5] - g2) * t; - b2 += (frames[i + 7 + 6] - b2) * t; - break; - case 1: - r = frames[i + 1]; - g = frames[i + 2]; - b = frames[i + 3]; - r2 = frames[i + 4]; - g2 = frames[i + 5]; - b2 = frames[i + 6]; - break; - default: - r = this.getBezierValue(time, i, 1, curveType - 2); - g = this.getBezierValue(time, i, 2, curveType + 18 - 2); - b = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); - r2 = this.getBezierValue(time, i, 4, curveType + 18 * 3 - 2); - g2 = this.getBezierValue(time, i, 5, curveType + 18 * 4 - 2); - b2 = this.getBezierValue(time, i, 6, curveType + 18 * 5 - 2); - } - if (alpha == 1) { - light.r = r; - light.g = g; - light.b = b; - dark.r = r2; - dark.g = g2; - dark.b = b2; - } else { - if (blend == 0) { - let setupLight = slot.data.color, setupDark = slot.data.darkColor; - light.r = setupLight.r; - light.g = setupLight.g; - light.b = setupLight.b; - dark.r = setupDark.r; - dark.g = setupDark.g; - dark.b = setupDark.b; - } - light.r += (r - light.r) * alpha; - light.g += (g - light.g) * alpha; - light.b += (b - light.b) * alpha; - dark.r += (r2 - dark.r) * alpha; - dark.g += (g2 - dark.g) * alpha; - dark.b += (b2 - dark.b) * alpha; - } - } - }; - var AttachmentTimeline = class extends Timeline { - constructor(frameCount, slotIndex) { - super(frameCount, [ - Property.attachment + "|" + slotIndex - ]); - this.slotIndex = 0; - this.slotIndex = slotIndex; - this.attachmentNames = new Array(frameCount); - } - getFrameCount() { - return this.frames.length; - } - setFrame(frame, time, attachmentName) { - this.frames[frame] = time; - this.attachmentNames[frame] = attachmentName; - } - apply(skeleton, lastTime, time, events, alpha, blend, direction) { - let slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - if (direction == 1) { - if (blend == 0) - this.setAttachment(skeleton, slot, slot.data.attachmentName); - return; - } - if (time < this.frames[0]) { - if (blend == 0 || blend == 1) - this.setAttachment(skeleton, slot, slot.data.attachmentName); - return; - } - this.setAttachment(skeleton, slot, this.attachmentNames[Timeline.search1(this.frames, time)]); - } - setAttachment(skeleton, slot, attachmentName) { - slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName)); - } - }; - var DeformTimeline = class extends CurveTimeline { - constructor(frameCount, bezierCount, slotIndex, attachment) { - super(frameCount, bezierCount, [ - Property.deform + "|" + slotIndex + "|" + attachment.id - ]); - this.slotIndex = 0; - this.slotIndex = slotIndex; - this.attachment = attachment; - this.vertices = new Array(frameCount); - } - getFrameCount() { - return this.frames.length; - } - setFrame(frame, time, vertices) { - this.frames[frame] = time; - this.vertices[frame] = vertices; - } - setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) { - let curves = this.curves; - let i = this.getFrameCount() + bezier * 18; - if (value == 0) - curves[frame] = 2 + i; - let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06; - let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 6e-3, dddy = (cy1 - cy2 + 0.33333333) * 0.018; - let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy; - let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = cy1 * 0.3 + tmpy + dddy * 0.16666667; - let x = time1 + dx, y = dy; - for (let n = i + 18; i < n; i += 2) { - curves[i] = x; - curves[i + 1] = y; - dx += ddx; - dy += ddy; - ddx += dddx; - ddy += dddy; - x += dx; - y += dy; - } - } - getCurvePercent(time, frame) { - let curves = this.curves; - let i = curves[frame]; - switch (i) { - case 0: - let x2 = this.frames[frame]; - return (time - x2) / (this.frames[frame + this.getFrameEntries()] - x2); - case 1: - return 0; - } - i -= 2; - if (curves[i] > time) { - let x2 = this.frames[frame]; - return curves[i + 1] * (time - x2) / (curves[i] - x2); - } - let n = i + 18; - for (i += 2; i < n; i += 2) { - if (curves[i] >= time) { - let x2 = curves[i - 2], y2 = curves[i - 1]; - return y2 + (time - x2) / (curves[i] - x2) * (curves[i + 1] - y2); - } - } - let x = curves[n - 2], y = curves[n - 1]; - return y + (1 - y) * (time - x) / (this.frames[frame + this.getFrameEntries()] - x); - } - apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - let slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - let slotAttachment = slot.getAttachment(); - if (!(slotAttachment instanceof VertexAttachment) || slotAttachment.deformAttachment != this.attachment) - return; - let deform = slot.deform; - if (deform.length == 0) - blend = 0; - let vertices = this.vertices; - let vertexCount = vertices[0].length; - let frames = this.frames; - if (time < frames[0]) { - let vertexAttachment = slotAttachment; - switch (blend) { - case 0: - deform.length = 0; - return; - case 1: - if (alpha == 1) { - deform.length = 0; - return; - } - deform.length = vertexCount; - if (!vertexAttachment.bones) { - let setupVertices = vertexAttachment.vertices; - for (var i = 0; i < vertexCount; i++) - deform[i] += (setupVertices[i] - deform[i]) * alpha; - } else { - alpha = 1 - alpha; - for (var i = 0; i < vertexCount; i++) - deform[i] *= alpha; - } - } - return; - } - deform.length = vertexCount; - if (time >= frames[frames.length - 1]) { - let lastVertices = vertices[frames.length - 1]; - if (alpha == 1) { - if (blend == 3) { - let vertexAttachment = slotAttachment; - if (!vertexAttachment.bones) { - let setupVertices = vertexAttachment.vertices; - for (let i2 = 0; i2 < vertexCount; i2++) - deform[i2] += lastVertices[i2] - setupVertices[i2]; - } else { - for (let i2 = 0; i2 < vertexCount; i2++) - deform[i2] += lastVertices[i2]; - } - } else - Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount); - } else { - switch (blend) { - case 0: { - let vertexAttachment2 = slotAttachment; - if (!vertexAttachment2.bones) { - let setupVertices = vertexAttachment2.vertices; - for (let i2 = 0; i2 < vertexCount; i2++) { - let setup = setupVertices[i2]; - deform[i2] = setup + (lastVertices[i2] - setup) * alpha; - } - } else { - for (let i2 = 0; i2 < vertexCount; i2++) - deform[i2] = lastVertices[i2] * alpha; - } - break; - } - case 1: - case 2: - for (let i2 = 0; i2 < vertexCount; i2++) - deform[i2] += (lastVertices[i2] - deform[i2]) * alpha; - break; - case 3: - let vertexAttachment = slotAttachment; - if (!vertexAttachment.bones) { - let setupVertices = vertexAttachment.vertices; - for (let i2 = 0; i2 < vertexCount; i2++) - deform[i2] += (lastVertices[i2] - setupVertices[i2]) * alpha; - } else { - for (let i2 = 0; i2 < vertexCount; i2++) - deform[i2] += lastVertices[i2] * alpha; - } - } - } - return; - } - let frame = Timeline.search1(frames, time); - let percent = this.getCurvePercent(time, frame); - let prevVertices = vertices[frame]; - let nextVertices = vertices[frame + 1]; - if (alpha == 1) { - if (blend == 3) { - let vertexAttachment = slotAttachment; - if (!vertexAttachment.bones) { - let setupVertices = vertexAttachment.vertices; - for (let i2 = 0; i2 < vertexCount; i2++) { - let prev = prevVertices[i2]; - deform[i2] += prev + (nextVertices[i2] - prev) * percent - setupVertices[i2]; - } - } else { - for (let i2 = 0; i2 < vertexCount; i2++) { - let prev = prevVertices[i2]; - deform[i2] += prev + (nextVertices[i2] - prev) * percent; - } - } - } else { - for (let i2 = 0; i2 < vertexCount; i2++) { - let prev = prevVertices[i2]; - deform[i2] = prev + (nextVertices[i2] - prev) * percent; - } - } - } else { - switch (blend) { - case 0: { - let vertexAttachment2 = slotAttachment; - if (!vertexAttachment2.bones) { - let setupVertices = vertexAttachment2.vertices; - for (let i2 = 0; i2 < vertexCount; i2++) { - let prev = prevVertices[i2], setup = setupVertices[i2]; - deform[i2] = setup + (prev + (nextVertices[i2] - prev) * percent - setup) * alpha; - } - } else { - for (let i2 = 0; i2 < vertexCount; i2++) { - let prev = prevVertices[i2]; - deform[i2] = (prev + (nextVertices[i2] - prev) * percent) * alpha; - } - } - break; - } - case 1: - case 2: - for (let i2 = 0; i2 < vertexCount; i2++) { - let prev = prevVertices[i2]; - deform[i2] += (prev + (nextVertices[i2] - prev) * percent - deform[i2]) * alpha; - } - break; - case 3: - let vertexAttachment = slotAttachment; - if (!vertexAttachment.bones) { - let setupVertices = vertexAttachment.vertices; - for (let i2 = 0; i2 < vertexCount; i2++) { - let prev = prevVertices[i2]; - deform[i2] += (prev + (nextVertices[i2] - prev) * percent - setupVertices[i2]) * alpha; - } - } else { - for (let i2 = 0; i2 < vertexCount; i2++) { - let prev = prevVertices[i2]; - deform[i2] += (prev + (nextVertices[i2] - prev) * percent) * alpha; - } - } - } - } - } - }; - var _EventTimeline = class extends Timeline { - constructor(frameCount) { - super(frameCount, _EventTimeline.propertyIds); - this.events = new Array(frameCount); - } - getFrameCount() { - return this.frames.length; - } - setFrame(frame, event) { - this.frames[frame] = event.time; - this.events[frame] = event; - } - apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - if (!firedEvents) - return; - let frames = this.frames; - let frameCount = this.frames.length; - if (lastTime > time) { - this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction); - lastTime = -1; - } else if (lastTime >= frames[frameCount - 1]) - return; - if (time < frames[0]) - return; - let i = 0; - if (lastTime < frames[0]) - i = 0; - else { - i = Timeline.search1(frames, lastTime) + 1; - let frameTime = frames[i]; - while (i > 0) { - if (frames[i - 1] != frameTime) - break; - i--; - } - } - for (; i < frameCount && time >= frames[i]; i++) - firedEvents.push(this.events[i]); - } - }; - var EventTimeline = _EventTimeline; - EventTimeline.propertyIds = ["" + Property.event]; - var _DrawOrderTimeline = class extends Timeline { - constructor(frameCount) { - super(frameCount, _DrawOrderTimeline.propertyIds); - this.drawOrders = new Array(frameCount); - } - getFrameCount() { - return this.frames.length; - } - setFrame(frame, time, drawOrder) { - this.frames[frame] = time; - this.drawOrders[frame] = drawOrder; - } - apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - if (direction == 1) { - if (blend == 0) - Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); - return; - } - if (time < this.frames[0]) { - if (blend == 0 || blend == 1) - Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); - return; - } - let drawOrderToSetupIndex = this.drawOrders[Timeline.search1(this.frames, time)]; - if (!drawOrderToSetupIndex) - Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); - else { - let drawOrder = skeleton.drawOrder; - let slots = skeleton.slots; - for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++) - drawOrder[i] = slots[drawOrderToSetupIndex[i]]; - } - } - }; - var DrawOrderTimeline = _DrawOrderTimeline; - DrawOrderTimeline.propertyIds = ["" + Property.drawOrder]; - var IkConstraintTimeline = class extends CurveTimeline { - constructor(frameCount, bezierCount, ikConstraintIndex) { - super(frameCount, bezierCount, [ - Property.ikConstraint + "|" + ikConstraintIndex - ]); - this.ikConstraintIndex = ikConstraintIndex; - } - getFrameEntries() { - return 6; - } - setFrame(frame, time, mix, softness, bendDirection, compress, stretch) { - frame *= 6; - this.frames[frame] = time; - this.frames[frame + 1] = mix; - this.frames[frame + 2] = softness; - this.frames[frame + 3] = bendDirection; - this.frames[frame + 4] = compress ? 1 : 0; - this.frames[frame + 5] = stretch ? 1 : 0; - } - apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - let constraint = skeleton.ikConstraints[this.ikConstraintIndex]; - if (!constraint.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - constraint.mix = constraint.data.mix; - constraint.softness = constraint.data.softness; - constraint.bendDirection = constraint.data.bendDirection; - constraint.compress = constraint.data.compress; - constraint.stretch = constraint.data.stretch; - return; - case 1: - constraint.mix += (constraint.data.mix - constraint.mix) * alpha; - constraint.softness += (constraint.data.softness - constraint.softness) * alpha; - constraint.bendDirection = constraint.data.bendDirection; - constraint.compress = constraint.data.compress; - constraint.stretch = constraint.data.stretch; - } - return; - } - let mix = 0, softness = 0; - let i = Timeline.search(frames, time, 6); - let curveType = this.curves[i / 6]; - switch (curveType) { - case 0: - let before = frames[i]; - mix = frames[i + 1]; - softness = frames[i + 2]; - let t = (time - before) / (frames[i + 6] - before); - mix += (frames[i + 6 + 1] - mix) * t; - softness += (frames[i + 6 + 2] - softness) * t; - break; - case 1: - mix = frames[i + 1]; - softness = frames[i + 2]; - break; - default: - mix = this.getBezierValue(time, i, 1, curveType - 2); - softness = this.getBezierValue(time, i, 2, curveType + 18 - 2); - } - if (blend == 0) { - constraint.mix = constraint.data.mix + (mix - constraint.data.mix) * alpha; - constraint.softness = constraint.data.softness + (softness - constraint.data.softness) * alpha; - if (direction == 1) { - constraint.bendDirection = constraint.data.bendDirection; - constraint.compress = constraint.data.compress; - constraint.stretch = constraint.data.stretch; - } else { - constraint.bendDirection = frames[i + 3]; - constraint.compress = frames[i + 4] != 0; - constraint.stretch = frames[i + 5] != 0; - } - } else { - constraint.mix += (mix - constraint.mix) * alpha; - constraint.softness += (softness - constraint.softness) * alpha; - if (direction == 0) { - constraint.bendDirection = frames[i + 3]; - constraint.compress = frames[i + 4] != 0; - constraint.stretch = frames[i + 5] != 0; - } - } - } - }; - var TransformConstraintTimeline = class extends CurveTimeline { - constructor(frameCount, bezierCount, transformConstraintIndex) { - super(frameCount, bezierCount, [ - Property.transformConstraint + "|" + transformConstraintIndex - ]); - this.transformConstraintIndex = transformConstraintIndex; - } - getFrameEntries() { - return 7; - } - setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY) { - let frames = this.frames; - frame *= 7; - frames[frame] = time; - frames[frame + 1] = mixRotate; - frames[frame + 2] = mixX; - frames[frame + 3] = mixY; - frames[frame + 4] = mixScaleX; - frames[frame + 5] = mixScaleY; - frames[frame + 6] = mixShearY; - } - apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - let constraint = skeleton.transformConstraints[this.transformConstraintIndex]; - if (!constraint.active) - return; - let frames = this.frames; - if (time < frames[0]) { - let data = constraint.data; - switch (blend) { - case 0: - constraint.mixRotate = data.mixRotate; - constraint.mixX = data.mixX; - constraint.mixY = data.mixY; - constraint.mixScaleX = data.mixScaleX; - constraint.mixScaleY = data.mixScaleY; - constraint.mixShearY = data.mixShearY; - return; - case 1: - constraint.mixRotate += (data.mixRotate - constraint.mixRotate) * alpha; - constraint.mixX += (data.mixX - constraint.mixX) * alpha; - constraint.mixY += (data.mixY - constraint.mixY) * alpha; - constraint.mixScaleX += (data.mixScaleX - constraint.mixScaleX) * alpha; - constraint.mixScaleY += (data.mixScaleY - constraint.mixScaleY) * alpha; - constraint.mixShearY += (data.mixShearY - constraint.mixShearY) * alpha; - } - return; - } - let rotate, x, y, scaleX, scaleY, shearY; - let i = Timeline.search(frames, time, 7); - let curveType = this.curves[i / 7]; - switch (curveType) { - case 0: - let before = frames[i]; - rotate = frames[i + 1]; - x = frames[i + 2]; - y = frames[i + 3]; - scaleX = frames[i + 4]; - scaleY = frames[i + 5]; - shearY = frames[i + 6]; - let t = (time - before) / (frames[i + 7] - before); - rotate += (frames[i + 7 + 1] - rotate) * t; - x += (frames[i + 7 + 2] - x) * t; - y += (frames[i + 7 + 3] - y) * t; - scaleX += (frames[i + 7 + 4] - scaleX) * t; - scaleY += (frames[i + 7 + 5] - scaleY) * t; - shearY += (frames[i + 7 + 6] - shearY) * t; - break; - case 1: - rotate = frames[i + 1]; - x = frames[i + 2]; - y = frames[i + 3]; - scaleX = frames[i + 4]; - scaleY = frames[i + 5]; - shearY = frames[i + 6]; - break; - default: - rotate = this.getBezierValue(time, i, 1, curveType - 2); - x = this.getBezierValue(time, i, 2, curveType + 18 - 2); - y = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); - scaleX = this.getBezierValue(time, i, 4, curveType + 18 * 3 - 2); - scaleY = this.getBezierValue(time, i, 5, curveType + 18 * 4 - 2); - shearY = this.getBezierValue(time, i, 6, curveType + 18 * 5 - 2); - } - if (blend == 0) { - let data = constraint.data; - constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha; - constraint.mixX = data.mixX + (x - data.mixX) * alpha; - constraint.mixY = data.mixY + (y - data.mixY) * alpha; - constraint.mixScaleX = data.mixScaleX + (scaleX - data.mixScaleX) * alpha; - constraint.mixScaleY = data.mixScaleY + (scaleY - data.mixScaleY) * alpha; - constraint.mixShearY = data.mixShearY + (shearY - data.mixShearY) * alpha; - } else { - constraint.mixRotate += (rotate - constraint.mixRotate) * alpha; - constraint.mixX += (x - constraint.mixX) * alpha; - constraint.mixY += (y - constraint.mixY) * alpha; - constraint.mixScaleX += (scaleX - constraint.mixScaleX) * alpha; - constraint.mixScaleY += (scaleY - constraint.mixScaleY) * alpha; - constraint.mixShearY += (shearY - constraint.mixShearY) * alpha; - } - } - }; - var PathConstraintPositionTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, pathConstraintIndex) { - super(frameCount, bezierCount, Property.pathConstraintPosition + "|" + pathConstraintIndex); - this.pathConstraintIndex = pathConstraintIndex; - } - apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - let constraint = skeleton.pathConstraints[this.pathConstraintIndex]; - if (!constraint.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - constraint.position = constraint.data.position; - return; - case 1: - constraint.position += (constraint.data.position - constraint.position) * alpha; - } - return; - } - let position = this.getCurveValue(time); - if (blend == 0) - constraint.position = constraint.data.position + (position - constraint.data.position) * alpha; - else - constraint.position += (position - constraint.position) * alpha; - } - }; - var PathConstraintSpacingTimeline = class extends CurveTimeline1 { - constructor(frameCount, bezierCount, pathConstraintIndex) { - super(frameCount, bezierCount, Property.pathConstraintSpacing + "|" + pathConstraintIndex); - this.pathConstraintIndex = 0; - this.pathConstraintIndex = pathConstraintIndex; - } - apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - let constraint = skeleton.pathConstraints[this.pathConstraintIndex]; - if (!constraint.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - constraint.spacing = constraint.data.spacing; - return; - case 1: - constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha; - } - return; - } - let spacing = this.getCurveValue(time); - if (blend == 0) - constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha; - else - constraint.spacing += (spacing - constraint.spacing) * alpha; - } - }; - var PathConstraintMixTimeline = class extends CurveTimeline { - constructor(frameCount, bezierCount, pathConstraintIndex) { - super(frameCount, bezierCount, [ - Property.pathConstraintMix + "|" + pathConstraintIndex - ]); - this.pathConstraintIndex = 0; - this.pathConstraintIndex = pathConstraintIndex; - } - getFrameEntries() { - return 4; - } - setFrame(frame, time, mixRotate, mixX, mixY) { - let frames = this.frames; - frame <<= 2; - frames[frame] = time; - frames[frame + 1] = mixRotate; - frames[frame + 2] = mixX; - frames[frame + 3] = mixY; - } - apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - let constraint = skeleton.pathConstraints[this.pathConstraintIndex]; - if (!constraint.active) - return; - let frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case 0: - constraint.mixRotate = constraint.data.mixRotate; - constraint.mixX = constraint.data.mixX; - constraint.mixY = constraint.data.mixY; - return; - case 1: - constraint.mixRotate += (constraint.data.mixRotate - constraint.mixRotate) * alpha; - constraint.mixX += (constraint.data.mixX - constraint.mixX) * alpha; - constraint.mixY += (constraint.data.mixY - constraint.mixY) * alpha; - } - return; - } - let rotate, x, y; - let i = Timeline.search(frames, time, 4); - let curveType = this.curves[i >> 2]; - switch (curveType) { - case 0: - let before = frames[i]; - rotate = frames[i + 1]; - x = frames[i + 2]; - y = frames[i + 3]; - let t = (time - before) / (frames[i + 4] - before); - rotate += (frames[i + 4 + 1] - rotate) * t; - x += (frames[i + 4 + 2] - x) * t; - y += (frames[i + 4 + 3] - y) * t; - break; - case 1: - rotate = frames[i + 1]; - x = frames[i + 2]; - y = frames[i + 3]; - break; - default: - rotate = this.getBezierValue(time, i, 1, curveType - 2); - x = this.getBezierValue(time, i, 2, curveType + 18 - 2); - y = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); - } - if (blend == 0) { - let data = constraint.data; - constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha; - constraint.mixX = data.mixX + (x - data.mixX) * alpha; - constraint.mixY = data.mixY + (y - data.mixY) * alpha; - } else { - constraint.mixRotate += (rotate - constraint.mixRotate) * alpha; - constraint.mixX += (x - constraint.mixX) * alpha; - constraint.mixY += (y - constraint.mixY) * alpha; - } - } - }; - - // spine-core/src/AnimationState.ts - var AnimationState = class { - constructor(data) { - this.tracks = new Array(); - this.timeScale = 1; - this.unkeyedState = 0; - this.events = new Array(); - this.listeners = new Array(); - this.queue = new EventQueue(this); - this.propertyIDs = new StringSet(); - this.animationsChanged = false; - this.trackEntryPool = new Pool(() => new TrackEntry()); - this.data = data; - } - static emptyAnimation() { - if (!_emptyAnimation) - _emptyAnimation = new Animation("", [], 0); - return _emptyAnimation; - } - update(delta) { - delta *= this.timeScale; - let tracks = this.tracks; - for (let i = 0, n = tracks.length; i < n; i++) { - let current = tracks[i]; - if (!current) - continue; - current.animationLast = current.nextAnimationLast; - current.trackLast = current.nextTrackLast; - let currentDelta = delta * current.timeScale; - if (current.delay > 0) { - current.delay -= currentDelta; - if (current.delay > 0) - continue; - currentDelta = -current.delay; - current.delay = 0; - } - let next = current.next; - if (next) { - let nextTime = current.trackLast - next.delay; - if (nextTime >= 0) { - next.delay = 0; - next.trackTime += current.timeScale == 0 ? 0 : (nextTime / current.timeScale + delta) * next.timeScale; - current.trackTime += currentDelta; - this.setCurrent(i, next, true); - while (next.mixingFrom) { - next.mixTime += delta; - next = next.mixingFrom; - } - continue; - } - } else if (current.trackLast >= current.trackEnd && !current.mixingFrom) { - tracks[i] = null; - this.queue.end(current); - this.clearNext(current); - continue; - } - if (current.mixingFrom && this.updateMixingFrom(current, delta)) { - let from = current.mixingFrom; - current.mixingFrom = null; - if (from) - from.mixingTo = null; - while (from) { - this.queue.end(from); - from = from.mixingFrom; - } - } - current.trackTime += currentDelta; - } - this.queue.drain(); - } - updateMixingFrom(to, delta) { - let from = to.mixingFrom; - if (!from) - return true; - let finished = this.updateMixingFrom(from, delta); - from.animationLast = from.nextAnimationLast; - from.trackLast = from.nextTrackLast; - if (to.mixTime > 0 && to.mixTime >= to.mixDuration) { - if (from.totalAlpha == 0 || to.mixDuration == 0) { - to.mixingFrom = from.mixingFrom; - if (from.mixingFrom) - from.mixingFrom.mixingTo = to; - to.interruptAlpha = from.interruptAlpha; - this.queue.end(from); - } - return finished; - } - from.trackTime += delta * from.timeScale; - to.mixTime += delta; - return false; - } - apply(skeleton) { - if (!skeleton) - throw new Error("skeleton cannot be null."); - if (this.animationsChanged) - this._animationsChanged(); - let events = this.events; - let tracks = this.tracks; - let applied = false; - for (let i2 = 0, n2 = tracks.length; i2 < n2; i2++) { - let current = tracks[i2]; - if (!current || current.delay > 0) - continue; - applied = true; - let blend = i2 == 0 ? MixBlend.first : current.mixBlend; - let mix = current.alpha; - if (current.mixingFrom) - mix *= this.applyMixingFrom(current, skeleton, blend); - else if (current.trackTime >= current.trackEnd && !current.next) - mix = 0; - let animationLast = current.animationLast, animationTime = current.getAnimationTime(), applyTime = animationTime; - let applyEvents = events; - if (current.reverse) { - applyTime = current.animation.duration - applyTime; - applyEvents = null; - } - let timelines = current.animation.timelines; - let timelineCount = timelines.length; - if (i2 == 0 && mix == 1 || blend == MixBlend.add) { - for (let ii = 0; ii < timelineCount; ii++) { - Utils.webkit602BugfixHelper(mix, blend); - var timeline = timelines[ii]; - if (timeline instanceof AttachmentTimeline) - this.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true); - else - timeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, blend, MixDirection.mixIn); - } - } else { - let timelineMode = current.timelineMode; - let firstFrame = current.timelinesRotation.length != timelineCount << 1; - if (firstFrame) - current.timelinesRotation.length = timelineCount << 1; - for (let ii = 0; ii < timelineCount; ii++) { - let timeline2 = timelines[ii]; - let timelineBlend = timelineMode[ii] == SUBSEQUENT ? blend : MixBlend.setup; - if (timeline2 instanceof RotateTimeline) { - this.applyRotateTimeline(timeline2, skeleton, applyTime, mix, timelineBlend, current.timelinesRotation, ii << 1, firstFrame); - } else if (timeline2 instanceof AttachmentTimeline) { - this.applyAttachmentTimeline(timeline2, skeleton, applyTime, blend, true); - } else { - Utils.webkit602BugfixHelper(mix, blend); - timeline2.apply(skeleton, animationLast, applyTime, applyEvents, mix, timelineBlend, MixDirection.mixIn); - } - } - } - this.queueEvents(current, animationTime); - events.length = 0; - current.nextAnimationLast = animationTime; - current.nextTrackLast = current.trackTime; - } - var setupState = this.unkeyedState + SETUP; - var slots = skeleton.slots; - for (var i = 0, n = skeleton.slots.length; i < n; i++) { - var slot = slots[i]; - if (slot.attachmentState == setupState) { - var attachmentName = slot.data.attachmentName; - slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(slot.data.index, attachmentName)); - } - } - this.unkeyedState += 2; - this.queue.drain(); - return applied; - } - applyMixingFrom(to, skeleton, blend) { - let from = to.mixingFrom; - if (from.mixingFrom) - this.applyMixingFrom(from, skeleton, blend); - let mix = 0; - if (to.mixDuration == 0) { - mix = 1; - if (blend == MixBlend.first) - blend = MixBlend.setup; - } else { - mix = to.mixTime / to.mixDuration; - if (mix > 1) - mix = 1; - if (blend != MixBlend.first) - blend = from.mixBlend; - } - let attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold; - let timelines = from.animation.timelines; - let timelineCount = timelines.length; - let alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix); - let animationLast = from.animationLast, animationTime = from.getAnimationTime(), applyTime = animationTime; - let events = null; - if (from.reverse) - applyTime = from.animation.duration - applyTime; - else if (mix < from.eventThreshold) - events = this.events; - if (blend == MixBlend.add) { - for (let i = 0; i < timelineCount; i++) - timelines[i].apply(skeleton, animationLast, applyTime, events, alphaMix, blend, MixDirection.mixOut); - } else { - let timelineMode = from.timelineMode; - let timelineHoldMix = from.timelineHoldMix; - let firstFrame = from.timelinesRotation.length != timelineCount << 1; - if (firstFrame) - from.timelinesRotation.length = timelineCount << 1; - from.totalAlpha = 0; - for (let i = 0; i < timelineCount; i++) { - let timeline = timelines[i]; - let direction = MixDirection.mixOut; - let timelineBlend; - let alpha = 0; - switch (timelineMode[i]) { - case SUBSEQUENT: - if (!drawOrder && timeline instanceof DrawOrderTimeline) - continue; - timelineBlend = blend; - alpha = alphaMix; - break; - case FIRST: - timelineBlend = MixBlend.setup; - alpha = alphaMix; - break; - case HOLD_SUBSEQUENT: - timelineBlend = blend; - alpha = alphaHold; - break; - case HOLD_FIRST: - timelineBlend = MixBlend.setup; - alpha = alphaHold; - break; - default: - timelineBlend = MixBlend.setup; - let holdMix = timelineHoldMix[i]; - alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration); - break; - } - from.totalAlpha += alpha; - if (timeline instanceof RotateTimeline) - this.applyRotateTimeline(timeline, skeleton, applyTime, alpha, timelineBlend, from.timelinesRotation, i << 1, firstFrame); - else if (timeline instanceof AttachmentTimeline) - this.applyAttachmentTimeline(timeline, skeleton, applyTime, timelineBlend, attachments); - else { - Utils.webkit602BugfixHelper(alpha, blend); - if (drawOrder && timeline instanceof DrawOrderTimeline && timelineBlend == MixBlend.setup) - direction = MixDirection.mixIn; - timeline.apply(skeleton, animationLast, applyTime, events, alpha, timelineBlend, direction); - } - } - } - if (to.mixDuration > 0) - this.queueEvents(from, animationTime); - this.events.length = 0; - from.nextAnimationLast = animationTime; - from.nextTrackLast = from.trackTime; - return mix; - } - applyAttachmentTimeline(timeline, skeleton, time, blend, attachments) { - var slot = skeleton.slots[timeline.slotIndex]; - if (!slot.bone.active) - return; - if (time < timeline.frames[0]) { - if (blend == MixBlend.setup || blend == MixBlend.first) - this.setAttachment(skeleton, slot, slot.data.attachmentName, attachments); - } else - this.setAttachment(skeleton, slot, timeline.attachmentNames[Timeline.search1(timeline.frames, time)], attachments); - if (slot.attachmentState <= this.unkeyedState) - slot.attachmentState = this.unkeyedState + SETUP; - } - setAttachment(skeleton, slot, attachmentName, attachments) { - slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(slot.data.index, attachmentName)); - if (attachments) - slot.attachmentState = this.unkeyedState + CURRENT; - } - applyRotateTimeline(timeline, skeleton, time, alpha, blend, timelinesRotation, i, firstFrame) { - if (firstFrame) - timelinesRotation[i] = 0; - if (alpha == 1) { - timeline.apply(skeleton, 0, time, null, 1, blend, MixDirection.mixIn); - return; - } - let bone = skeleton.bones[timeline.boneIndex]; - if (!bone.active) - return; - let frames = timeline.frames; - let r1 = 0, r2 = 0; - if (time < frames[0]) { - switch (blend) { - case MixBlend.setup: - bone.rotation = bone.data.rotation; - default: - return; - case MixBlend.first: - r1 = bone.rotation; - r2 = bone.data.rotation; - } - } else { - r1 = blend == MixBlend.setup ? bone.data.rotation : bone.rotation; - r2 = bone.data.rotation + timeline.getCurveValue(time); - } - let total = 0, diff = r2 - r1; - diff -= (16384 - (16384.499999999996 - diff / 360 | 0)) * 360; - if (diff == 0) { - total = timelinesRotation[i]; - } else { - let lastTotal = 0, lastDiff = 0; - if (firstFrame) { - lastTotal = 0; - lastDiff = diff; - } else { - lastTotal = timelinesRotation[i]; - lastDiff = timelinesRotation[i + 1]; - } - let current = diff > 0, dir = lastTotal >= 0; - if (MathUtils.signum(lastDiff) != MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) { - if (Math.abs(lastTotal) > 180) - lastTotal += 360 * MathUtils.signum(lastTotal); - dir = current; - } - total = diff + lastTotal - lastTotal % 360; - if (dir != current) - total += 360 * MathUtils.signum(lastTotal); - timelinesRotation[i] = total; - } - timelinesRotation[i + 1] = diff; - bone.rotation = r1 + total * alpha; - } - queueEvents(entry, animationTime) { - let animationStart = entry.animationStart, animationEnd = entry.animationEnd; - let duration = animationEnd - animationStart; - let trackLastWrapped = entry.trackLast % duration; - let events = this.events; - let i = 0, n = events.length; - for (; i < n; i++) { - let event = events[i]; - if (event.time < trackLastWrapped) - break; - if (event.time > animationEnd) - continue; - this.queue.event(entry, event); - } - let complete = false; - if (entry.loop) - complete = duration == 0 || trackLastWrapped > entry.trackTime % duration; - else - complete = animationTime >= animationEnd && entry.animationLast < animationEnd; - if (complete) - this.queue.complete(entry); - for (; i < n; i++) { - let event = events[i]; - if (event.time < animationStart) - continue; - this.queue.event(entry, event); - } - } - clearTracks() { - let oldDrainDisabled = this.queue.drainDisabled; - this.queue.drainDisabled = true; - for (let i = 0, n = this.tracks.length; i < n; i++) - this.clearTrack(i); - this.tracks.length = 0; - this.queue.drainDisabled = oldDrainDisabled; - this.queue.drain(); - } - clearTrack(trackIndex) { - if (trackIndex >= this.tracks.length) - return; - let current = this.tracks[trackIndex]; - if (!current) - return; - this.queue.end(current); - this.clearNext(current); - let entry = current; - while (true) { - let from = entry.mixingFrom; - if (!from) - break; - this.queue.end(from); - entry.mixingFrom = null; - entry.mixingTo = null; - entry = from; - } - this.tracks[current.trackIndex] = null; - this.queue.drain(); - } - setCurrent(index, current, interrupt) { - let from = this.expandToIndex(index); - this.tracks[index] = current; - current.previous = null; - if (from) { - if (interrupt) - this.queue.interrupt(from); - current.mixingFrom = from; - from.mixingTo = current; - current.mixTime = 0; - if (from.mixingFrom && from.mixDuration > 0) - current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration); - from.timelinesRotation.length = 0; - } - this.queue.start(current); - } - setAnimation(trackIndex, animationName, loop = false) { - let animation = this.data.skeletonData.findAnimation(animationName); - if (!animation) - throw new Error("Animation not found: " + animationName); - return this.setAnimationWith(trackIndex, animation, loop); - } - setAnimationWith(trackIndex, animation, loop = false) { - if (!animation) - throw new Error("animation cannot be null."); - let interrupt = true; - let current = this.expandToIndex(trackIndex); - if (current) { - if (current.nextTrackLast == -1) { - this.tracks[trackIndex] = current.mixingFrom; - this.queue.interrupt(current); - this.queue.end(current); - this.clearNext(current); - current = current.mixingFrom; - interrupt = false; - } else - this.clearNext(current); - } - let entry = this.trackEntry(trackIndex, animation, loop, current); - this.setCurrent(trackIndex, entry, interrupt); - this.queue.drain(); - return entry; - } - addAnimation(trackIndex, animationName, loop = false, delay = 0) { - let animation = this.data.skeletonData.findAnimation(animationName); - if (!animation) - throw new Error("Animation not found: " + animationName); - return this.addAnimationWith(trackIndex, animation, loop, delay); - } - addAnimationWith(trackIndex, animation, loop = false, delay = 0) { - if (!animation) - throw new Error("animation cannot be null."); - let last = this.expandToIndex(trackIndex); - if (last) { - while (last.next) - last = last.next; - } - let entry = this.trackEntry(trackIndex, animation, loop, last); - if (!last) { - this.setCurrent(trackIndex, entry, true); - this.queue.drain(); - } else { - last.next = entry; - entry.previous = last; - if (delay <= 0) - delay += last.getTrackComplete() - entry.mixDuration; - } - entry.delay = delay; - return entry; - } - setEmptyAnimation(trackIndex, mixDuration = 0) { - let entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation(), false); - entry.mixDuration = mixDuration; - entry.trackEnd = mixDuration; - return entry; - } - addEmptyAnimation(trackIndex, mixDuration = 0, delay = 0) { - let entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation(), false, delay); - if (delay <= 0) - entry.delay += entry.mixDuration - mixDuration; - entry.mixDuration = mixDuration; - entry.trackEnd = mixDuration; - return entry; - } - setEmptyAnimations(mixDuration = 0) { - let oldDrainDisabled = this.queue.drainDisabled; - this.queue.drainDisabled = true; - for (let i = 0, n = this.tracks.length; i < n; i++) { - let current = this.tracks[i]; - if (current) - this.setEmptyAnimation(current.trackIndex, mixDuration); - } - this.queue.drainDisabled = oldDrainDisabled; - this.queue.drain(); - } - expandToIndex(index) { - if (index < this.tracks.length) - return this.tracks[index]; - Utils.ensureArrayCapacity(this.tracks, index + 1, null); - this.tracks.length = index + 1; - return null; - } - trackEntry(trackIndex, animation, loop, last) { - let entry = this.trackEntryPool.obtain(); - entry.trackIndex = trackIndex; - entry.animation = animation; - entry.loop = loop; - entry.holdPrevious = false; - entry.eventThreshold = 0; - entry.attachmentThreshold = 0; - entry.drawOrderThreshold = 0; - entry.animationStart = 0; - entry.animationEnd = animation.duration; - entry.animationLast = -1; - entry.nextAnimationLast = -1; - entry.delay = 0; - entry.trackTime = 0; - entry.trackLast = -1; - entry.nextTrackLast = -1; - entry.trackEnd = Number.MAX_VALUE; - entry.timeScale = 1; - entry.alpha = 1; - entry.interruptAlpha = 1; - entry.mixTime = 0; - entry.mixDuration = !last ? 0 : this.data.getMix(last.animation, animation); - entry.mixBlend = MixBlend.replace; - return entry; - } - clearNext(entry) { - let next = entry.next; - while (next) { - this.queue.dispose(next); - next = next.next; - } - entry.next = null; - } - _animationsChanged() { - this.animationsChanged = false; - this.propertyIDs.clear(); - let tracks = this.tracks; - for (let i = 0, n = tracks.length; i < n; i++) { - let entry = tracks[i]; - if (!entry) - continue; - while (entry.mixingFrom) - entry = entry.mixingFrom; - do { - if (!entry.mixingTo || entry.mixBlend != MixBlend.add) - this.computeHold(entry); - entry = entry.mixingTo; - } while (entry); - } - } - computeHold(entry) { - let to = entry.mixingTo; - let timelines = entry.animation.timelines; - let timelinesCount = entry.animation.timelines.length; - let timelineMode = entry.timelineMode; - timelineMode.length = timelinesCount; - let timelineHoldMix = entry.timelineHoldMix; - timelineHoldMix.length = 0; - let propertyIDs = this.propertyIDs; - if (to && to.holdPrevious) { - for (let i = 0; i < timelinesCount; i++) - timelineMode[i] = propertyIDs.addAll(timelines[i].getPropertyIds()) ? HOLD_FIRST : HOLD_SUBSEQUENT; - return; - } - outer: - for (let i = 0; i < timelinesCount; i++) { - let timeline = timelines[i]; - let ids = timeline.getPropertyIds(); - if (!propertyIDs.addAll(ids)) - timelineMode[i] = SUBSEQUENT; - else if (!to || timeline instanceof AttachmentTimeline || timeline instanceof DrawOrderTimeline || timeline instanceof EventTimeline || !to.animation.hasTimeline(ids)) { - timelineMode[i] = FIRST; - } else { - for (let next = to.mixingTo; next; next = next.mixingTo) { - if (next.animation.hasTimeline(ids)) - continue; - if (entry.mixDuration > 0) { - timelineMode[i] = HOLD_MIX; - timelineHoldMix[i] = next; - continue outer; - } - break; - } - timelineMode[i] = HOLD_FIRST; - } - } - } - getCurrent(trackIndex) { - if (trackIndex >= this.tracks.length) - return null; - return this.tracks[trackIndex]; - } - addListener(listener) { - if (!listener) - throw new Error("listener cannot be null."); - this.listeners.push(listener); - } - removeListener(listener) { - let index = this.listeners.indexOf(listener); - if (index >= 0) - this.listeners.splice(index, 1); - } - clearListeners() { - this.listeners.length = 0; - } - clearListenerNotifications() { - this.queue.clear(); - } - }; - var TrackEntry = class { - constructor() { - this.mixBlend = MixBlend.replace; - this.timelineMode = new Array(); - this.timelineHoldMix = new Array(); - this.timelinesRotation = new Array(); - } - reset() { - this.next = null; - this.previous = null; - this.mixingFrom = null; - this.mixingTo = null; - this.animation = null; - this.listener = null; - this.timelineMode.length = 0; - this.timelineHoldMix.length = 0; - this.timelinesRotation.length = 0; - } - getAnimationTime() { - if (this.loop) { - let duration = this.animationEnd - this.animationStart; - if (duration == 0) - return this.animationStart; - return this.trackTime % duration + this.animationStart; - } - return Math.min(this.trackTime + this.animationStart, this.animationEnd); - } - setAnimationLast(animationLast) { - this.animationLast = animationLast; - this.nextAnimationLast = animationLast; - } - isComplete() { - return this.trackTime >= this.animationEnd - this.animationStart; - } - resetRotationDirections() { - this.timelinesRotation.length = 0; - } - getTrackComplete() { - let duration = this.animationEnd - this.animationStart; - if (duration != 0) { - if (this.loop) - return duration * (1 + (this.trackTime / duration | 0)); - if (this.trackTime < duration) - return duration; - } - return this.trackTime; - } - }; - var EventQueue = class { - constructor(animState) { - this.objects = []; - this.drainDisabled = false; - this.animState = animState; - } - start(entry) { - this.objects.push(EventType.start); - this.objects.push(entry); - this.animState.animationsChanged = true; - } - interrupt(entry) { - this.objects.push(EventType.interrupt); - this.objects.push(entry); - } - end(entry) { - this.objects.push(EventType.end); - this.objects.push(entry); - this.animState.animationsChanged = true; - } - dispose(entry) { - this.objects.push(EventType.dispose); - this.objects.push(entry); - } - complete(entry) { - this.objects.push(EventType.complete); - this.objects.push(entry); - } - event(entry, event) { - this.objects.push(EventType.event); - this.objects.push(entry); - this.objects.push(event); - } - drain() { - if (this.drainDisabled) - return; - this.drainDisabled = true; - let objects = this.objects; - let listeners = this.animState.listeners; - for (let i = 0; i < objects.length; i += 2) { - let type = objects[i]; - let entry = objects[i + 1]; - switch (type) { - case EventType.start: - if (entry.listener && entry.listener.start) - entry.listener.start(entry); - for (let ii = 0; ii < listeners.length; ii++) - if (listeners[ii].start) - listeners[ii].start(entry); - break; - case EventType.interrupt: - if (entry.listener && entry.listener.interrupt) - entry.listener.interrupt(entry); - for (let ii = 0; ii < listeners.length; ii++) - if (listeners[ii].interrupt) - listeners[ii].interrupt(entry); - break; - case EventType.end: - if (entry.listener && entry.listener.end) - entry.listener.end(entry); - for (let ii = 0; ii < listeners.length; ii++) - if (listeners[ii].end) - listeners[ii].end(entry); - case EventType.dispose: - if (entry.listener && entry.listener.dispose) - entry.listener.dispose(entry); - for (let ii = 0; ii < listeners.length; ii++) - if (listeners[ii].dispose) - listeners[ii].dispose(entry); - this.animState.trackEntryPool.free(entry); - break; - case EventType.complete: - if (entry.listener && entry.listener.complete) - entry.listener.complete(entry); - for (let ii = 0; ii < listeners.length; ii++) - if (listeners[ii].complete) - listeners[ii].complete(entry); - break; - case EventType.event: - let event = objects[i++ + 2]; - if (entry.listener && entry.listener.event) - entry.listener.event(entry, event); - for (let ii = 0; ii < listeners.length; ii++) - if (listeners[ii].event) - listeners[ii].event(entry, event); - break; - } - } - this.clear(); - this.drainDisabled = false; - } - clear() { - this.objects.length = 0; - } - }; - var EventType; - (function(EventType2) { - EventType2[EventType2["start"] = 0] = "start"; - EventType2[EventType2["interrupt"] = 1] = "interrupt"; - EventType2[EventType2["end"] = 2] = "end"; - EventType2[EventType2["dispose"] = 3] = "dispose"; - EventType2[EventType2["complete"] = 4] = "complete"; - EventType2[EventType2["event"] = 5] = "event"; - })(EventType || (EventType = {})); - var AnimationStateAdapter = class { - start(entry) { - } - interrupt(entry) { - } - end(entry) { - } - dispose(entry) { - } - complete(entry) { - } - event(entry, event) { - } - }; - var SUBSEQUENT = 0; - var FIRST = 1; - var HOLD_SUBSEQUENT = 2; - var HOLD_FIRST = 3; - var HOLD_MIX = 4; - var SETUP = 1; - var CURRENT = 2; - var _emptyAnimation = null; - - // spine-core/src/AnimationStateData.ts - var AnimationStateData = class { - constructor(skeletonData) { - this.animationToMixTime = {}; - this.defaultMix = 0; - if (!skeletonData) - throw new Error("skeletonData cannot be null."); - this.skeletonData = skeletonData; - } - setMix(fromName, toName, duration) { - let from = this.skeletonData.findAnimation(fromName); - if (!from) - throw new Error("Animation not found: " + fromName); - let to = this.skeletonData.findAnimation(toName); - if (!to) - throw new Error("Animation not found: " + toName); - this.setMixWith(from, to, duration); - } - setMixWith(from, to, duration) { - if (!from) - throw new Error("from cannot be null."); - if (!to) - throw new Error("to cannot be null."); - let key = from.name + "." + to.name; - this.animationToMixTime[key] = duration; - } - getMix(from, to) { - let key = from.name + "." + to.name; - let value = this.animationToMixTime[key]; - return value === void 0 ? this.defaultMix : value; - } - }; - - // spine-core/src/attachments/BoundingBoxAttachment.ts - var BoundingBoxAttachment = class extends VertexAttachment { - constructor(name) { - super(name); - this.color = new Color(1, 1, 1, 1); - } - copy() { - let copy = new BoundingBoxAttachment(this.name); - this.copyTo(copy); - copy.color.setFromColor(this.color); - return copy; - } - }; - - // spine-core/src/attachments/ClippingAttachment.ts - var ClippingAttachment = class extends VertexAttachment { - constructor(name) { - super(name); - this.color = new Color(0.2275, 0.2275, 0.8078, 1); - } - copy() { - let copy = new ClippingAttachment(this.name); - this.copyTo(copy); - copy.endSlot = this.endSlot; - copy.color.setFromColor(this.color); - return copy; - } - }; - - // spine-core/src/Texture.ts - var Texture = class { - constructor(image) { - this._image = image; - } - getImage() { - return this._image; - } - }; - var TextureFilter; - (function(TextureFilter3) { - TextureFilter3[TextureFilter3["Nearest"] = 9728] = "Nearest"; - TextureFilter3[TextureFilter3["Linear"] = 9729] = "Linear"; - TextureFilter3[TextureFilter3["MipMap"] = 9987] = "MipMap"; - TextureFilter3[TextureFilter3["MipMapNearestNearest"] = 9984] = "MipMapNearestNearest"; - TextureFilter3[TextureFilter3["MipMapLinearNearest"] = 9985] = "MipMapLinearNearest"; - TextureFilter3[TextureFilter3["MipMapNearestLinear"] = 9986] = "MipMapNearestLinear"; - TextureFilter3[TextureFilter3["MipMapLinearLinear"] = 9987] = "MipMapLinearLinear"; - })(TextureFilter || (TextureFilter = {})); - var TextureWrap; - (function(TextureWrap3) { - TextureWrap3[TextureWrap3["MirroredRepeat"] = 33648] = "MirroredRepeat"; - TextureWrap3[TextureWrap3["ClampToEdge"] = 33071] = "ClampToEdge"; - TextureWrap3[TextureWrap3["Repeat"] = 10497] = "Repeat"; - })(TextureWrap || (TextureWrap = {})); - var TextureRegion = class { - constructor() { - this.u = 0; - this.v = 0; - this.u2 = 0; - this.v2 = 0; - this.width = 0; - this.height = 0; - this.degrees = 0; - this.offsetX = 0; - this.offsetY = 0; - this.originalWidth = 0; - this.originalHeight = 0; - } - }; - var FakeTexture = class extends Texture { - setFilters(minFilter, magFilter) { - } - setWraps(uWrap, vWrap) { - } - dispose() { - } - }; - - // spine-core/src/TextureAtlas.ts - var TextureAtlas = class { - constructor(atlasText) { - this.pages = new Array(); - this.regions = new Array(); - let reader = new TextureAtlasReader(atlasText); - let entry = new Array(4); - let page = null; - let region = null; - let pageFields = {}; - pageFields["size"] = () => { - page.width = parseInt(entry[1]); - page.height = parseInt(entry[2]); - }; - pageFields["format"] = () => { - }; - pageFields["filter"] = () => { - page.minFilter = Utils.enumValue(TextureFilter, entry[1]); - page.magFilter = Utils.enumValue(TextureFilter, entry[2]); - }; - pageFields["repeat"] = () => { - if (entry[1].indexOf("x") != -1) - page.uWrap = TextureWrap.Repeat; - if (entry[1].indexOf("y") != -1) - page.vWrap = TextureWrap.Repeat; - }; - pageFields["pma"] = () => { - page.pma = entry[1] == "true"; - }; - var regionFields = {}; - regionFields["xy"] = () => { - region.x = parseInt(entry[1]); - region.y = parseInt(entry[2]); - }; - regionFields["size"] = () => { - region.width = parseInt(entry[1]); - region.height = parseInt(entry[2]); - }; - regionFields["bounds"] = () => { - region.x = parseInt(entry[1]); - region.y = parseInt(entry[2]); - region.width = parseInt(entry[3]); - region.height = parseInt(entry[4]); - }; - regionFields["offset"] = () => { - region.offsetX = parseInt(entry[1]); - region.offsetY = parseInt(entry[2]); - }; - regionFields["orig"] = () => { - region.originalWidth = parseInt(entry[1]); - region.originalHeight = parseInt(entry[2]); - }; - regionFields["offsets"] = () => { - region.offsetX = parseInt(entry[1]); - region.offsetY = parseInt(entry[2]); - region.originalWidth = parseInt(entry[3]); - region.originalHeight = parseInt(entry[4]); - }; - regionFields["rotate"] = () => { - let value = entry[1]; - if (value == "true") - region.degrees = 90; - else if (value != "false") - region.degrees = parseInt(value); - }; - regionFields["index"] = () => { - region.index = parseInt(entry[1]); - }; - let line = reader.readLine(); - while (line && line.trim().length == 0) - line = reader.readLine(); - while (true) { - if (!line || line.trim().length == 0) - break; - if (reader.readEntry(entry, line) == 0) - break; - line = reader.readLine(); - } - let names = null; - let values = null; - while (true) { - if (line === null) - break; - if (line.trim().length == 0) { - page = null; - line = reader.readLine(); - } else if (!page) { - page = new TextureAtlasPage(); - page.name = line.trim(); - while (true) { - if (reader.readEntry(entry, line = reader.readLine()) == 0) - break; - let field = pageFields[entry[0]]; - if (field) - field(); - } - this.pages.push(page); - } else { - region = new TextureAtlasRegion(); - region.page = page; - region.name = line; - while (true) { - let count = reader.readEntry(entry, line = reader.readLine()); - if (count == 0) - break; - let field = regionFields[entry[0]]; - if (field) - field(); - else { - if (!names) { - names = []; - values = []; - } - names.push(entry[0]); - let entryValues = []; - for (let i = 0; i < count; i++) - entryValues.push(parseInt(entry[i + 1])); - values.push(entryValues); - } - } - if (region.originalWidth == 0 && region.originalHeight == 0) { - region.originalWidth = region.width; - region.originalHeight = region.height; - } - if (names && names.length > 0) { - region.names = names; - region.values = values; - names = null; - values = null; - } - region.u = region.x / page.width; - region.v = region.y / page.height; - if (region.degrees == 90) { - region.u2 = (region.x + region.height) / page.width; - region.v2 = (region.y + region.width) / page.height; - } else { - region.u2 = (region.x + region.width) / page.width; - region.v2 = (region.y + region.height) / page.height; - } - this.regions.push(region); - } - } - } - findRegion(name) { - for (let i = 0; i < this.regions.length; i++) { - if (this.regions[i].name == name) { - return this.regions[i]; - } - } - return null; - } - setTextures(assetManager, pathPrefix = "") { - for (let page of this.pages) - page.setTexture(assetManager.get(pathPrefix + page.name)); - } - dispose() { - for (let i = 0; i < this.pages.length; i++) { - this.pages[i].texture.dispose(); - } - } - }; - var TextureAtlasReader = class { - constructor(text) { - this.index = 0; - this.lines = text.split(/\r\n|\r|\n/); - } - readLine() { - if (this.index >= this.lines.length) - return null; - return this.lines[this.index++]; - } - readEntry(entry, line) { - if (!line) - return 0; - line = line.trim(); - if (line.length == 0) - return 0; - let colon = line.indexOf(":"); - if (colon == -1) - return 0; - entry[0] = line.substr(0, colon).trim(); - for (let i = 1, lastMatch = colon + 1; ; i++) { - let comma = line.indexOf(",", lastMatch); - if (comma == -1) { - entry[i] = line.substr(lastMatch).trim(); - return i; - } - entry[i] = line.substr(lastMatch, comma - lastMatch).trim(); - lastMatch = comma + 1; - if (i == 4) - return 4; - } - } - }; - var TextureAtlasPage = class { - constructor() { - this.minFilter = TextureFilter.Nearest; - this.magFilter = TextureFilter.Nearest; - this.uWrap = TextureWrap.ClampToEdge; - this.vWrap = TextureWrap.ClampToEdge; - } - setTexture(texture) { - this.texture = texture; - texture.setFilters(this.minFilter, this.magFilter); - texture.setWraps(this.uWrap, this.vWrap); - } - }; - var TextureAtlasRegion = class extends TextureRegion { - }; - - // spine-core/src/attachments/MeshAttachment.ts - var MeshAttachment = class extends VertexAttachment { - constructor(name) { - super(name); - this.color = new Color(1, 1, 1, 1); - this.tempColor = new Color(0, 0, 0, 0); - } - updateUVs() { - let regionUVs = this.regionUVs; - if (!this.uvs || this.uvs.length != regionUVs.length) - this.uvs = Utils.newFloatArray(regionUVs.length); - let uvs = this.uvs; - let n = this.uvs.length; - let u = this.region.u, v = this.region.v, width = 0, height = 0; - if (this.region instanceof TextureAtlasRegion) { - let region = this.region, image = region.page.texture.getImage(); - let textureWidth = image.width, textureHeight = image.height; - switch (region.degrees) { - case 90: - u -= (region.originalHeight - region.offsetY - region.height) / textureWidth; - v -= (region.originalWidth - region.offsetX - region.width) / textureHeight; - width = region.originalHeight / textureWidth; - height = region.originalWidth / textureHeight; - for (let i = 0; i < n; i += 2) { - uvs[i] = u + regionUVs[i + 1] * width; - uvs[i + 1] = v + (1 - regionUVs[i]) * height; - } - return; - case 180: - u -= (region.originalWidth - region.offsetX - region.width) / textureWidth; - v -= region.offsetY / textureHeight; - width = region.originalWidth / textureWidth; - height = region.originalHeight / textureHeight; - for (let i = 0; i < n; i += 2) { - uvs[i] = u + (1 - regionUVs[i]) * width; - uvs[i + 1] = v + (1 - regionUVs[i + 1]) * height; - } - return; - case 270: - u -= region.offsetY / textureWidth; - v -= region.offsetX / textureHeight; - width = region.originalHeight / textureWidth; - height = region.originalWidth / textureHeight; - for (let i = 0; i < n; i += 2) { - uvs[i] = u + (1 - regionUVs[i + 1]) * width; - uvs[i + 1] = v + regionUVs[i] * height; - } - return; - } - u -= region.offsetX / textureWidth; - v -= (region.originalHeight - region.offsetY - region.height) / textureHeight; - width = region.originalWidth / textureWidth; - height = region.originalHeight / textureHeight; - } else if (!this.region) { - u = v = 0; - width = height = 1; - } else { - width = this.region.u2 - u; - height = this.region.v2 - v; - } - for (let i = 0; i < n; i += 2) { - uvs[i] = u + regionUVs[i] * width; - uvs[i + 1] = v + regionUVs[i + 1] * height; - } - } - getParentMesh() { - return this.parentMesh; - } - setParentMesh(parentMesh) { - this.parentMesh = parentMesh; - if (parentMesh) { - this.bones = parentMesh.bones; - this.vertices = parentMesh.vertices; - this.worldVerticesLength = parentMesh.worldVerticesLength; - this.regionUVs = parentMesh.regionUVs; - this.triangles = parentMesh.triangles; - this.hullLength = parentMesh.hullLength; - this.worldVerticesLength = parentMesh.worldVerticesLength; - } - } - copy() { - if (this.parentMesh) - return this.newLinkedMesh(); - let copy = new MeshAttachment(this.name); - copy.region = this.region; - copy.path = this.path; - copy.color.setFromColor(this.color); - this.copyTo(copy); - copy.regionUVs = new Array(this.regionUVs.length); - Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length); - copy.uvs = new Array(this.uvs.length); - Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, this.uvs.length); - copy.triangles = new Array(this.triangles.length); - Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length); - copy.hullLength = this.hullLength; - if (this.edges) { - copy.edges = new Array(this.edges.length); - Utils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length); - } - copy.width = this.width; - copy.height = this.height; - return copy; - } - newLinkedMesh() { - let copy = new MeshAttachment(this.name); - copy.region = this.region; - copy.path = this.path; - copy.color.setFromColor(this.color); - copy.deformAttachment = this.deformAttachment; - copy.setParentMesh(this.parentMesh ? this.parentMesh : this); - copy.updateUVs(); - return copy; - } - }; - - // spine-core/src/attachments/PathAttachment.ts - var PathAttachment = class extends VertexAttachment { - constructor(name) { - super(name); - this.closed = false; - this.constantSpeed = false; - this.color = new Color(1, 1, 1, 1); - } - copy() { - let copy = new PathAttachment(this.name); - this.copyTo(copy); - copy.lengths = new Array(this.lengths.length); - Utils.arrayCopy(this.lengths, 0, copy.lengths, 0, this.lengths.length); - copy.closed = closed; - copy.constantSpeed = this.constantSpeed; - copy.color.setFromColor(this.color); - return copy; - } - }; - - // spine-core/src/attachments/PointAttachment.ts - var PointAttachment = class extends VertexAttachment { - constructor(name) { - super(name); - this.color = new Color(0.38, 0.94, 0, 1); - } - computeWorldPosition(bone, point) { - point.x = this.x * bone.a + this.y * bone.b + bone.worldX; - point.y = this.x * bone.c + this.y * bone.d + bone.worldY; - return point; - } - computeWorldRotation(bone) { - let cos = MathUtils.cosDeg(this.rotation), sin = MathUtils.sinDeg(this.rotation); - let x = cos * bone.a + sin * bone.b; - let y = cos * bone.c + sin * bone.d; - return Math.atan2(y, x) * MathUtils.radDeg; - } - copy() { - let copy = new PointAttachment(this.name); - copy.x = this.x; - copy.y = this.y; - copy.rotation = this.rotation; - copy.color.setFromColor(this.color); - return copy; - } - }; - - // spine-core/src/attachments/RegionAttachment.ts - var _RegionAttachment = class extends Attachment { - constructor(name) { - super(name); - this.x = 0; - this.y = 0; - this.scaleX = 1; - this.scaleY = 1; - this.rotation = 0; - this.width = 0; - this.height = 0; - this.color = new Color(1, 1, 1, 1); - this.offset = Utils.newFloatArray(8); - this.uvs = Utils.newFloatArray(8); - this.tempColor = new Color(1, 1, 1, 1); - } - updateOffset() { - let region = this.region; - let regionScaleX = this.width / this.region.originalWidth * this.scaleX; - let regionScaleY = this.height / this.region.originalHeight * this.scaleY; - let localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX; - let localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY; - let localX2 = localX + this.region.width * regionScaleX; - let localY2 = localY + this.region.height * regionScaleY; - let radians = this.rotation * Math.PI / 180; - let cos = Math.cos(radians); - let sin = Math.sin(radians); - let x = this.x, y = this.y; - let localXCos = localX * cos + x; - let localXSin = localX * sin; - let localYCos = localY * cos + y; - let localYSin = localY * sin; - let localX2Cos = localX2 * cos + x; - let localX2Sin = localX2 * sin; - let localY2Cos = localY2 * cos + y; - let localY2Sin = localY2 * sin; - let offset = this.offset; - offset[0] = localXCos - localYSin; - offset[1] = localYCos + localXSin; - offset[2] = localXCos - localY2Sin; - offset[3] = localY2Cos + localXSin; - offset[4] = localX2Cos - localY2Sin; - offset[5] = localY2Cos + localX2Sin; - offset[6] = localX2Cos - localYSin; - offset[7] = localYCos + localX2Sin; - } - setRegion(region) { - this.region = region; - let uvs = this.uvs; - if (region.degrees == 90) { - uvs[2] = region.u; - uvs[3] = region.v2; - uvs[4] = region.u; - uvs[5] = region.v; - uvs[6] = region.u2; - uvs[7] = region.v; - uvs[0] = region.u2; - uvs[1] = region.v2; - } else { - uvs[0] = region.u; - uvs[1] = region.v2; - uvs[2] = region.u; - uvs[3] = region.v; - uvs[4] = region.u2; - uvs[5] = region.v; - uvs[6] = region.u2; - uvs[7] = region.v2; - } - } - computeWorldVertices(bone, worldVertices, offset, stride) { - let vertexOffset = this.offset; - let x = bone.worldX, y = bone.worldY; - let a = bone.a, b = bone.b, c = bone.c, d = bone.d; - let offsetX = 0, offsetY = 0; - offsetX = vertexOffset[0]; - offsetY = vertexOffset[1]; - worldVertices[offset] = offsetX * a + offsetY * b + x; - worldVertices[offset + 1] = offsetX * c + offsetY * d + y; - offset += stride; - offsetX = vertexOffset[2]; - offsetY = vertexOffset[3]; - worldVertices[offset] = offsetX * a + offsetY * b + x; - worldVertices[offset + 1] = offsetX * c + offsetY * d + y; - offset += stride; - offsetX = vertexOffset[4]; - offsetY = vertexOffset[5]; - worldVertices[offset] = offsetX * a + offsetY * b + x; - worldVertices[offset + 1] = offsetX * c + offsetY * d + y; - offset += stride; - offsetX = vertexOffset[6]; - offsetY = vertexOffset[7]; - worldVertices[offset] = offsetX * a + offsetY * b + x; - worldVertices[offset + 1] = offsetX * c + offsetY * d + y; - } - copy() { - let copy = new _RegionAttachment(this.name); - copy.region = this.region; - copy.rendererObject = this.rendererObject; - copy.path = this.path; - copy.x = this.x; - copy.y = this.y; - copy.scaleX = this.scaleX; - copy.scaleY = this.scaleY; - copy.rotation = this.rotation; - copy.width = this.width; - copy.height = this.height; - Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8); - Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8); - copy.color.setFromColor(this.color); - return copy; - } - }; - var RegionAttachment = _RegionAttachment; - RegionAttachment.X1 = 0; - RegionAttachment.Y1 = 1; - RegionAttachment.C1R = 2; - RegionAttachment.C1G = 3; - RegionAttachment.C1B = 4; - RegionAttachment.C1A = 5; - RegionAttachment.U1 = 6; - RegionAttachment.V1 = 7; - RegionAttachment.X2 = 8; - RegionAttachment.Y2 = 9; - RegionAttachment.C2R = 10; - RegionAttachment.C2G = 11; - RegionAttachment.C2B = 12; - RegionAttachment.C2A = 13; - RegionAttachment.U2 = 14; - RegionAttachment.V2 = 15; - RegionAttachment.X3 = 16; - RegionAttachment.Y3 = 17; - RegionAttachment.C3R = 18; - RegionAttachment.C3G = 19; - RegionAttachment.C3B = 20; - RegionAttachment.C3A = 21; - RegionAttachment.U3 = 22; - RegionAttachment.V3 = 23; - RegionAttachment.X4 = 24; - RegionAttachment.Y4 = 25; - RegionAttachment.C4R = 26; - RegionAttachment.C4G = 27; - RegionAttachment.C4B = 28; - RegionAttachment.C4A = 29; - RegionAttachment.U4 = 30; - RegionAttachment.V4 = 31; - - // spine-core/src/AtlasAttachmentLoader.ts - var AtlasAttachmentLoader = class { - constructor(atlas) { - this.atlas = atlas; - } - newRegionAttachment(skin, name, path) { - let region = this.atlas.findRegion(path); - if (!region) - throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")"); - region.renderObject = region; - let attachment = new RegionAttachment(name); - attachment.setRegion(region); - return attachment; - } - newMeshAttachment(skin, name, path) { - let region = this.atlas.findRegion(path); - if (!region) - throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")"); - region.renderObject = region; - let attachment = new MeshAttachment(name); - attachment.region = region; - return attachment; - } - newBoundingBoxAttachment(skin, name) { - return new BoundingBoxAttachment(name); - } - newPathAttachment(skin, name) { - return new PathAttachment(name); - } - newPointAttachment(skin, name) { - return new PointAttachment(name); - } - newClippingAttachment(skin, name) { - return new ClippingAttachment(name); - } - }; - - // spine-core/src/BoneData.ts - var BoneData = class { - constructor(index, name, parent) { - this.x = 0; - this.y = 0; - this.rotation = 0; - this.scaleX = 1; - this.scaleY = 1; - this.shearX = 0; - this.shearY = 0; - this.transformMode = TransformMode.Normal; - this.skinRequired = false; - this.color = new Color(); - if (index < 0) - throw new Error("index must be >= 0."); - if (!name) - throw new Error("name cannot be null."); - this.index = index; - this.name = name; - this.parent = parent; - } - }; - var TransformMode; - (function(TransformMode2) { - TransformMode2[TransformMode2["Normal"] = 0] = "Normal"; - TransformMode2[TransformMode2["OnlyTranslation"] = 1] = "OnlyTranslation"; - TransformMode2[TransformMode2["NoRotationOrReflection"] = 2] = "NoRotationOrReflection"; - TransformMode2[TransformMode2["NoScale"] = 3] = "NoScale"; - TransformMode2[TransformMode2["NoScaleOrReflection"] = 4] = "NoScaleOrReflection"; - })(TransformMode || (TransformMode = {})); - - // spine-core/src/Bone.ts - var Bone = class { - constructor(data, skeleton, parent) { - this.children = new Array(); - this.x = 0; - this.y = 0; - this.rotation = 0; - this.scaleX = 0; - this.scaleY = 0; - this.shearX = 0; - this.shearY = 0; - this.ax = 0; - this.ay = 0; - this.arotation = 0; - this.ascaleX = 0; - this.ascaleY = 0; - this.ashearX = 0; - this.ashearY = 0; - this.a = 0; - this.b = 0; - this.c = 0; - this.d = 0; - this.worldY = 0; - this.worldX = 0; - this.sorted = false; - this.active = false; - if (!data) - throw new Error("data cannot be null."); - if (!skeleton) - throw new Error("skeleton cannot be null."); - this.data = data; - this.skeleton = skeleton; - this.parent = parent; - this.setToSetupPose(); - } - isActive() { - return this.active; - } - update() { - this.updateWorldTransformWith(this.ax, this.ay, this.arotation, this.ascaleX, this.ascaleY, this.ashearX, this.ashearY); - } - updateWorldTransform() { - this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY); - } - updateWorldTransformWith(x, y, rotation, scaleX, scaleY, shearX, shearY) { - this.ax = x; - this.ay = y; - this.arotation = rotation; - this.ascaleX = scaleX; - this.ascaleY = scaleY; - this.ashearX = shearX; - this.ashearY = shearY; - let parent = this.parent; - if (!parent) { - let skeleton = this.skeleton; - let rotationY = rotation + 90 + shearY; - let sx = skeleton.scaleX; - let sy = skeleton.scaleY; - this.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx; - this.b = MathUtils.cosDeg(rotationY) * scaleY * sx; - this.c = MathUtils.sinDeg(rotation + shearX) * scaleX * sy; - this.d = MathUtils.sinDeg(rotationY) * scaleY * sy; - this.worldX = x * sx + skeleton.x; - this.worldY = y * sy + skeleton.y; - return; - } - let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; - this.worldX = pa * x + pb * y + parent.worldX; - this.worldY = pc * x + pd * y + parent.worldY; - switch (this.data.transformMode) { - case TransformMode.Normal: { - let rotationY = rotation + 90 + shearY; - let la = MathUtils.cosDeg(rotation + shearX) * scaleX; - let lb = MathUtils.cosDeg(rotationY) * scaleY; - let lc = MathUtils.sinDeg(rotation + shearX) * scaleX; - let ld = MathUtils.sinDeg(rotationY) * scaleY; - this.a = pa * la + pb * lc; - this.b = pa * lb + pb * ld; - this.c = pc * la + pd * lc; - this.d = pc * lb + pd * ld; - return; - } - case TransformMode.OnlyTranslation: { - let rotationY = rotation + 90 + shearY; - this.a = MathUtils.cosDeg(rotation + shearX) * scaleX; - this.b = MathUtils.cosDeg(rotationY) * scaleY; - this.c = MathUtils.sinDeg(rotation + shearX) * scaleX; - this.d = MathUtils.sinDeg(rotationY) * scaleY; - break; - } - case TransformMode.NoRotationOrReflection: { - let s = pa * pa + pc * pc; - let prx = 0; - if (s > 1e-4) { - s = Math.abs(pa * pd - pb * pc) / s; - pa /= this.skeleton.scaleX; - pc /= this.skeleton.scaleY; - pb = pc * s; - pd = pa * s; - prx = Math.atan2(pc, pa) * MathUtils.radDeg; - } else { - pa = 0; - pc = 0; - prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg; - } - let rx = rotation + shearX - prx; - let ry = rotation + shearY - prx + 90; - let la = MathUtils.cosDeg(rx) * scaleX; - let lb = MathUtils.cosDeg(ry) * scaleY; - let lc = MathUtils.sinDeg(rx) * scaleX; - let ld = MathUtils.sinDeg(ry) * scaleY; - this.a = pa * la - pb * lc; - this.b = pa * lb - pb * ld; - this.c = pc * la + pd * lc; - this.d = pc * lb + pd * ld; - break; - } - case TransformMode.NoScale: - case TransformMode.NoScaleOrReflection: { - let cos = MathUtils.cosDeg(rotation); - let sin = MathUtils.sinDeg(rotation); - let za = (pa * cos + pb * sin) / this.skeleton.scaleX; - let zc = (pc * cos + pd * sin) / this.skeleton.scaleY; - let s = Math.sqrt(za * za + zc * zc); - if (s > 1e-5) - s = 1 / s; - za *= s; - zc *= s; - s = Math.sqrt(za * za + zc * zc); - if (this.data.transformMode == TransformMode.NoScale && pa * pd - pb * pc < 0 != (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0)) - s = -s; - let r = Math.PI / 2 + Math.atan2(zc, za); - let zb = Math.cos(r) * s; - let zd = Math.sin(r) * s; - let la = MathUtils.cosDeg(shearX) * scaleX; - let lb = MathUtils.cosDeg(90 + shearY) * scaleY; - let lc = MathUtils.sinDeg(shearX) * scaleX; - let ld = MathUtils.sinDeg(90 + shearY) * scaleY; - this.a = za * la + zb * lc; - this.b = za * lb + zb * ld; - this.c = zc * la + zd * lc; - this.d = zc * lb + zd * ld; - break; - } - } - this.a *= this.skeleton.scaleX; - this.b *= this.skeleton.scaleX; - this.c *= this.skeleton.scaleY; - this.d *= this.skeleton.scaleY; - } - setToSetupPose() { - let data = this.data; - this.x = data.x; - this.y = data.y; - this.rotation = data.rotation; - this.scaleX = data.scaleX; - this.scaleY = data.scaleY; - this.shearX = data.shearX; - this.shearY = data.shearY; - } - getWorldRotationX() { - return Math.atan2(this.c, this.a) * MathUtils.radDeg; - } - getWorldRotationY() { - return Math.atan2(this.d, this.b) * MathUtils.radDeg; - } - getWorldScaleX() { - return Math.sqrt(this.a * this.a + this.c * this.c); - } - getWorldScaleY() { - return Math.sqrt(this.b * this.b + this.d * this.d); - } - updateAppliedTransform() { - let parent = this.parent; - if (!parent) { - this.ax = this.worldX; - this.ay = this.worldY; - this.arotation = Math.atan2(this.c, this.a) * MathUtils.radDeg; - this.ascaleX = Math.sqrt(this.a * this.a + this.c * this.c); - this.ascaleY = Math.sqrt(this.b * this.b + this.d * this.d); - this.ashearX = 0; - this.ashearY = Math.atan2(this.a * this.b + this.c * this.d, this.a * this.d - this.b * this.c) * MathUtils.radDeg; - return; - } - let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; - let pid = 1 / (pa * pd - pb * pc); - let dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY; - this.ax = dx * pd * pid - dy * pb * pid; - this.ay = dy * pa * pid - dx * pc * pid; - let ia = pid * pd; - let id = pid * pa; - let ib = pid * pb; - let ic = pid * pc; - let ra = ia * this.a - ib * this.c; - let rb = ia * this.b - ib * this.d; - let rc = id * this.c - ic * this.a; - let rd = id * this.d - ic * this.b; - this.ashearX = 0; - this.ascaleX = Math.sqrt(ra * ra + rc * rc); - if (this.ascaleX > 1e-4) { - let det = ra * rd - rb * rc; - this.ascaleY = det / this.ascaleX; - this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg; - this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg; - } else { - this.ascaleX = 0; - this.ascaleY = Math.sqrt(rb * rb + rd * rd); - this.ashearY = 0; - this.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg; - } - } - worldToLocal(world) { - let invDet = 1 / (this.a * this.d - this.b * this.c); - let x = world.x - this.worldX, y = world.y - this.worldY; - world.x = x * this.d * invDet - y * this.b * invDet; - world.y = y * this.a * invDet - x * this.c * invDet; - return world; - } - localToWorld(local) { - let x = local.x, y = local.y; - local.x = x * this.a + y * this.b + this.worldX; - local.y = x * this.c + y * this.d + this.worldY; - return local; - } - worldToLocalRotation(worldRotation) { - let sin = MathUtils.sinDeg(worldRotation), cos = MathUtils.cosDeg(worldRotation); - return Math.atan2(this.a * sin - this.c * cos, this.d * cos - this.b * sin) * MathUtils.radDeg + this.rotation - this.shearX; - } - localToWorldRotation(localRotation) { - localRotation -= this.rotation - this.shearX; - let sin = MathUtils.sinDeg(localRotation), cos = MathUtils.cosDeg(localRotation); - return Math.atan2(cos * this.c + sin * this.d, cos * this.a + sin * this.b) * MathUtils.radDeg; - } - rotateWorld(degrees) { - let a = this.a, b = this.b, c = this.c, d = this.d; - let cos = MathUtils.cosDeg(degrees), sin = MathUtils.sinDeg(degrees); - this.a = cos * a - sin * c; - this.b = cos * b - sin * d; - this.c = sin * a + cos * c; - this.d = sin * b + cos * d; - } - }; - - // spine-core/src/ConstraintData.ts - var ConstraintData = class { - constructor(name, order, skinRequired) { - this.name = name; - this.order = order; - this.skinRequired = skinRequired; - } - }; - - // spine-core/src/AssetManagerBase.ts - var AssetManagerBase = class { - constructor(textureLoader, pathPrefix = "", downloader = null) { - this.assets = {}; - this.errors = {}; - this.toLoad = 0; - this.loaded = 0; - this.textureLoader = textureLoader; - this.pathPrefix = pathPrefix; - this.downloader = downloader || new Downloader(); - } - start(path) { - this.toLoad++; - return this.pathPrefix + path; - } - success(callback, path, asset) { - this.toLoad--; - this.loaded++; - this.assets[path] = asset; - if (callback) - callback(path, asset); - } - error(callback, path, message) { - this.toLoad--; - this.loaded++; - this.errors[path] = message; - if (callback) - callback(path, message); - } - setRawDataURI(path, data) { - this.downloader.rawDataUris[this.pathPrefix + path] = data; - } - loadBinary(path, success = null, error = null) { - path = this.start(path); - this.downloader.downloadBinary(path, (data) => { - this.success(success, path, data); - }, (status, responseText) => { - this.error(error, path, `Couldn't load binary ${path}: status ${status}, ${responseText}`); - }); - } - loadText(path, success = null, error = null) { - path = this.start(path); - this.downloader.downloadText(path, (data) => { - this.success(success, path, data); - }, (status, responseText) => { - this.error(error, path, `Couldn't load text ${path}: status ${status}, ${responseText}`); - }); - } - loadJson(path, success = null, error = null) { - path = this.start(path); - this.downloader.downloadJson(path, (data) => { - this.success(success, path, data); - }, (status, responseText) => { - this.error(error, path, `Couldn't load JSON ${path}: status ${status}, ${responseText}`); - }); - } - loadTexture(path, success = null, error = null) { - path = this.start(path); - let isBrowser = !!(typeof window !== "undefined" && typeof navigator !== "undefined" && window.document); - let isWebWorker = !isBrowser; - if (isWebWorker) { - fetch(path, { mode: "cors" }).then((response) => { - if (response.ok) - return response.blob(); - this.error(error, path, `Couldn't load image: ${path}`); - return null; - }).then((blob) => { - return blob ? createImageBitmap(blob, { premultiplyAlpha: "none", colorSpaceConversion: "none" }) : null; - }).then((bitmap) => { - if (bitmap) - this.success(success, path, this.textureLoader(bitmap)); - }); - } else { - let image = new Image(); - image.crossOrigin = "anonymous"; - image.onload = () => { - this.success(success, path, this.textureLoader(image)); - }; - image.onerror = () => { - this.error(error, path, `Couldn't load image: ${path}`); - }; - if (this.downloader.rawDataUris[path]) - path = this.downloader.rawDataUris[path]; - image.src = path; - } - } - loadTextureAtlas(path, success = null, error = null) { - let index = path.lastIndexOf("/"); - let parent = index >= 0 ? path.substring(0, index + 1) : ""; - path = this.start(path); - this.downloader.downloadText(path, (atlasText) => { - try { - let atlas = new TextureAtlas(atlasText); - let toLoad = atlas.pages.length, abort = false; - for (let page of atlas.pages) { - this.loadTexture(parent + page.name, (imagePath, texture) => { - if (!abort) { - page.setTexture(texture); - if (--toLoad == 0) - this.success(success, path, atlas); - } - }, (imagePath, message) => { - if (!abort) - this.error(error, path, `Couldn't load texture atlas ${path} page image: ${imagePath}`); - abort = true; - }); - } - } catch (e) { - this.error(error, path, `Couldn't parse texture atlas ${path}: ${e.message}`); - } - }, (status, responseText) => { - this.error(error, path, `Couldn't load texture atlas ${path}: status ${status}, ${responseText}`); - }); - } - get(path) { - return this.assets[this.pathPrefix + path]; - } - require(path) { - path = this.pathPrefix + path; - let asset = this.assets[path]; - if (asset) - return asset; - let error = this.errors[path]; - throw Error("Asset not found: " + path + (error ? "\n" + error : "")); - } - remove(path) { - path = this.pathPrefix + path; - let asset = this.assets[path]; - if (asset.dispose) - asset.dispose(); - delete this.assets[path]; - return asset; - } - removeAll() { - for (let key in this.assets) { - let asset = this.assets[key]; - if (asset.dispose) - asset.dispose(); - } - this.assets = {}; - } - isLoadingComplete() { - return this.toLoad == 0; - } - getToLoad() { - return this.toLoad; - } - getLoaded() { - return this.loaded; - } - dispose() { - this.removeAll(); - } - hasErrors() { - return Object.keys(this.errors).length > 0; - } - getErrors() { - return this.errors; - } - }; - var Downloader = class { - constructor() { - this.callbacks = {}; - this.rawDataUris = {}; - } - downloadText(url, success, error) { - if (this.rawDataUris[url]) - url = this.rawDataUris[url]; - if (this.start(url, success, error)) - return; - let request = new XMLHttpRequest(); - request.overrideMimeType("text/html"); - request.open("GET", url, true); - let done = () => { - this.finish(url, request.status, request.responseText); - }; - request.onload = done; - request.onerror = done; - request.send(); - } - downloadJson(url, success, error) { - this.downloadText(url, (data) => { - success(JSON.parse(data)); - }, error); - } - downloadBinary(url, success, error) { - if (this.rawDataUris[url]) - url = this.rawDataUris[url]; - if (this.start(url, success, error)) - return; - let request = new XMLHttpRequest(); - request.open("GET", url, true); - request.responseType = "arraybuffer"; - let onerror = () => { - this.finish(url, request.status, request.responseText); - }; - request.onload = () => { - if (request.status == 200) - this.finish(url, 200, new Uint8Array(request.response)); - else - onerror(); - }; - request.onerror = onerror; - request.send(); - } - start(url, success, error) { - let callbacks = this.callbacks[url]; - try { - if (callbacks) - return true; - this.callbacks[url] = callbacks = []; - } finally { - callbacks.push(success, error); - } - } - finish(url, status, data) { - let callbacks = this.callbacks[url]; - delete this.callbacks[url]; - let args = status == 200 ? [data] : [status, data]; - for (let i = args.length - 1, n = callbacks.length; i < n; i += 2) - callbacks[i].apply(null, args); - } - }; - - // spine-core/src/Event.ts - var Event = class { - constructor(time, data) { - if (!data) - throw new Error("data cannot be null."); - this.time = time; - this.data = data; - } - }; - - // spine-core/src/EventData.ts - var EventData = class { - constructor(name) { - this.name = name; - } - }; - - // spine-core/src/IkConstraint.ts - var IkConstraint = class { - constructor(data, skeleton) { - this.bendDirection = 0; - this.compress = false; - this.stretch = false; - this.mix = 1; - this.softness = 0; - this.active = false; - if (!data) - throw new Error("data cannot be null."); - if (!skeleton) - throw new Error("skeleton cannot be null."); - this.data = data; - this.mix = data.mix; - this.softness = data.softness; - this.bendDirection = data.bendDirection; - this.compress = data.compress; - this.stretch = data.stretch; - this.bones = new Array(); - for (let i = 0; i < data.bones.length; i++) - this.bones.push(skeleton.findBone(data.bones[i].name)); - this.target = skeleton.findBone(data.target.name); - } - isActive() { - return this.active; - } - update() { - if (this.mix == 0) - return; - let target = this.target; - let bones = this.bones; - switch (bones.length) { - case 1: - this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix); - break; - case 2: - this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.data.uniform, this.softness, this.mix); - break; - } - } - apply1(bone, targetX, targetY, compress, stretch, uniform, alpha) { - let p = bone.parent; - let pa = p.a, pb = p.b, pc = p.c, pd = p.d; - let rotationIK = -bone.ashearX - bone.arotation, tx = 0, ty = 0; - switch (bone.data.transformMode) { - case TransformMode.OnlyTranslation: - tx = targetX - bone.worldX; - ty = targetY - bone.worldY; - break; - case TransformMode.NoRotationOrReflection: - let s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc); - let sa = pa / bone.skeleton.scaleX; - let sc = pc / bone.skeleton.scaleY; - pb = -sc * s * bone.skeleton.scaleX; - pd = sa * s * bone.skeleton.scaleY; - rotationIK += Math.atan2(sc, sa) * MathUtils.radDeg; - default: - let x = targetX - p.worldX, y = targetY - p.worldY; - let d = pa * pd - pb * pc; - tx = (x * pd - y * pb) / d - bone.ax; - ty = (y * pa - x * pc) / d - bone.ay; - } - rotationIK += Math.atan2(ty, tx) * MathUtils.radDeg; - if (bone.ascaleX < 0) - rotationIK += 180; - if (rotationIK > 180) - rotationIK -= 360; - else if (rotationIK < -180) - rotationIK += 360; - let sx = bone.ascaleX, sy = bone.ascaleY; - if (compress || stretch) { - switch (bone.data.transformMode) { - case TransformMode.NoScale: - case TransformMode.NoScaleOrReflection: - tx = targetX - bone.worldX; - ty = targetY - bone.worldY; - } - let b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty); - if (compress && dd < b || stretch && dd > b && b > 1e-4) { - let s = (dd / b - 1) * alpha + 1; - sx *= s; - if (uniform) - sy *= s; - } - } - bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY); - } - apply2(parent, child, targetX, targetY, bendDir, stretch, uniform, softness, alpha) { - let px = parent.ax, py = parent.ay, psx = parent.ascaleX, psy = parent.ascaleY, sx = psx, sy = psy, csx = child.ascaleX; - let os1 = 0, os2 = 0, s2 = 0; - if (psx < 0) { - psx = -psx; - os1 = 180; - s2 = -1; - } else { - os1 = 0; - s2 = 1; - } - if (psy < 0) { - psy = -psy; - s2 = -s2; - } - if (csx < 0) { - csx = -csx; - os2 = 180; - } else - os2 = 0; - let cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = parent.a, b = parent.b, c = parent.c, d = parent.d; - let u = Math.abs(psx - psy) <= 1e-4; - if (!u || stretch) { - cy = 0; - cwx = a * cx + parent.worldX; - cwy = c * cx + parent.worldY; - } else { - cy = child.ay; - cwx = a * cx + b * cy + parent.worldX; - cwy = c * cx + d * cy + parent.worldY; - } - let pp = parent.parent; - a = pp.a; - b = pp.b; - c = pp.c; - d = pp.d; - let id = 1 / (a * d - b * c), x = cwx - pp.worldX, y = cwy - pp.worldY; - let dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py; - let l1 = Math.sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1, a2; - if (l1 < 1e-4) { - this.apply1(parent, targetX, targetY, false, stretch, false, alpha); - child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); - return; - } - x = targetX - pp.worldX; - y = targetY - pp.worldY; - let tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py; - let dd = tx * tx + ty * ty; - if (softness != 0) { - softness *= psx * (csx + 1) * 0.5; - let td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness; - if (sd > 0) { - let p = Math.min(1, sd / (softness * 2)) - 1; - p = (sd - softness * (1 - p * p)) / td; - tx -= p * tx; - ty -= p * ty; - dd = tx * tx + ty * ty; - } - } - outer: - if (u) { - l2 *= psx; - let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2); - if (cos < -1) { - cos = -1; - a2 = Math.PI * bendDir; - } else if (cos > 1) { - cos = 1; - a2 = 0; - if (stretch) { - a = (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1; - sx *= a; - if (uniform) - sy *= a; - } - } else - a2 = Math.acos(cos) * bendDir; - a = l1 + l2 * cos; - b = l2 * Math.sin(a2); - a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b); - } else { - a = psx * l2; - b = psy * l2; - let aa = a * a, bb = b * b, ta = Math.atan2(ty, tx); - c = bb * l1 * l1 + aa * dd - aa * bb; - let c1 = -2 * bb * l1, c2 = bb - aa; - d = c1 * c1 - 4 * c2 * c; - if (d >= 0) { - let q = Math.sqrt(d); - if (c1 < 0) - q = -q; - q = -(c1 + q) * 0.5; - let r0 = q / c2, r1 = c / q; - let r = Math.abs(r0) < Math.abs(r1) ? r0 : r1; - if (r * r <= dd) { - y = Math.sqrt(dd - r * r) * bendDir; - a1 = ta - Math.atan2(y, r); - a2 = Math.atan2(y / psy, (r - l1) / psx); - break outer; - } - } - let minAngle = MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0; - let maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0; - c = -a * l1 / (aa - bb); - if (c >= -1 && c <= 1) { - c = Math.acos(c); - x = a * Math.cos(c) + l1; - y = b * Math.sin(c); - d = x * x + y * y; - if (d < minDist) { - minAngle = c; - minDist = d; - minX = x; - minY = y; - } - if (d > maxDist) { - maxAngle = c; - maxDist = d; - maxX = x; - maxY = y; - } - } - if (dd <= (minDist + maxDist) * 0.5) { - a1 = ta - Math.atan2(minY * bendDir, minX); - a2 = minAngle * bendDir; - } else { - a1 = ta - Math.atan2(maxY * bendDir, maxX); - a2 = maxAngle * bendDir; - } - } - let os = Math.atan2(cy, cx) * s2; - let rotation = parent.arotation; - a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation; - if (a1 > 180) - a1 -= 360; - else if (a1 < -180) - a1 += 360; - parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, sy, 0, 0); - rotation = child.arotation; - a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation; - if (a2 > 180) - a2 -= 360; - else if (a2 < -180) - a2 += 360; - child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); - } - }; - - // spine-core/src/IkConstraintData.ts - var IkConstraintData = class extends ConstraintData { - constructor(name) { - super(name, 0, false); - this.bones = new Array(); - this.bendDirection = 1; - this.compress = false; - this.stretch = false; - this.uniform = false; - this.mix = 1; - this.softness = 0; - } - }; - - // spine-core/src/PathConstraintData.ts - var PathConstraintData = class extends ConstraintData { - constructor(name) { - super(name, 0, false); - this.bones = new Array(); - this.mixRotate = 0; - this.mixX = 0; - this.mixY = 0; - } - }; - var PositionMode; - (function(PositionMode2) { - PositionMode2[PositionMode2["Fixed"] = 0] = "Fixed"; - PositionMode2[PositionMode2["Percent"] = 1] = "Percent"; - })(PositionMode || (PositionMode = {})); - var SpacingMode; - (function(SpacingMode2) { - SpacingMode2[SpacingMode2["Length"] = 0] = "Length"; - SpacingMode2[SpacingMode2["Fixed"] = 1] = "Fixed"; - SpacingMode2[SpacingMode2["Percent"] = 2] = "Percent"; - SpacingMode2[SpacingMode2["Proportional"] = 3] = "Proportional"; - })(SpacingMode || (SpacingMode = {})); - var RotateMode; - (function(RotateMode2) { - RotateMode2[RotateMode2["Tangent"] = 0] = "Tangent"; - RotateMode2[RotateMode2["Chain"] = 1] = "Chain"; - RotateMode2[RotateMode2["ChainScale"] = 2] = "ChainScale"; - })(RotateMode || (RotateMode = {})); - - // spine-core/src/PathConstraint.ts - var _PathConstraint = class { - constructor(data, skeleton) { - this.position = 0; - this.spacing = 0; - this.mixRotate = 0; - this.mixX = 0; - this.mixY = 0; - this.spaces = new Array(); - this.positions = new Array(); - this.world = new Array(); - this.curves = new Array(); - this.lengths = new Array(); - this.segments = new Array(); - this.active = false; - if (!data) - throw new Error("data cannot be null."); - if (!skeleton) - throw new Error("skeleton cannot be null."); - this.data = data; - this.bones = new Array(); - for (let i = 0, n = data.bones.length; i < n; i++) - this.bones.push(skeleton.findBone(data.bones[i].name)); - this.target = skeleton.findSlot(data.target.name); - this.position = data.position; - this.spacing = data.spacing; - this.mixRotate = data.mixRotate; - this.mixX = data.mixX; - this.mixY = data.mixY; - } - isActive() { - return this.active; - } - update() { - let attachment = this.target.getAttachment(); - if (!(attachment instanceof PathAttachment)) - return; - let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY; - if (mixRotate == 0 && mixX == 0 && mixY == 0) - return; - let data = this.data; - let tangents = data.rotateMode == RotateMode.Tangent, scale = data.rotateMode == RotateMode.ChainScale; - let bones = this.bones; - let boneCount = bones.length, spacesCount = tangents ? boneCount : boneCount + 1; - let spaces = Utils.setArraySize(this.spaces, spacesCount), lengths = scale ? this.lengths = Utils.setArraySize(this.lengths, boneCount) : null; - let spacing = this.spacing; - switch (data.spacingMode) { - case SpacingMode.Percent: - if (scale) { - for (let i = 0, n = spacesCount - 1; i < n; i++) { - let bone = bones[i]; - let setupLength = bone.data.length; - if (setupLength < _PathConstraint.epsilon) - lengths[i] = 0; - else { - let x = setupLength * bone.a, y = setupLength * bone.c; - lengths[i] = Math.sqrt(x * x + y * y); - } - } - } - Utils.arrayFill(spaces, 1, spacesCount, spacing); - break; - case SpacingMode.Proportional: - let sum = 0; - for (let i = 0, n = spacesCount - 1; i < n; ) { - let bone = bones[i]; - let setupLength = bone.data.length; - if (setupLength < _PathConstraint.epsilon) { - if (scale) - lengths[i] = 0; - spaces[++i] = spacing; - } else { - let x = setupLength * bone.a, y = setupLength * bone.c; - let length = Math.sqrt(x * x + y * y); - if (scale) - lengths[i] = length; - spaces[++i] = length; - sum += length; - } - } - if (sum > 0) { - sum = spacesCount / sum * spacing; - for (let i = 1; i < spacesCount; i++) - spaces[i] *= sum; - } - break; - default: - let lengthSpacing = data.spacingMode == SpacingMode.Length; - for (let i = 0, n = spacesCount - 1; i < n; ) { - let bone = bones[i]; - let setupLength = bone.data.length; - if (setupLength < _PathConstraint.epsilon) { - if (scale) - lengths[i] = 0; - spaces[++i] = spacing; - } else { - let x = setupLength * bone.a, y = setupLength * bone.c; - let length = Math.sqrt(x * x + y * y); - if (scale) - lengths[i] = length; - spaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength; - } - } - } - let positions = this.computeWorldPositions(attachment, spacesCount, tangents); - let boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation; - let tip = false; - if (offsetRotation == 0) - tip = data.rotateMode == RotateMode.Chain; - else { - tip = false; - let p = this.target.bone; - offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad; - } - for (let i = 0, p = 3; i < boneCount; i++, p += 3) { - let bone = bones[i]; - bone.worldX += (boneX - bone.worldX) * mixX; - bone.worldY += (boneY - bone.worldY) * mixY; - let x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY; - if (scale) { - let length = lengths[i]; - if (length != 0) { - let s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * mixRotate + 1; - bone.a *= s; - bone.c *= s; - } - } - boneX = x; - boneY = y; - if (mixRotate > 0) { - let a = bone.a, b = bone.b, c = bone.c, d = bone.d, r = 0, cos = 0, sin = 0; - if (tangents) - r = positions[p - 1]; - else if (spaces[i + 1] == 0) - r = positions[p + 2]; - else - r = Math.atan2(dy, dx); - r -= Math.atan2(c, a); - if (tip) { - cos = Math.cos(r); - sin = Math.sin(r); - let length = bone.data.length; - boneX += (length * (cos * a - sin * c) - dx) * mixRotate; - boneY += (length * (sin * a + cos * c) - dy) * mixRotate; - } else { - r += offsetRotation; - } - if (r > MathUtils.PI) - r -= MathUtils.PI2; - else if (r < -MathUtils.PI) - r += MathUtils.PI2; - r *= mixRotate; - cos = Math.cos(r); - sin = Math.sin(r); - bone.a = cos * a - sin * c; - bone.b = cos * b - sin * d; - bone.c = sin * a + cos * c; - bone.d = sin * b + cos * d; - } - bone.updateAppliedTransform(); - } - } - computeWorldPositions(path, spacesCount, tangents) { - let target = this.target; - let position = this.position; - let spaces = this.spaces, out = Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = null; - let closed2 = path.closed; - let verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = _PathConstraint.NONE; - if (!path.constantSpeed) { - let lengths = path.lengths; - curveCount -= closed2 ? 1 : 2; - let pathLength2 = lengths[curveCount]; - if (this.data.positionMode == PositionMode.Percent) - position *= pathLength2; - let multiplier2; - switch (this.data.spacingMode) { - case SpacingMode.Percent: - multiplier2 = pathLength2; - break; - case SpacingMode.Proportional: - multiplier2 = pathLength2 / spacesCount; - break; - default: - multiplier2 = 1; - } - world = Utils.setArraySize(this.world, 8); - for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { - let space = spaces[i] * multiplier2; - position += space; - let p = position; - if (closed2) { - p %= pathLength2; - if (p < 0) - p += pathLength2; - curve = 0; - } else if (p < 0) { - if (prevCurve != _PathConstraint.BEFORE) { - prevCurve = _PathConstraint.BEFORE; - path.computeWorldVertices(target, 2, 4, world, 0, 2); - } - this.addBeforePosition(p, world, 0, out, o); - continue; - } else if (p > pathLength2) { - if (prevCurve != _PathConstraint.AFTER) { - prevCurve = _PathConstraint.AFTER; - path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2); - } - this.addAfterPosition(p - pathLength2, world, 0, out, o); - continue; - } - for (; ; curve++) { - let length = lengths[curve]; - if (p > length) - continue; - if (curve == 0) - p /= length; - else { - let prev = lengths[curve - 1]; - p = (p - prev) / (length - prev); - } - break; - } - if (curve != prevCurve) { - prevCurve = curve; - if (closed2 && curve == curveCount) { - path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2); - path.computeWorldVertices(target, 0, 4, world, 4, 2); - } else - path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2); - } - this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, tangents || i > 0 && space == 0); - } - return out; - } - if (closed2) { - verticesLength += 2; - world = Utils.setArraySize(this.world, verticesLength); - path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2); - path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2); - world[verticesLength - 2] = world[0]; - world[verticesLength - 1] = world[1]; - } else { - curveCount--; - verticesLength -= 4; - world = Utils.setArraySize(this.world, verticesLength); - path.computeWorldVertices(target, 2, verticesLength, world, 0, 2); - } - let curves = Utils.setArraySize(this.curves, curveCount); - let pathLength = 0; - let x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0; - let tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0; - for (let i = 0, w = 2; i < curveCount; i++, w += 6) { - cx1 = world[w]; - cy1 = world[w + 1]; - cx2 = world[w + 2]; - cy2 = world[w + 3]; - x2 = world[w + 4]; - y2 = world[w + 5]; - tmpx = (x1 - cx1 * 2 + cx2) * 0.1875; - tmpy = (y1 - cy1 * 2 + cy2) * 0.1875; - dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375; - dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375; - ddfx = tmpx * 2 + dddfx; - ddfy = tmpy * 2 + dddfy; - dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667; - dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667; - pathLength += Math.sqrt(dfx * dfx + dfy * dfy); - dfx += ddfx; - dfy += ddfy; - ddfx += dddfx; - ddfy += dddfy; - pathLength += Math.sqrt(dfx * dfx + dfy * dfy); - dfx += ddfx; - dfy += ddfy; - pathLength += Math.sqrt(dfx * dfx + dfy * dfy); - dfx += ddfx + dddfx; - dfy += ddfy + dddfy; - pathLength += Math.sqrt(dfx * dfx + dfy * dfy); - curves[i] = pathLength; - x1 = x2; - y1 = y2; - } - if (this.data.positionMode == PositionMode.Percent) - position *= pathLength; - let multiplier; - switch (this.data.spacingMode) { - case SpacingMode.Percent: - multiplier = pathLength; - break; - case SpacingMode.Proportional: - multiplier = pathLength / spacesCount; - break; - default: - multiplier = 1; - } - let segments = this.segments; - let curveLength = 0; - for (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { - let space = spaces[i] * multiplier; - position += space; - let p = position; - if (closed2) { - p %= pathLength; - if (p < 0) - p += pathLength; - curve = 0; - } else if (p < 0) { - this.addBeforePosition(p, world, 0, out, o); - continue; - } else if (p > pathLength) { - this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o); - continue; - } - for (; ; curve++) { - let length = curves[curve]; - if (p > length) - continue; - if (curve == 0) - p /= length; - else { - let prev = curves[curve - 1]; - p = (p - prev) / (length - prev); - } - break; - } - if (curve != prevCurve) { - prevCurve = curve; - let ii = curve * 6; - x1 = world[ii]; - y1 = world[ii + 1]; - cx1 = world[ii + 2]; - cy1 = world[ii + 3]; - cx2 = world[ii + 4]; - cy2 = world[ii + 5]; - x2 = world[ii + 6]; - y2 = world[ii + 7]; - tmpx = (x1 - cx1 * 2 + cx2) * 0.03; - tmpy = (y1 - cy1 * 2 + cy2) * 0.03; - dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 6e-3; - dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 6e-3; - ddfx = tmpx * 2 + dddfx; - ddfy = tmpy * 2 + dddfy; - dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667; - dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667; - curveLength = Math.sqrt(dfx * dfx + dfy * dfy); - segments[0] = curveLength; - for (ii = 1; ii < 8; ii++) { - dfx += ddfx; - dfy += ddfy; - ddfx += dddfx; - ddfy += dddfy; - curveLength += Math.sqrt(dfx * dfx + dfy * dfy); - segments[ii] = curveLength; - } - dfx += ddfx; - dfy += ddfy; - curveLength += Math.sqrt(dfx * dfx + dfy * dfy); - segments[8] = curveLength; - dfx += ddfx + dddfx; - dfy += ddfy + dddfy; - curveLength += Math.sqrt(dfx * dfx + dfy * dfy); - segments[9] = curveLength; - segment = 0; - } - p *= curveLength; - for (; ; segment++) { - let length = segments[segment]; - if (p > length) - continue; - if (segment == 0) - p /= length; - else { - let prev = segments[segment - 1]; - p = segment + (p - prev) / (length - prev); - } - break; - } - this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || i > 0 && space == 0); - } - return out; - } - addBeforePosition(p, temp, i, out, o) { - let x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx); - out[o] = x1 + p * Math.cos(r); - out[o + 1] = y1 + p * Math.sin(r); - out[o + 2] = r; - } - addAfterPosition(p, temp, i, out, o) { - let x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx); - out[o] = x1 + p * Math.cos(r); - out[o + 1] = y1 + p * Math.sin(r); - out[o + 2] = r; - } - addCurvePosition(p, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents) { - if (p == 0 || isNaN(p)) { - out[o] = x1; - out[o + 1] = y1; - out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1); - return; - } - let tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; - let ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p; - let x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; - out[o] = x; - out[o + 1] = y; - if (tangents) { - if (p < 1e-3) - out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1); - else - out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); - } - } - }; - var PathConstraint = _PathConstraint; - PathConstraint.NONE = -1; - PathConstraint.BEFORE = -2; - PathConstraint.AFTER = -3; - PathConstraint.epsilon = 1e-5; - - // spine-core/src/Slot.ts - var Slot = class { - constructor(data, bone) { - this.deform = new Array(); - if (!data) - throw new Error("data cannot be null."); - if (!bone) - throw new Error("bone cannot be null."); - this.data = data; - this.bone = bone; - this.color = new Color(); - this.darkColor = !data.darkColor ? null : new Color(); - this.setToSetupPose(); - } - getSkeleton() { - return this.bone.skeleton; - } - getAttachment() { - return this.attachment; - } - setAttachment(attachment) { - if (this.attachment == attachment) - return; - if (!(attachment instanceof VertexAttachment) || !(this.attachment instanceof VertexAttachment) || attachment.deformAttachment != this.attachment.deformAttachment) { - this.deform.length = 0; - } - this.attachment = attachment; - this.attachmentTime = this.bone.skeleton.time; - } - setAttachmentTime(time) { - this.attachmentTime = this.bone.skeleton.time - time; - } - getAttachmentTime() { - return this.bone.skeleton.time - this.attachmentTime; - } - setToSetupPose() { - this.color.setFromColor(this.data.color); - if (this.darkColor) - this.darkColor.setFromColor(this.data.darkColor); - if (!this.data.attachmentName) - this.attachment = null; - else { - this.attachment = null; - this.setAttachment(this.bone.skeleton.getAttachment(this.data.index, this.data.attachmentName)); - } - } - }; - - // spine-core/src/TransformConstraint.ts - var TransformConstraint = class { - constructor(data, skeleton) { - this.mixRotate = 0; - this.mixX = 0; - this.mixY = 0; - this.mixScaleX = 0; - this.mixScaleY = 0; - this.mixShearY = 0; - this.temp = new Vector2(); - this.active = false; - if (!data) - throw new Error("data cannot be null."); - if (!skeleton) - throw new Error("skeleton cannot be null."); - this.data = data; - this.mixRotate = data.mixRotate; - this.mixX = data.mixX; - this.mixY = data.mixY; - this.mixScaleX = data.mixScaleX; - this.mixScaleY = data.mixScaleY; - this.mixShearY = data.mixShearY; - this.bones = new Array(); - for (let i = 0; i < data.bones.length; i++) - this.bones.push(skeleton.findBone(data.bones[i].name)); - this.target = skeleton.findBone(data.target.name); - } - isActive() { - return this.active; - } - update() { - if (this.mixRotate == 0 && this.mixX == 0 && this.mixY == 0 && this.mixScaleX == 0 && this.mixScaleX == 0 && this.mixShearY == 0) - return; - if (this.data.local) { - if (this.data.relative) - this.applyRelativeLocal(); - else - this.applyAbsoluteLocal(); - } else { - if (this.data.relative) - this.applyRelativeWorld(); - else - this.applyAbsoluteWorld(); - } - } - applyAbsoluteWorld() { - let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX, mixScaleY = this.mixScaleY, mixShearY = this.mixShearY; - let translate = mixX != 0 || mixY != 0; - let target = this.target; - let ta = target.a, tb = target.b, tc = target.c, td = target.d; - let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad; - let offsetRotation = this.data.offsetRotation * degRadReflect; - let offsetShearY = this.data.offsetShearY * degRadReflect; - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - if (mixRotate != 0) { - let a = bone.a, b = bone.b, c = bone.c, d = bone.d; - let r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation; - if (r > MathUtils.PI) - r -= MathUtils.PI2; - else if (r < -MathUtils.PI) - r += MathUtils.PI2; - r *= mixRotate; - let cos = Math.cos(r), sin = Math.sin(r); - bone.a = cos * a - sin * c; - bone.b = cos * b - sin * d; - bone.c = sin * a + cos * c; - bone.d = sin * b + cos * d; - } - if (translate) { - let temp = this.temp; - target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); - bone.worldX += (temp.x - bone.worldX) * mixX; - bone.worldY += (temp.y - bone.worldY) * mixY; - } - if (mixScaleX != 0) { - let s = Math.sqrt(bone.a * bone.a + bone.c * bone.c); - if (s != 0) - s = (s + (Math.sqrt(ta * ta + tc * tc) - s + this.data.offsetScaleX) * mixScaleX) / s; - bone.a *= s; - bone.c *= s; - } - if (mixScaleY != 0) { - let s = Math.sqrt(bone.b * bone.b + bone.d * bone.d); - if (s != 0) - s = (s + (Math.sqrt(tb * tb + td * td) - s + this.data.offsetScaleY) * mixScaleY) / s; - bone.b *= s; - bone.d *= s; - } - if (mixShearY > 0) { - let b = bone.b, d = bone.d; - let by = Math.atan2(d, b); - let r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(bone.c, bone.a)); - if (r > MathUtils.PI) - r -= MathUtils.PI2; - else if (r < -MathUtils.PI) - r += MathUtils.PI2; - r = by + (r + offsetShearY) * mixShearY; - let s = Math.sqrt(b * b + d * d); - bone.b = Math.cos(r) * s; - bone.d = Math.sin(r) * s; - } - bone.updateAppliedTransform(); - } - } - applyRelativeWorld() { - let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX, mixScaleY = this.mixScaleY, mixShearY = this.mixShearY; - let translate = mixX != 0 || mixY != 0; - let target = this.target; - let ta = target.a, tb = target.b, tc = target.c, td = target.d; - let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad; - let offsetRotation = this.data.offsetRotation * degRadReflect, offsetShearY = this.data.offsetShearY * degRadReflect; - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - if (mixRotate != 0) { - let a = bone.a, b = bone.b, c = bone.c, d = bone.d; - let r = Math.atan2(tc, ta) + offsetRotation; - if (r > MathUtils.PI) - r -= MathUtils.PI2; - else if (r < -MathUtils.PI) - r += MathUtils.PI2; - r *= mixRotate; - let cos = Math.cos(r), sin = Math.sin(r); - bone.a = cos * a - sin * c; - bone.b = cos * b - sin * d; - bone.c = sin * a + cos * c; - bone.d = sin * b + cos * d; - } - if (translate) { - let temp = this.temp; - target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); - bone.worldX += temp.x * mixX; - bone.worldY += temp.y * mixY; - } - if (mixScaleX != 0) { - let s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * mixScaleX + 1; - bone.a *= s; - bone.c *= s; - } - if (mixScaleY != 0) { - let s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * mixScaleY + 1; - bone.b *= s; - bone.d *= s; - } - if (mixShearY > 0) { - let r = Math.atan2(td, tb) - Math.atan2(tc, ta); - if (r > MathUtils.PI) - r -= MathUtils.PI2; - else if (r < -MathUtils.PI) - r += MathUtils.PI2; - let b = bone.b, d = bone.d; - r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * mixShearY; - let s = Math.sqrt(b * b + d * d); - bone.b = Math.cos(r) * s; - bone.d = Math.sin(r) * s; - } - bone.updateAppliedTransform(); - } - } - applyAbsoluteLocal() { - let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX, mixScaleY = this.mixScaleY, mixShearY = this.mixShearY; - let target = this.target; - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - let rotation = bone.arotation; - if (mixRotate != 0) { - let r = target.arotation - rotation + this.data.offsetRotation; - r -= (16384 - (16384.499999999996 - r / 360 | 0)) * 360; - rotation += r * mixRotate; - } - let x = bone.ax, y = bone.ay; - x += (target.ax - x + this.data.offsetX) * mixX; - y += (target.ay - y + this.data.offsetY) * mixY; - let scaleX = bone.ascaleX, scaleY = bone.ascaleY; - if (mixScaleX != 0 && scaleX != 0) - scaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * mixScaleX) / scaleX; - if (mixScaleY != 0 && scaleY != 0) - scaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * mixScaleY) / scaleY; - let shearY = bone.ashearY; - if (mixShearY != 0) { - let r = target.ashearY - shearY + this.data.offsetShearY; - r -= (16384 - (16384.499999999996 - r / 360 | 0)) * 360; - shearY += r * mixShearY; - } - bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); - } - } - applyRelativeLocal() { - let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX, mixScaleY = this.mixScaleY, mixShearY = this.mixShearY; - let target = this.target; - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - let rotation = bone.arotation + (target.arotation + this.data.offsetRotation) * mixRotate; - let x = bone.ax + (target.ax + this.data.offsetX) * mixX; - let y = bone.ay + (target.ay + this.data.offsetY) * mixY; - let scaleX = bone.ascaleX * ((target.ascaleX - 1 + this.data.offsetScaleX) * mixScaleX) + 1; - let scaleY = bone.ascaleY * ((target.ascaleY - 1 + this.data.offsetScaleY) * mixScaleY) + 1; - let shearY = bone.ashearY + (target.ashearY + this.data.offsetShearY) * mixShearY; - bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); - } - } - }; - - // spine-core/src/Skeleton.ts - var Skeleton = class { - constructor(data) { - this._updateCache = new Array(); - this.time = 0; - this.scaleX = 1; - this.scaleY = 1; - this.x = 0; - this.y = 0; - if (!data) - throw new Error("data cannot be null."); - this.data = data; - this.bones = new Array(); - for (let i = 0; i < data.bones.length; i++) { - let boneData = data.bones[i]; - let bone; - if (!boneData.parent) - bone = new Bone(boneData, this, null); - else { - let parent = this.bones[boneData.parent.index]; - bone = new Bone(boneData, this, parent); - parent.children.push(bone); - } - this.bones.push(bone); - } - this.slots = new Array(); - this.drawOrder = new Array(); - for (let i = 0; i < data.slots.length; i++) { - let slotData = data.slots[i]; - let bone = this.bones[slotData.boneData.index]; - let slot = new Slot(slotData, bone); - this.slots.push(slot); - this.drawOrder.push(slot); - } - this.ikConstraints = new Array(); - for (let i = 0; i < data.ikConstraints.length; i++) { - let ikConstraintData = data.ikConstraints[i]; - this.ikConstraints.push(new IkConstraint(ikConstraintData, this)); - } - this.transformConstraints = new Array(); - for (let i = 0; i < data.transformConstraints.length; i++) { - let transformConstraintData = data.transformConstraints[i]; - this.transformConstraints.push(new TransformConstraint(transformConstraintData, this)); - } - this.pathConstraints = new Array(); - for (let i = 0; i < data.pathConstraints.length; i++) { - let pathConstraintData = data.pathConstraints[i]; - this.pathConstraints.push(new PathConstraint(pathConstraintData, this)); - } - this.color = new Color(1, 1, 1, 1); - this.updateCache(); - } - updateCache() { - let updateCache = this._updateCache; - updateCache.length = 0; - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - bone.sorted = bone.data.skinRequired; - bone.active = !bone.sorted; - } - if (this.skin) { - let skinBones = this.skin.bones; - for (let i = 0, n = this.skin.bones.length; i < n; i++) { - let bone = this.bones[skinBones[i].index]; - do { - bone.sorted = false; - bone.active = true; - bone = bone.parent; - } while (bone); - } - } - let ikConstraints = this.ikConstraints; - let transformConstraints = this.transformConstraints; - let pathConstraints = this.pathConstraints; - let ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length; - let constraintCount = ikCount + transformCount + pathCount; - outer: - for (let i = 0; i < constraintCount; i++) { - for (let ii = 0; ii < ikCount; ii++) { - let constraint = ikConstraints[ii]; - if (constraint.data.order == i) { - this.sortIkConstraint(constraint); - continue outer; - } - } - for (let ii = 0; ii < transformCount; ii++) { - let constraint = transformConstraints[ii]; - if (constraint.data.order == i) { - this.sortTransformConstraint(constraint); - continue outer; - } - } - for (let ii = 0; ii < pathCount; ii++) { - let constraint = pathConstraints[ii]; - if (constraint.data.order == i) { - this.sortPathConstraint(constraint); - continue outer; - } - } - } - for (let i = 0, n = bones.length; i < n; i++) - this.sortBone(bones[i]); - } - sortIkConstraint(constraint) { - constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || this.skin && Utils.contains(this.skin.constraints, constraint.data, true)); - if (!constraint.active) - return; - let target = constraint.target; - this.sortBone(target); - let constrained = constraint.bones; - let parent = constrained[0]; - this.sortBone(parent); - if (constrained.length == 1) { - this._updateCache.push(constraint); - this.sortReset(parent.children); - } else { - let child = constrained[constrained.length - 1]; - this.sortBone(child); - this._updateCache.push(constraint); - this.sortReset(parent.children); - child.sorted = true; - } - } - sortPathConstraint(constraint) { - constraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || this.skin && Utils.contains(this.skin.constraints, constraint.data, true)); - if (!constraint.active) - return; - let slot = constraint.target; - let slotIndex = slot.data.index; - let slotBone = slot.bone; - if (this.skin) - this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone); - if (this.data.defaultSkin && this.data.defaultSkin != this.skin) - this.sortPathConstraintAttachment(this.data.defaultSkin, slotIndex, slotBone); - for (let i = 0, n = this.data.skins.length; i < n; i++) - this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone); - let attachment = slot.getAttachment(); - if (attachment instanceof PathAttachment) - this.sortPathConstraintAttachmentWith(attachment, slotBone); - let constrained = constraint.bones; - let boneCount = constrained.length; - for (let i = 0; i < boneCount; i++) - this.sortBone(constrained[i]); - this._updateCache.push(constraint); - for (let i = 0; i < boneCount; i++) - this.sortReset(constrained[i].children); - for (let i = 0; i < boneCount; i++) - constrained[i].sorted = true; - } - sortTransformConstraint(constraint) { - constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || this.skin && Utils.contains(this.skin.constraints, constraint.data, true)); - if (!constraint.active) - return; - this.sortBone(constraint.target); - let constrained = constraint.bones; - let boneCount = constrained.length; - if (constraint.data.local) { - for (let i = 0; i < boneCount; i++) { - let child = constrained[i]; - this.sortBone(child.parent); - this.sortBone(child); - } - } else { - for (let i = 0; i < boneCount; i++) { - this.sortBone(constrained[i]); - } - } - this._updateCache.push(constraint); - for (let i = 0; i < boneCount; i++) - this.sortReset(constrained[i].children); - for (let i = 0; i < boneCount; i++) - constrained[i].sorted = true; - } - sortPathConstraintAttachment(skin, slotIndex, slotBone) { - let attachments = skin.attachments[slotIndex]; - if (!attachments) - return; - for (let key in attachments) { - this.sortPathConstraintAttachmentWith(attachments[key], slotBone); - } - } - sortPathConstraintAttachmentWith(attachment, slotBone) { - if (!(attachment instanceof PathAttachment)) - return; - let pathBones = attachment.bones; - if (!pathBones) - this.sortBone(slotBone); - else { - let bones = this.bones; - for (let i = 0, n = pathBones.length; i < n; ) { - let nn = pathBones[i++]; - nn += i; - while (i < nn) - this.sortBone(bones[pathBones[i++]]); - } - } - } - sortBone(bone) { - if (bone.sorted) - return; - let parent = bone.parent; - if (parent) - this.sortBone(parent); - bone.sorted = true; - this._updateCache.push(bone); - } - sortReset(bones) { - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - if (!bone.active) - continue; - if (bone.sorted) - this.sortReset(bone.children); - bone.sorted = false; - } - } - updateWorldTransform() { - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - bone.ax = bone.x; - bone.ay = bone.y; - bone.arotation = bone.rotation; - bone.ascaleX = bone.scaleX; - bone.ascaleY = bone.scaleY; - bone.ashearX = bone.shearX; - bone.ashearY = bone.shearY; - } - let updateCache = this._updateCache; - for (let i = 0, n = updateCache.length; i < n; i++) - updateCache[i].update(); - } - updateWorldTransformWith(parent) { - let rootBone = this.getRootBone(); - let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; - rootBone.worldX = pa * this.x + pb * this.y + parent.worldX; - rootBone.worldY = pc * this.x + pd * this.y + parent.worldY; - let rotationY = rootBone.rotation + 90 + rootBone.shearY; - let la = MathUtils.cosDeg(rootBone.rotation + rootBone.shearX) * rootBone.scaleX; - let lb = MathUtils.cosDeg(rotationY) * rootBone.scaleY; - let lc = MathUtils.sinDeg(rootBone.rotation + rootBone.shearX) * rootBone.scaleX; - let ld = MathUtils.sinDeg(rotationY) * rootBone.scaleY; - rootBone.a = (pa * la + pb * lc) * this.scaleX; - rootBone.b = (pa * lb + pb * ld) * this.scaleX; - rootBone.c = (pc * la + pd * lc) * this.scaleY; - rootBone.d = (pc * lb + pd * ld) * this.scaleY; - let updateCache = this._updateCache; - for (let i = 0, n = updateCache.length; i < n; i++) { - let updatable = updateCache[i]; - if (updatable != rootBone) - updatable.update(); - } - } - setToSetupPose() { - this.setBonesToSetupPose(); - this.setSlotsToSetupPose(); - } - setBonesToSetupPose() { - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) - bones[i].setToSetupPose(); - let ikConstraints = this.ikConstraints; - for (let i = 0, n = ikConstraints.length; i < n; i++) { - let constraint = ikConstraints[i]; - constraint.mix = constraint.data.mix; - constraint.softness = constraint.data.softness; - constraint.bendDirection = constraint.data.bendDirection; - constraint.compress = constraint.data.compress; - constraint.stretch = constraint.data.stretch; - } - let transformConstraints = this.transformConstraints; - for (let i = 0, n = transformConstraints.length; i < n; i++) { - let constraint = transformConstraints[i]; - let data = constraint.data; - constraint.mixRotate = data.mixRotate; - constraint.mixX = data.mixX; - constraint.mixY = data.mixY; - constraint.mixScaleX = data.mixScaleX; - constraint.mixScaleY = data.mixScaleY; - constraint.mixShearY = data.mixShearY; - } - let pathConstraints = this.pathConstraints; - for (let i = 0, n = pathConstraints.length; i < n; i++) { - let constraint = pathConstraints[i]; - let data = constraint.data; - constraint.position = data.position; - constraint.spacing = data.spacing; - constraint.mixRotate = data.mixRotate; - constraint.mixX = data.mixX; - constraint.mixY = data.mixY; - } - } - setSlotsToSetupPose() { - let slots = this.slots; - Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length); - for (let i = 0, n = slots.length; i < n; i++) - slots[i].setToSetupPose(); - } - getRootBone() { - if (this.bones.length == 0) - return null; - return this.bones[0]; - } - findBone(boneName) { - if (!boneName) - throw new Error("boneName cannot be null."); - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - if (bone.data.name == boneName) - return bone; - } - return null; - } - findBoneIndex(boneName) { - if (!boneName) - throw new Error("boneName cannot be null."); - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) - if (bones[i].data.name == boneName) - return i; - return -1; - } - findSlot(slotName) { - if (!slotName) - throw new Error("slotName cannot be null."); - let slots = this.slots; - for (let i = 0, n = slots.length; i < n; i++) { - let slot = slots[i]; - if (slot.data.name == slotName) - return slot; - } - return null; - } - findSlotIndex(slotName) { - if (!slotName) - throw new Error("slotName cannot be null."); - let slots = this.slots; - for (let i = 0, n = slots.length; i < n; i++) - if (slots[i].data.name == slotName) - return i; - return -1; - } - setSkinByName(skinName) { - let skin = this.data.findSkin(skinName); - if (!skin) - throw new Error("Skin not found: " + skinName); - this.setSkin(skin); - } - setSkin(newSkin) { - if (newSkin == this.skin) - return; - if (newSkin) { - if (this.skin) - newSkin.attachAll(this, this.skin); - else { - let slots = this.slots; - for (let i = 0, n = slots.length; i < n; i++) { - let slot = slots[i]; - let name = slot.data.attachmentName; - if (name) { - let attachment = newSkin.getAttachment(i, name); - if (attachment) - slot.setAttachment(attachment); - } - } - } - } - this.skin = newSkin; - this.updateCache(); - } - getAttachmentByName(slotName, attachmentName) { - return this.getAttachment(this.data.findSlotIndex(slotName), attachmentName); - } - getAttachment(slotIndex, attachmentName) { - if (!attachmentName) - throw new Error("attachmentName cannot be null."); - if (this.skin) { - let attachment = this.skin.getAttachment(slotIndex, attachmentName); - if (attachment) - return attachment; - } - if (this.data.defaultSkin) - return this.data.defaultSkin.getAttachment(slotIndex, attachmentName); - return null; - } - setAttachment(slotName, attachmentName) { - if (!slotName) - throw new Error("slotName cannot be null."); - let slots = this.slots; - for (let i = 0, n = slots.length; i < n; i++) { - let slot = slots[i]; - if (slot.data.name == slotName) { - let attachment = null; - if (attachmentName) { - attachment = this.getAttachment(i, attachmentName); - if (!attachment) - throw new Error("Attachment not found: " + attachmentName + ", for slot: " + slotName); - } - slot.setAttachment(attachment); - return; - } - } - throw new Error("Slot not found: " + slotName); - } - findIkConstraint(constraintName) { - if (!constraintName) - throw new Error("constraintName cannot be null."); - let ikConstraints = this.ikConstraints; - for (let i = 0, n = ikConstraints.length; i < n; i++) { - let ikConstraint = ikConstraints[i]; - if (ikConstraint.data.name == constraintName) - return ikConstraint; - } - return null; - } - findTransformConstraint(constraintName) { - if (!constraintName) - throw new Error("constraintName cannot be null."); - let transformConstraints = this.transformConstraints; - for (let i = 0, n = transformConstraints.length; i < n; i++) { - let constraint = transformConstraints[i]; - if (constraint.data.name == constraintName) - return constraint; - } - return null; - } - findPathConstraint(constraintName) { - if (!constraintName) - throw new Error("constraintName cannot be null."); - let pathConstraints = this.pathConstraints; - for (let i = 0, n = pathConstraints.length; i < n; i++) { - let constraint = pathConstraints[i]; - if (constraint.data.name == constraintName) - return constraint; - } - return null; - } - getBounds(offset, size, temp = new Array(2)) { - if (!offset) - throw new Error("offset cannot be null."); - if (!size) - throw new Error("size cannot be null."); - let drawOrder = this.drawOrder; - let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY; - for (let i = 0, n = drawOrder.length; i < n; i++) { - let slot = drawOrder[i]; - if (!slot.bone.active) - continue; - let verticesLength = 0; - let vertices = null; - let attachment = slot.getAttachment(); - if (attachment instanceof RegionAttachment) { - verticesLength = 8; - vertices = Utils.setArraySize(temp, verticesLength, 0); - attachment.computeWorldVertices(slot.bone, vertices, 0, 2); - } else if (attachment instanceof MeshAttachment) { - let mesh = attachment; - verticesLength = mesh.worldVerticesLength; - vertices = Utils.setArraySize(temp, verticesLength, 0); - mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2); - } - if (vertices) { - for (let ii = 0, nn = vertices.length; ii < nn; ii += 2) { - let x = vertices[ii], y = vertices[ii + 1]; - minX = Math.min(minX, x); - minY = Math.min(minY, y); - maxX = Math.max(maxX, x); - maxY = Math.max(maxY, y); - } - } - } - offset.set(minX, minY); - size.set(maxX - minX, maxY - minY); - } - update(delta) { - this.time += delta; - } - }; - - // spine-core/src/SkeletonData.ts - var SkeletonData = class { - constructor() { - this.bones = new Array(); - this.slots = new Array(); - this.skins = new Array(); - this.events = new Array(); - this.animations = new Array(); - this.ikConstraints = new Array(); - this.transformConstraints = new Array(); - this.pathConstraints = new Array(); - this.fps = 0; - } - findBone(boneName) { - if (!boneName) - throw new Error("boneName cannot be null."); - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) { - let bone = bones[i]; - if (bone.name == boneName) - return bone; - } - return null; - } - findBoneIndex(boneName) { - if (!boneName) - throw new Error("boneName cannot be null."); - let bones = this.bones; - for (let i = 0, n = bones.length; i < n; i++) - if (bones[i].name == boneName) - return i; - return -1; - } - findSlot(slotName) { - if (!slotName) - throw new Error("slotName cannot be null."); - let slots = this.slots; - for (let i = 0, n = slots.length; i < n; i++) { - let slot = slots[i]; - if (slot.name == slotName) - return slot; - } - return null; - } - findSlotIndex(slotName) { - if (!slotName) - throw new Error("slotName cannot be null."); - let slots = this.slots; - for (let i = 0, n = slots.length; i < n; i++) - if (slots[i].name == slotName) - return i; - return -1; - } - findSkin(skinName) { - if (!skinName) - throw new Error("skinName cannot be null."); - let skins = this.skins; - for (let i = 0, n = skins.length; i < n; i++) { - let skin = skins[i]; - if (skin.name == skinName) - return skin; - } - return null; - } - findEvent(eventDataName) { - if (!eventDataName) - throw new Error("eventDataName cannot be null."); - let events = this.events; - for (let i = 0, n = events.length; i < n; i++) { - let event = events[i]; - if (event.name == eventDataName) - return event; - } - return null; - } - findAnimation(animationName) { - if (!animationName) - throw new Error("animationName cannot be null."); - let animations = this.animations; - for (let i = 0, n = animations.length; i < n; i++) { - let animation = animations[i]; - if (animation.name == animationName) - return animation; - } - return null; - } - findIkConstraint(constraintName) { - if (!constraintName) - throw new Error("constraintName cannot be null."); - let ikConstraints = this.ikConstraints; - for (let i = 0, n = ikConstraints.length; i < n; i++) { - let constraint = ikConstraints[i]; - if (constraint.name == constraintName) - return constraint; - } - return null; - } - findTransformConstraint(constraintName) { - if (!constraintName) - throw new Error("constraintName cannot be null."); - let transformConstraints = this.transformConstraints; - for (let i = 0, n = transformConstraints.length; i < n; i++) { - let constraint = transformConstraints[i]; - if (constraint.name == constraintName) - return constraint; - } - return null; - } - findPathConstraint(constraintName) { - if (!constraintName) - throw new Error("constraintName cannot be null."); - let pathConstraints = this.pathConstraints; - for (let i = 0, n = pathConstraints.length; i < n; i++) { - let constraint = pathConstraints[i]; - if (constraint.name == constraintName) - return constraint; - } - return null; - } - }; - - // spine-core/src/Skin.ts - var SkinEntry = class { - constructor(slotIndex, name, attachment) { - this.slotIndex = slotIndex; - this.name = name; - this.attachment = attachment; - } - }; - var Skin = class { - constructor(name) { - this.attachments = new Array(); - this.bones = Array(); - this.constraints = new Array(); - if (!name) - throw new Error("name cannot be null."); - this.name = name; - } - setAttachment(slotIndex, name, attachment) { - if (!attachment) - throw new Error("attachment cannot be null."); - let attachments = this.attachments; - if (slotIndex >= attachments.length) - attachments.length = slotIndex + 1; - if (!attachments[slotIndex]) - attachments[slotIndex] = {}; - attachments[slotIndex][name] = attachment; - } - addSkin(skin) { - for (let i = 0; i < skin.bones.length; i++) { - let bone = skin.bones[i]; - let contained = false; - for (let ii = 0; ii < this.bones.length; ii++) { - if (this.bones[ii] == bone) { - contained = true; - break; - } - } - if (!contained) - this.bones.push(bone); - } - for (let i = 0; i < skin.constraints.length; i++) { - let constraint = skin.constraints[i]; - let contained = false; - for (let ii = 0; ii < this.constraints.length; ii++) { - if (this.constraints[ii] == constraint) { - contained = true; - break; - } - } - if (!contained) - this.constraints.push(constraint); - } - let attachments = skin.getAttachments(); - for (let i = 0; i < attachments.length; i++) { - var attachment = attachments[i]; - this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment); - } - } - copySkin(skin) { - for (let i = 0; i < skin.bones.length; i++) { - let bone = skin.bones[i]; - let contained = false; - for (let ii = 0; ii < this.bones.length; ii++) { - if (this.bones[ii] == bone) { - contained = true; - break; - } - } - if (!contained) - this.bones.push(bone); - } - for (let i = 0; i < skin.constraints.length; i++) { - let constraint = skin.constraints[i]; - let contained = false; - for (let ii = 0; ii < this.constraints.length; ii++) { - if (this.constraints[ii] == constraint) { - contained = true; - break; - } - } - if (!contained) - this.constraints.push(constraint); - } - let attachments = skin.getAttachments(); - for (let i = 0; i < attachments.length; i++) { - var attachment = attachments[i]; - if (!attachment.attachment) - continue; - if (attachment.attachment instanceof MeshAttachment) { - attachment.attachment = attachment.attachment.newLinkedMesh(); - this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment); - } else { - attachment.attachment = attachment.attachment.copy(); - this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment); - } - } - } - getAttachment(slotIndex, name) { - let dictionary = this.attachments[slotIndex]; - return dictionary ? dictionary[name] : null; - } - removeAttachment(slotIndex, name) { - let dictionary = this.attachments[slotIndex]; - if (dictionary) - dictionary[name] = null; - } - getAttachments() { - let entries = new Array(); - for (var i = 0; i < this.attachments.length; i++) { - let slotAttachments = this.attachments[i]; - if (slotAttachments) { - for (let name in slotAttachments) { - let attachment = slotAttachments[name]; - if (attachment) - entries.push(new SkinEntry(i, name, attachment)); - } - } - } - return entries; - } - getAttachmentsForSlot(slotIndex, attachments) { - let slotAttachments = this.attachments[slotIndex]; - if (slotAttachments) { - for (let name in slotAttachments) { - let attachment = slotAttachments[name]; - if (attachment) - attachments.push(new SkinEntry(slotIndex, name, attachment)); - } - } - } - clear() { - this.attachments.length = 0; - this.bones.length = 0; - this.constraints.length = 0; - } - attachAll(skeleton, oldSkin) { - let slotIndex = 0; - for (let i = 0; i < skeleton.slots.length; i++) { - let slot = skeleton.slots[i]; - let slotAttachment = slot.getAttachment(); - if (slotAttachment && slotIndex < oldSkin.attachments.length) { - let dictionary = oldSkin.attachments[slotIndex]; - for (let key in dictionary) { - let skinAttachment = dictionary[key]; - if (slotAttachment == skinAttachment) { - let attachment = this.getAttachment(slotIndex, key); - if (attachment) - slot.setAttachment(attachment); - break; - } - } - } - slotIndex++; - } - } - }; - - // spine-core/src/SlotData.ts - var SlotData = class { - constructor(index, name, boneData) { - this.color = new Color(1, 1, 1, 1); - if (index < 0) - throw new Error("index must be >= 0."); - if (!name) - throw new Error("name cannot be null."); - if (!boneData) - throw new Error("boneData cannot be null."); - this.index = index; - this.name = name; - this.boneData = boneData; - } - }; - var BlendMode; - (function(BlendMode3) { - BlendMode3[BlendMode3["Normal"] = 0] = "Normal"; - BlendMode3[BlendMode3["Additive"] = 1] = "Additive"; - BlendMode3[BlendMode3["Multiply"] = 2] = "Multiply"; - BlendMode3[BlendMode3["Screen"] = 3] = "Screen"; - })(BlendMode || (BlendMode = {})); - - // spine-core/src/TransformConstraintData.ts - var TransformConstraintData = class extends ConstraintData { - constructor(name) { - super(name, 0, false); - this.bones = new Array(); - this.mixRotate = 0; - this.mixX = 0; - this.mixY = 0; - this.mixScaleX = 0; - this.mixScaleY = 0; - this.mixShearY = 0; - this.offsetRotation = 0; - this.offsetX = 0; - this.offsetY = 0; - this.offsetScaleX = 0; - this.offsetScaleY = 0; - this.offsetShearY = 0; - this.relative = false; - this.local = false; - } - }; - - // spine-core/src/SkeletonBinary.ts - var SkeletonBinary = class { - constructor(attachmentLoader) { - this.scale = 1; - this.linkedMeshes = new Array(); - this.attachmentLoader = attachmentLoader; - } - readSkeletonData(binary) { - let scale = this.scale; - let skeletonData = new SkeletonData(); - skeletonData.name = ""; - let input = new BinaryInput(binary); - let lowHash = input.readInt32(); - let highHash = input.readInt32(); - skeletonData.hash = highHash == 0 && lowHash == 0 ? null : highHash.toString(16) + lowHash.toString(16); - skeletonData.version = input.readString(); - skeletonData.x = input.readFloat(); - skeletonData.y = input.readFloat(); - skeletonData.width = input.readFloat(); - skeletonData.height = input.readFloat(); - let nonessential = input.readBoolean(); - if (nonessential) { - skeletonData.fps = input.readFloat(); - skeletonData.imagesPath = input.readString(); - skeletonData.audioPath = input.readString(); - } - let n = 0; - n = input.readInt(true); - for (let i = 0; i < n; i++) - input.strings.push(input.readString()); - n = input.readInt(true); - for (let i = 0; i < n; i++) { - let name = input.readString(); - let parent = i == 0 ? null : skeletonData.bones[input.readInt(true)]; - let data = new BoneData(i, name, parent); - data.rotation = input.readFloat(); - data.x = input.readFloat() * scale; - data.y = input.readFloat() * scale; - data.scaleX = input.readFloat(); - data.scaleY = input.readFloat(); - data.shearX = input.readFloat(); - data.shearY = input.readFloat(); - data.length = input.readFloat() * scale; - data.transformMode = input.readInt(true); - data.skinRequired = input.readBoolean(); - if (nonessential) - Color.rgba8888ToColor(data.color, input.readInt32()); - skeletonData.bones.push(data); - } - n = input.readInt(true); - for (let i = 0; i < n; i++) { - let slotName = input.readString(); - let boneData = skeletonData.bones[input.readInt(true)]; - let data = new SlotData(i, slotName, boneData); - Color.rgba8888ToColor(data.color, input.readInt32()); - let darkColor = input.readInt32(); - if (darkColor != -1) - Color.rgb888ToColor(data.darkColor = new Color(), darkColor); - data.attachmentName = input.readStringRef(); - data.blendMode = input.readInt(true); - skeletonData.slots.push(data); - } - n = input.readInt(true); - for (let i = 0, nn; i < n; i++) { - let data = new IkConstraintData(input.readString()); - data.order = input.readInt(true); - data.skinRequired = input.readBoolean(); - nn = input.readInt(true); - for (let ii = 0; ii < nn; ii++) - data.bones.push(skeletonData.bones[input.readInt(true)]); - data.target = skeletonData.bones[input.readInt(true)]; - data.mix = input.readFloat(); - data.softness = input.readFloat() * scale; - data.bendDirection = input.readByte(); - data.compress = input.readBoolean(); - data.stretch = input.readBoolean(); - data.uniform = input.readBoolean(); - skeletonData.ikConstraints.push(data); - } - n = input.readInt(true); - for (let i = 0, nn; i < n; i++) { - let data = new TransformConstraintData(input.readString()); - data.order = input.readInt(true); - data.skinRequired = input.readBoolean(); - nn = input.readInt(true); - for (let ii = 0; ii < nn; ii++) - data.bones.push(skeletonData.bones[input.readInt(true)]); - data.target = skeletonData.bones[input.readInt(true)]; - data.local = input.readBoolean(); - data.relative = input.readBoolean(); - data.offsetRotation = input.readFloat(); - data.offsetX = input.readFloat() * scale; - data.offsetY = input.readFloat() * scale; - data.offsetScaleX = input.readFloat(); - data.offsetScaleY = input.readFloat(); - data.offsetShearY = input.readFloat(); - data.mixRotate = input.readFloat(); - data.mixX = input.readFloat(); - data.mixY = input.readFloat(); - data.mixScaleX = input.readFloat(); - data.mixScaleY = input.readFloat(); - data.mixShearY = input.readFloat(); - skeletonData.transformConstraints.push(data); - } - n = input.readInt(true); - for (let i = 0, nn; i < n; i++) { - let data = new PathConstraintData(input.readString()); - data.order = input.readInt(true); - data.skinRequired = input.readBoolean(); - nn = input.readInt(true); - for (let ii = 0; ii < nn; ii++) - data.bones.push(skeletonData.bones[input.readInt(true)]); - data.target = skeletonData.slots[input.readInt(true)]; - data.positionMode = input.readInt(true); - data.spacingMode = input.readInt(true); - data.rotateMode = input.readInt(true); - data.offsetRotation = input.readFloat(); - data.position = input.readFloat(); - if (data.positionMode == PositionMode.Fixed) - data.position *= scale; - data.spacing = input.readFloat(); - if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) - data.spacing *= scale; - data.mixRotate = input.readFloat(); - data.mixX = input.readFloat(); - data.mixY = input.readFloat(); - skeletonData.pathConstraints.push(data); - } - let defaultSkin = this.readSkin(input, skeletonData, true, nonessential); - if (defaultSkin) { - skeletonData.defaultSkin = defaultSkin; - skeletonData.skins.push(defaultSkin); - } - { - let i = skeletonData.skins.length; - Utils.setArraySize(skeletonData.skins, n = i + input.readInt(true)); - for (; i < n; i++) - skeletonData.skins[i] = this.readSkin(input, skeletonData, false, nonessential); - } - n = this.linkedMeshes.length; - for (let i = 0; i < n; i++) { - let linkedMesh = this.linkedMeshes[i]; - let skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); - let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); - linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh; - linkedMesh.mesh.setParentMesh(parent); - linkedMesh.mesh.updateUVs(); - } - this.linkedMeshes.length = 0; - n = input.readInt(true); - for (let i = 0; i < n; i++) { - let data = new EventData(input.readStringRef()); - data.intValue = input.readInt(false); - data.floatValue = input.readFloat(); - data.stringValue = input.readString(); - data.audioPath = input.readString(); - if (data.audioPath) { - data.volume = input.readFloat(); - data.balance = input.readFloat(); - } - skeletonData.events.push(data); - } - n = input.readInt(true); - for (let i = 0; i < n; i++) - skeletonData.animations.push(this.readAnimation(input, input.readString(), skeletonData)); - return skeletonData; - } - readSkin(input, skeletonData, defaultSkin, nonessential) { - let skin = null; - let slotCount = 0; - if (defaultSkin) { - slotCount = input.readInt(true); - if (slotCount == 0) - return null; - skin = new Skin("default"); - } else { - skin = new Skin(input.readStringRef()); - skin.bones.length = input.readInt(true); - for (let i = 0, n = skin.bones.length; i < n; i++) - skin.bones[i] = skeletonData.bones[input.readInt(true)]; - for (let i = 0, n = input.readInt(true); i < n; i++) - skin.constraints.push(skeletonData.ikConstraints[input.readInt(true)]); - for (let i = 0, n = input.readInt(true); i < n; i++) - skin.constraints.push(skeletonData.transformConstraints[input.readInt(true)]); - for (let i = 0, n = input.readInt(true); i < n; i++) - skin.constraints.push(skeletonData.pathConstraints[input.readInt(true)]); - slotCount = input.readInt(true); - } - for (let i = 0; i < slotCount; i++) { - let slotIndex = input.readInt(true); - for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) { - let name = input.readStringRef(); - let attachment = this.readAttachment(input, skeletonData, skin, slotIndex, name, nonessential); - if (attachment) - skin.setAttachment(slotIndex, name, attachment); - } - } - return skin; - } - readAttachment(input, skeletonData, skin, slotIndex, attachmentName, nonessential) { - let scale = this.scale; - let name = input.readStringRef(); - if (!name) - name = attachmentName; - switch (input.readByte()) { - case AttachmentType.Region: { - let path = input.readStringRef(); - let rotation = input.readFloat(); - let x = input.readFloat(); - let y = input.readFloat(); - let scaleX = input.readFloat(); - let scaleY = input.readFloat(); - let width = input.readFloat(); - let height = input.readFloat(); - let color = input.readInt32(); - if (!path) - path = name; - let region = this.attachmentLoader.newRegionAttachment(skin, name, path); - if (!region) - return null; - region.path = path; - region.x = x * scale; - region.y = y * scale; - region.scaleX = scaleX; - region.scaleY = scaleY; - region.rotation = rotation; - region.width = width * scale; - region.height = height * scale; - Color.rgba8888ToColor(region.color, color); - region.updateOffset(); - return region; - } - case AttachmentType.BoundingBox: { - let vertexCount = input.readInt(true); - let vertices = this.readVertices(input, vertexCount); - let color = nonessential ? input.readInt32() : 0; - let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name); - if (!box) - return null; - box.worldVerticesLength = vertexCount << 1; - box.vertices = vertices.vertices; - box.bones = vertices.bones; - if (nonessential) - Color.rgba8888ToColor(box.color, color); - return box; - } - case AttachmentType.Mesh: { - let path = input.readStringRef(); - let color = input.readInt32(); - let vertexCount = input.readInt(true); - let uvs = this.readFloatArray(input, vertexCount << 1, 1); - let triangles = this.readShortArray(input); - let vertices = this.readVertices(input, vertexCount); - let hullLength = input.readInt(true); - let edges = null; - let width = 0, height = 0; - if (nonessential) { - edges = this.readShortArray(input); - width = input.readFloat(); - height = input.readFloat(); - } - if (!path) - path = name; - let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); - if (!mesh) - return null; - mesh.path = path; - Color.rgba8888ToColor(mesh.color, color); - mesh.bones = vertices.bones; - mesh.vertices = vertices.vertices; - mesh.worldVerticesLength = vertexCount << 1; - mesh.triangles = triangles; - mesh.regionUVs = uvs; - mesh.updateUVs(); - mesh.hullLength = hullLength << 1; - if (nonessential) { - mesh.edges = edges; - mesh.width = width * scale; - mesh.height = height * scale; - } - return mesh; - } - case AttachmentType.LinkedMesh: { - let path = input.readStringRef(); - let color = input.readInt32(); - let skinName = input.readStringRef(); - let parent = input.readStringRef(); - let inheritDeform = input.readBoolean(); - let width = 0, height = 0; - if (nonessential) { - width = input.readFloat(); - height = input.readFloat(); - } - if (!path) - path = name; - let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); - if (!mesh) - return null; - mesh.path = path; - Color.rgba8888ToColor(mesh.color, color); - if (nonessential) { - mesh.width = width * scale; - mesh.height = height * scale; - } - this.linkedMeshes.push(new LinkedMesh(mesh, skinName, slotIndex, parent, inheritDeform)); - return mesh; - } - case AttachmentType.Path: { - let closed2 = input.readBoolean(); - let constantSpeed = input.readBoolean(); - let vertexCount = input.readInt(true); - let vertices = this.readVertices(input, vertexCount); - let lengths = Utils.newArray(vertexCount / 3, 0); - for (let i = 0, n = lengths.length; i < n; i++) - lengths[i] = input.readFloat() * scale; - let color = nonessential ? input.readInt32() : 0; - let path = this.attachmentLoader.newPathAttachment(skin, name); - if (!path) - return null; - path.closed = closed2; - path.constantSpeed = constantSpeed; - path.worldVerticesLength = vertexCount << 1; - path.vertices = vertices.vertices; - path.bones = vertices.bones; - path.lengths = lengths; - if (nonessential) - Color.rgba8888ToColor(path.color, color); - return path; - } - case AttachmentType.Point: { - let rotation = input.readFloat(); - let x = input.readFloat(); - let y = input.readFloat(); - let color = nonessential ? input.readInt32() : 0; - let point = this.attachmentLoader.newPointAttachment(skin, name); - if (!point) - return null; - point.x = x * scale; - point.y = y * scale; - point.rotation = rotation; - if (nonessential) - Color.rgba8888ToColor(point.color, color); - return point; - } - case AttachmentType.Clipping: { - let endSlotIndex = input.readInt(true); - let vertexCount = input.readInt(true); - let vertices = this.readVertices(input, vertexCount); - let color = nonessential ? input.readInt32() : 0; - let clip = this.attachmentLoader.newClippingAttachment(skin, name); - if (!clip) - return null; - clip.endSlot = skeletonData.slots[endSlotIndex]; - clip.worldVerticesLength = vertexCount << 1; - clip.vertices = vertices.vertices; - clip.bones = vertices.bones; - if (nonessential) - Color.rgba8888ToColor(clip.color, color); - return clip; - } - } - return null; - } - readVertices(input, vertexCount) { - let scale = this.scale; - let verticesLength = vertexCount << 1; - let vertices = new Vertices(); - if (!input.readBoolean()) { - vertices.vertices = this.readFloatArray(input, verticesLength, scale); - return vertices; - } - let weights = new Array(); - let bonesArray = new Array(); - for (let i = 0; i < vertexCount; i++) { - let boneCount = input.readInt(true); - bonesArray.push(boneCount); - for (let ii = 0; ii < boneCount; ii++) { - bonesArray.push(input.readInt(true)); - weights.push(input.readFloat() * scale); - weights.push(input.readFloat() * scale); - weights.push(input.readFloat()); - } - } - vertices.vertices = Utils.toFloatArray(weights); - vertices.bones = bonesArray; - return vertices; - } - readFloatArray(input, n, scale) { - let array = new Array(n); - if (scale == 1) { - for (let i = 0; i < n; i++) - array[i] = input.readFloat(); - } else { - for (let i = 0; i < n; i++) - array[i] = input.readFloat() * scale; - } - return array; - } - readShortArray(input) { - let n = input.readInt(true); - let array = new Array(n); - for (let i = 0; i < n; i++) - array[i] = input.readShort(); - return array; - } - readAnimation(input, name, skeletonData) { - input.readInt(true); - let timelines = new Array(); - let scale = this.scale; - let tempColor1 = new Color(); - let tempColor2 = new Color(); - for (let i = 0, n = input.readInt(true); i < n; i++) { - let slotIndex = input.readInt(true); - for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) { - let timelineType = input.readByte(); - let frameCount = input.readInt(true); - let frameLast = frameCount - 1; - switch (timelineType) { - case SLOT_ATTACHMENT: { - let timeline = new AttachmentTimeline(frameCount, slotIndex); - for (let frame = 0; frame < frameCount; frame++) - timeline.setFrame(frame, input.readFloat(), input.readStringRef()); - timelines.push(timeline); - break; - } - case SLOT_RGBA: { - let bezierCount = input.readInt(true); - let timeline = new RGBATimeline(frameCount, bezierCount, slotIndex); - let time = input.readFloat(); - let r = input.readUnsignedByte() / 255; - let g = input.readUnsignedByte() / 255; - let b = input.readUnsignedByte() / 255; - let a = input.readUnsignedByte() / 255; - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, r, g, b, a); - if (frame == frameLast) - break; - let time2 = input.readFloat(); - let r2 = input.readUnsignedByte() / 255; - let g2 = input.readUnsignedByte() / 255; - let b2 = input.readUnsignedByte() / 255; - let a2 = input.readUnsignedByte() / 255; - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1); - setBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1); - setBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 1); - setBezier(input, timeline, bezier++, frame, 3, time, time2, a, a2, 1); - } - time = time2; - r = r2; - g = g2; - b = b2; - a = a2; - } - timelines.push(timeline); - break; - } - case SLOT_RGB: { - let bezierCount = input.readInt(true); - let timeline = new RGBTimeline(frameCount, bezierCount, slotIndex); - let time = input.readFloat(); - let r = input.readUnsignedByte() / 255; - let g = input.readUnsignedByte() / 255; - let b = input.readUnsignedByte() / 255; - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, r, g, b); - if (frame == frameLast) - break; - let time2 = input.readFloat(); - let r2 = input.readUnsignedByte() / 255; - let g2 = input.readUnsignedByte() / 255; - let b2 = input.readUnsignedByte() / 255; - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1); - setBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1); - setBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 1); - } - time = time2; - r = r2; - g = g2; - b = b2; - } - timelines.push(timeline); - break; - } - case SLOT_RGBA2: { - let bezierCount = input.readInt(true); - let timeline = new RGBA2Timeline(frameCount, bezierCount, slotIndex); - let time = input.readFloat(); - let r = input.readUnsignedByte() / 255; - let g = input.readUnsignedByte() / 255; - let b = input.readUnsignedByte() / 255; - let a = input.readUnsignedByte() / 255; - let r2 = input.readUnsignedByte() / 255; - let g2 = input.readUnsignedByte() / 255; - let b2 = input.readUnsignedByte() / 255; - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, r, g, b, a, r2, g2, b2); - if (frame == frameLast) - break; - let time2 = input.readFloat(); - let nr = input.readUnsignedByte() / 255; - let ng = input.readUnsignedByte() / 255; - let nb = input.readUnsignedByte() / 255; - let na = input.readUnsignedByte() / 255; - let nr2 = input.readUnsignedByte() / 255; - let ng2 = input.readUnsignedByte() / 255; - let nb2 = input.readUnsignedByte() / 255; - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1); - setBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1); - setBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1); - setBezier(input, timeline, bezier++, frame, 3, time, time2, a, na, 1); - setBezier(input, timeline, bezier++, frame, 4, time, time2, r2, nr2, 1); - setBezier(input, timeline, bezier++, frame, 5, time, time2, g2, ng2, 1); - setBezier(input, timeline, bezier++, frame, 6, time, time2, b2, nb2, 1); - } - time = time2; - r = nr; - g = ng; - b = nb; - a = na; - r2 = nr2; - g2 = ng2; - b2 = nb2; - } - timelines.push(timeline); - break; - } - case SLOT_RGB2: { - let bezierCount = input.readInt(true); - let timeline = new RGB2Timeline(frameCount, bezierCount, slotIndex); - let time = input.readFloat(); - let r = input.readUnsignedByte() / 255; - let g = input.readUnsignedByte() / 255; - let b = input.readUnsignedByte() / 255; - let r2 = input.readUnsignedByte() / 255; - let g2 = input.readUnsignedByte() / 255; - let b2 = input.readUnsignedByte() / 255; - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, r, g, b, r2, g2, b2); - if (frame == frameLast) - break; - let time2 = input.readFloat(); - let nr = input.readUnsignedByte() / 255; - let ng = input.readUnsignedByte() / 255; - let nb = input.readUnsignedByte() / 255; - let nr2 = input.readUnsignedByte() / 255; - let ng2 = input.readUnsignedByte() / 255; - let nb2 = input.readUnsignedByte() / 255; - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1); - setBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1); - setBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1); - setBezier(input, timeline, bezier++, frame, 3, time, time2, r2, nr2, 1); - setBezier(input, timeline, bezier++, frame, 4, time, time2, g2, ng2, 1); - setBezier(input, timeline, bezier++, frame, 5, time, time2, b2, nb2, 1); - } - time = time2; - r = nr; - g = ng; - b = nb; - r2 = nr2; - g2 = ng2; - b2 = nb2; - } - timelines.push(timeline); - break; - } - case SLOT_ALPHA: { - let timeline = new AlphaTimeline(frameCount, input.readInt(true), slotIndex); - let time = input.readFloat(), a = input.readUnsignedByte() / 255; - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, a); - if (frame == frameLast) - break; - let time2 = input.readFloat(); - let a2 = input.readUnsignedByte() / 255; - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, a, a2, 1); - } - time = time2; - a = a2; - } - timelines.push(timeline); - break; - } - } - } - } - for (let i = 0, n = input.readInt(true); i < n; i++) { - let boneIndex = input.readInt(true); - for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) { - let type = input.readByte(), frameCount = input.readInt(true), bezierCount = input.readInt(true); - switch (type) { - case BONE_ROTATE: - timelines.push(readTimeline1(input, new RotateTimeline(frameCount, bezierCount, boneIndex), 1)); - break; - case BONE_TRANSLATE: - timelines.push(readTimeline2(input, new TranslateTimeline(frameCount, bezierCount, boneIndex), scale)); - break; - case BONE_TRANSLATEX: - timelines.push(readTimeline1(input, new TranslateXTimeline(frameCount, bezierCount, boneIndex), scale)); - break; - case BONE_TRANSLATEY: - timelines.push(readTimeline1(input, new TranslateYTimeline(frameCount, bezierCount, boneIndex), scale)); - break; - case BONE_SCALE: - timelines.push(readTimeline2(input, new ScaleTimeline(frameCount, bezierCount, boneIndex), 1)); - break; - case BONE_SCALEX: - timelines.push(readTimeline1(input, new ScaleXTimeline(frameCount, bezierCount, boneIndex), 1)); - break; - case BONE_SCALEY: - timelines.push(readTimeline1(input, new ScaleYTimeline(frameCount, bezierCount, boneIndex), 1)); - break; - case BONE_SHEAR: - timelines.push(readTimeline2(input, new ShearTimeline(frameCount, bezierCount, boneIndex), 1)); - break; - case BONE_SHEARX: - timelines.push(readTimeline1(input, new ShearXTimeline(frameCount, bezierCount, boneIndex), 1)); - break; - case BONE_SHEARY: - timelines.push(readTimeline1(input, new ShearYTimeline(frameCount, bezierCount, boneIndex), 1)); - } - } - } - for (let i = 0, n = input.readInt(true); i < n; i++) { - let index = input.readInt(true), frameCount = input.readInt(true), frameLast = frameCount - 1; - let timeline = new IkConstraintTimeline(frameCount, input.readInt(true), index); - let time = input.readFloat(), mix = input.readFloat(), softness = input.readFloat() * scale; - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, mix, softness, input.readByte(), input.readBoolean(), input.readBoolean()); - if (frame == frameLast) - break; - let time2 = input.readFloat(), mix2 = input.readFloat(), softness2 = input.readFloat() * scale; - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, mix, mix2, 1); - setBezier(input, timeline, bezier++, frame, 1, time, time2, softness, softness2, scale); - } - time = time2; - mix = mix2; - softness = softness2; - } - timelines.push(timeline); - } - for (let i = 0, n = input.readInt(true); i < n; i++) { - let index = input.readInt(true), frameCount = input.readInt(true), frameLast = frameCount - 1; - let timeline = new TransformConstraintTimeline(frameCount, input.readInt(true), index); - let time = input.readFloat(), mixRotate = input.readFloat(), mixX = input.readFloat(), mixY = input.readFloat(), mixScaleX = input.readFloat(), mixScaleY = input.readFloat(), mixShearY = input.readFloat(); - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY); - if (frame == frameLast) - break; - let time2 = input.readFloat(), mixRotate2 = input.readFloat(), mixX2 = input.readFloat(), mixY2 = input.readFloat(), mixScaleX2 = input.readFloat(), mixScaleY2 = input.readFloat(), mixShearY2 = input.readFloat(); - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1); - setBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1); - setBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1); - setBezier(input, timeline, bezier++, frame, 3, time, time2, mixScaleX, mixScaleX2, 1); - setBezier(input, timeline, bezier++, frame, 4, time, time2, mixScaleY, mixScaleY2, 1); - setBezier(input, timeline, bezier++, frame, 5, time, time2, mixShearY, mixShearY2, 1); - } - time = time2; - mixRotate = mixRotate2; - mixX = mixX2; - mixY = mixY2; - mixScaleX = mixScaleX2; - mixScaleY = mixScaleY2; - mixShearY = mixShearY2; - } - timelines.push(timeline); - } - for (let i = 0, n = input.readInt(true); i < n; i++) { - let index = input.readInt(true); - let data = skeletonData.pathConstraints[index]; - for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) { - switch (input.readByte()) { - case PATH_POSITION: - timelines.push(readTimeline1(input, new PathConstraintPositionTimeline(input.readInt(true), input.readInt(true), index), data.positionMode == PositionMode.Fixed ? scale : 1)); - break; - case PATH_SPACING: - timelines.push(readTimeline1(input, new PathConstraintSpacingTimeline(input.readInt(true), input.readInt(true), index), data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed ? scale : 1)); - break; - case PATH_MIX: - let timeline = new PathConstraintMixTimeline(input.readInt(true), input.readInt(true), index); - let time = input.readFloat(), mixRotate = input.readFloat(), mixX = input.readFloat(), mixY = input.readFloat(); - for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) { - timeline.setFrame(frame, time, mixRotate, mixX, mixY); - if (frame == frameLast) - break; - let time2 = input.readFloat(), mixRotate2 = input.readFloat(), mixX2 = input.readFloat(), mixY2 = input.readFloat(); - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1); - setBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1); - setBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1); - } - time = time2; - mixRotate = mixRotate2; - mixX = mixX2; - mixY = mixY2; - } - timelines.push(timeline); - } - } - } - for (let i = 0, n = input.readInt(true); i < n; i++) { - let skin = skeletonData.skins[input.readInt(true)]; - for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) { - let slotIndex = input.readInt(true); - for (let iii = 0, nnn = input.readInt(true); iii < nnn; iii++) { - let attachmentName = input.readStringRef(); - let attachment = skin.getAttachment(slotIndex, attachmentName); - let weighted = attachment.bones; - let vertices = attachment.vertices; - let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length; - let frameCount = input.readInt(true); - let frameLast = frameCount - 1; - let bezierCount = input.readInt(true); - let timeline = new DeformTimeline(frameCount, bezierCount, slotIndex, attachment); - let time = input.readFloat(); - for (let frame = 0, bezier = 0; ; frame++) { - let deform; - let end = input.readInt(true); - if (end == 0) - deform = weighted ? Utils.newFloatArray(deformLength) : vertices; - else { - deform = Utils.newFloatArray(deformLength); - let start = input.readInt(true); - end += start; - if (scale == 1) { - for (let v = start; v < end; v++) - deform[v] = input.readFloat(); - } else { - for (let v = start; v < end; v++) - deform[v] = input.readFloat() * scale; - } - if (!weighted) { - for (let v = 0, vn = deform.length; v < vn; v++) - deform[v] += vertices[v]; - } - } - timeline.setFrame(frame, time, deform); - if (frame == frameLast) - break; - let time2 = input.readFloat(); - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, 0, 1, 1); - } - time = time2; - } - timelines.push(timeline); - } - } - } - let drawOrderCount = input.readInt(true); - if (drawOrderCount > 0) { - let timeline = new DrawOrderTimeline(drawOrderCount); - let slotCount = skeletonData.slots.length; - for (let i = 0; i < drawOrderCount; i++) { - let time = input.readFloat(); - let offsetCount = input.readInt(true); - let drawOrder = Utils.newArray(slotCount, 0); - for (let ii = slotCount - 1; ii >= 0; ii--) - drawOrder[ii] = -1; - let unchanged = Utils.newArray(slotCount - offsetCount, 0); - let originalIndex = 0, unchangedIndex = 0; - for (let ii = 0; ii < offsetCount; ii++) { - let slotIndex = input.readInt(true); - while (originalIndex != slotIndex) - unchanged[unchangedIndex++] = originalIndex++; - drawOrder[originalIndex + input.readInt(true)] = originalIndex++; - } - while (originalIndex < slotCount) - unchanged[unchangedIndex++] = originalIndex++; - for (let ii = slotCount - 1; ii >= 0; ii--) - if (drawOrder[ii] == -1) - drawOrder[ii] = unchanged[--unchangedIndex]; - timeline.setFrame(i, time, drawOrder); - } - timelines.push(timeline); - } - let eventCount = input.readInt(true); - if (eventCount > 0) { - let timeline = new EventTimeline(eventCount); - for (let i = 0; i < eventCount; i++) { - let time = input.readFloat(); - let eventData = skeletonData.events[input.readInt(true)]; - let event = new Event(time, eventData); - event.intValue = input.readInt(false); - event.floatValue = input.readFloat(); - event.stringValue = input.readBoolean() ? input.readString() : eventData.stringValue; - if (event.data.audioPath) { - event.volume = input.readFloat(); - event.balance = input.readFloat(); - } - timeline.setFrame(i, event); - } - timelines.push(timeline); - } - let duration = 0; - for (let i = 0, n = timelines.length; i < n; i++) - duration = Math.max(duration, timelines[i].getDuration()); - return new Animation(name, timelines, duration); - } - }; - var BinaryInput = class { - constructor(data, strings = new Array(), index = 0, buffer = new DataView(data.buffer)) { - this.strings = strings; - this.index = index; - this.buffer = buffer; - } - readByte() { - return this.buffer.getInt8(this.index++); - } - readUnsignedByte() { - return this.buffer.getUint8(this.index++); - } - readShort() { - let value = this.buffer.getInt16(this.index); - this.index += 2; - return value; - } - readInt32() { - let value = this.buffer.getInt32(this.index); - this.index += 4; - return value; - } - readInt(optimizePositive) { - let b = this.readByte(); - let result = b & 127; - if ((b & 128) != 0) { - b = this.readByte(); - result |= (b & 127) << 7; - if ((b & 128) != 0) { - b = this.readByte(); - result |= (b & 127) << 14; - if ((b & 128) != 0) { - b = this.readByte(); - result |= (b & 127) << 21; - if ((b & 128) != 0) { - b = this.readByte(); - result |= (b & 127) << 28; - } - } - } - } - return optimizePositive ? result : result >>> 1 ^ -(result & 1); - } - readStringRef() { - let index = this.readInt(true); - return index == 0 ? null : this.strings[index - 1]; - } - readString() { - let byteCount = this.readInt(true); - switch (byteCount) { - case 0: - return null; - case 1: - return ""; - } - byteCount--; - let chars = ""; - let charCount = 0; - for (let i = 0; i < byteCount; ) { - let b = this.readByte(); - switch (b >> 4) { - case 12: - case 13: - chars += String.fromCharCode((b & 31) << 6 | this.readByte() & 63); - i += 2; - break; - case 14: - chars += String.fromCharCode((b & 15) << 12 | (this.readByte() & 63) << 6 | this.readByte() & 63); - i += 3; - break; - default: - chars += String.fromCharCode(b); - i++; - } - } - return chars; - } - readFloat() { - let value = this.buffer.getFloat32(this.index); - this.index += 4; - return value; - } - readBoolean() { - return this.readByte() != 0; - } - }; - var LinkedMesh = class { - constructor(mesh, skin, slotIndex, parent, inheritDeform) { - this.mesh = mesh; - this.skin = skin; - this.slotIndex = slotIndex; - this.parent = parent; - this.inheritDeform = inheritDeform; - } - }; - var Vertices = class { - constructor(bones = null, vertices = null) { - this.bones = bones; - this.vertices = vertices; - } - }; - var AttachmentType; - (function(AttachmentType2) { - AttachmentType2[AttachmentType2["Region"] = 0] = "Region"; - AttachmentType2[AttachmentType2["BoundingBox"] = 1] = "BoundingBox"; - AttachmentType2[AttachmentType2["Mesh"] = 2] = "Mesh"; - AttachmentType2[AttachmentType2["LinkedMesh"] = 3] = "LinkedMesh"; - AttachmentType2[AttachmentType2["Path"] = 4] = "Path"; - AttachmentType2[AttachmentType2["Point"] = 5] = "Point"; - AttachmentType2[AttachmentType2["Clipping"] = 6] = "Clipping"; - })(AttachmentType || (AttachmentType = {})); - function readTimeline1(input, timeline, scale) { - let time = input.readFloat(), value = input.readFloat() * scale; - for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) { - timeline.setFrame(frame, time, value); - if (frame == frameLast) - break; - let time2 = input.readFloat(), value2 = input.readFloat() * scale; - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, value, value2, scale); - } - time = time2; - value = value2; - } - return timeline; - } - function readTimeline2(input, timeline, scale) { - let time = input.readFloat(), value1 = input.readFloat() * scale, value2 = input.readFloat() * scale; - for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) { - timeline.setFrame(frame, time, value1, value2); - if (frame == frameLast) - break; - let time2 = input.readFloat(), nvalue1 = input.readFloat() * scale, nvalue2 = input.readFloat() * scale; - switch (input.readByte()) { - case CURVE_STEPPED: - timeline.setStepped(frame); - break; - case CURVE_BEZIER: - setBezier(input, timeline, bezier++, frame, 0, time, time2, value1, nvalue1, scale); - setBezier(input, timeline, bezier++, frame, 1, time, time2, value2, nvalue2, scale); - } - time = time2; - value1 = nvalue1; - value2 = nvalue2; - } - return timeline; - } - function setBezier(input, timeline, bezier, frame, value, time1, time2, value1, value2, scale) { - timeline.setBezier(bezier, frame, value, time1, value1, input.readFloat(), input.readFloat() * scale, input.readFloat(), input.readFloat() * scale, time2, value2); - } - var BONE_ROTATE = 0; - var BONE_TRANSLATE = 1; - var BONE_TRANSLATEX = 2; - var BONE_TRANSLATEY = 3; - var BONE_SCALE = 4; - var BONE_SCALEX = 5; - var BONE_SCALEY = 6; - var BONE_SHEAR = 7; - var BONE_SHEARX = 8; - var BONE_SHEARY = 9; - var SLOT_ATTACHMENT = 0; - var SLOT_RGBA = 1; - var SLOT_RGB = 2; - var SLOT_RGBA2 = 3; - var SLOT_RGB2 = 4; - var SLOT_ALPHA = 5; - var PATH_POSITION = 0; - var PATH_SPACING = 1; - var PATH_MIX = 2; - var CURVE_STEPPED = 1; - var CURVE_BEZIER = 2; - - // spine-core/src/SkeletonBounds.ts - var SkeletonBounds = class { - constructor() { - this.minX = 0; - this.minY = 0; - this.maxX = 0; - this.maxY = 0; - this.boundingBoxes = new Array(); - this.polygons = new Array(); - this.polygonPool = new Pool(() => { - return Utils.newFloatArray(16); - }); - } - update(skeleton, updateAabb) { - if (!skeleton) - throw new Error("skeleton cannot be null."); - let boundingBoxes = this.boundingBoxes; - let polygons = this.polygons; - let polygonPool = this.polygonPool; - let slots = skeleton.slots; - let slotCount = slots.length; - boundingBoxes.length = 0; - polygonPool.freeAll(polygons); - polygons.length = 0; - for (let i = 0; i < slotCount; i++) { - let slot = slots[i]; - if (!slot.bone.active) - continue; - let attachment = slot.getAttachment(); - if (attachment instanceof BoundingBoxAttachment) { - let boundingBox = attachment; - boundingBoxes.push(boundingBox); - let polygon = polygonPool.obtain(); - if (polygon.length != boundingBox.worldVerticesLength) { - polygon = Utils.newFloatArray(boundingBox.worldVerticesLength); - } - polygons.push(polygon); - boundingBox.computeWorldVertices(slot, 0, boundingBox.worldVerticesLength, polygon, 0, 2); - } - } - if (updateAabb) { - this.aabbCompute(); - } else { - this.minX = Number.POSITIVE_INFINITY; - this.minY = Number.POSITIVE_INFINITY; - this.maxX = Number.NEGATIVE_INFINITY; - this.maxY = Number.NEGATIVE_INFINITY; - } - } - aabbCompute() { - let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY; - let polygons = this.polygons; - for (let i = 0, n = polygons.length; i < n; i++) { - let polygon = polygons[i]; - let vertices = polygon; - for (let ii = 0, nn = polygon.length; ii < nn; ii += 2) { - let x = vertices[ii]; - let y = vertices[ii + 1]; - minX = Math.min(minX, x); - minY = Math.min(minY, y); - maxX = Math.max(maxX, x); - maxY = Math.max(maxY, y); - } - } - this.minX = minX; - this.minY = minY; - this.maxX = maxX; - this.maxY = maxY; - } - aabbContainsPoint(x, y) { - return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY; - } - aabbIntersectsSegment(x1, y1, x2, y2) { - let minX = this.minX; - let minY = this.minY; - let maxX = this.maxX; - let maxY = this.maxY; - if (x1 <= minX && x2 <= minX || y1 <= minY && y2 <= minY || x1 >= maxX && x2 >= maxX || y1 >= maxY && y2 >= maxY) - return false; - let m = (y2 - y1) / (x2 - x1); - let y = m * (minX - x1) + y1; - if (y > minY && y < maxY) - return true; - y = m * (maxX - x1) + y1; - if (y > minY && y < maxY) - return true; - let x = (minY - y1) / m + x1; - if (x > minX && x < maxX) - return true; - x = (maxY - y1) / m + x1; - if (x > minX && x < maxX) - return true; - return false; - } - aabbIntersectsSkeleton(bounds) { - return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY; - } - containsPoint(x, y) { - let polygons = this.polygons; - for (let i = 0, n = polygons.length; i < n; i++) - if (this.containsPointPolygon(polygons[i], x, y)) - return this.boundingBoxes[i]; - return null; - } - containsPointPolygon(polygon, x, y) { - let vertices = polygon; - let nn = polygon.length; - let prevIndex = nn - 2; - let inside = false; - for (let ii = 0; ii < nn; ii += 2) { - let vertexY = vertices[ii + 1]; - let prevY = vertices[prevIndex + 1]; - if (vertexY < y && prevY >= y || prevY < y && vertexY >= y) { - let vertexX = vertices[ii]; - if (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) - inside = !inside; - } - prevIndex = ii; - } - return inside; - } - intersectsSegment(x1, y1, x2, y2) { - let polygons = this.polygons; - for (let i = 0, n = polygons.length; i < n; i++) - if (this.intersectsSegmentPolygon(polygons[i], x1, y1, x2, y2)) - return this.boundingBoxes[i]; - return null; - } - intersectsSegmentPolygon(polygon, x1, y1, x2, y2) { - let vertices = polygon; - let nn = polygon.length; - let width12 = x1 - x2, height12 = y1 - y2; - let det1 = x1 * y2 - y1 * x2; - let x3 = vertices[nn - 2], y3 = vertices[nn - 1]; - for (let ii = 0; ii < nn; ii += 2) { - let x4 = vertices[ii], y4 = vertices[ii + 1]; - let det2 = x3 * y4 - y3 * x4; - let width34 = x3 - x4, height34 = y3 - y4; - let det3 = width12 * height34 - height12 * width34; - let x = (det1 * width34 - width12 * det2) / det3; - if ((x >= x3 && x <= x4 || x >= x4 && x <= x3) && (x >= x1 && x <= x2 || x >= x2 && x <= x1)) { - let y = (det1 * height34 - height12 * det2) / det3; - if ((y >= y3 && y <= y4 || y >= y4 && y <= y3) && (y >= y1 && y <= y2 || y >= y2 && y <= y1)) - return true; - } - x3 = x4; - y3 = y4; - } - return false; - } - getPolygon(boundingBox) { - if (!boundingBox) - throw new Error("boundingBox cannot be null."); - let index = this.boundingBoxes.indexOf(boundingBox); - return index == -1 ? null : this.polygons[index]; - } - getWidth() { - return this.maxX - this.minX; - } - getHeight() { - return this.maxY - this.minY; - } - }; - - // spine-core/src/Triangulator.ts - var Triangulator = class { - constructor() { - this.convexPolygons = new Array(); - this.convexPolygonsIndices = new Array(); - this.indicesArray = new Array(); - this.isConcaveArray = new Array(); - this.triangles = new Array(); - this.polygonPool = new Pool(() => { - return new Array(); - }); - this.polygonIndicesPool = new Pool(() => { - return new Array(); - }); - } - triangulate(verticesArray) { - let vertices = verticesArray; - let vertexCount = verticesArray.length >> 1; - let indices = this.indicesArray; - indices.length = 0; - for (let i = 0; i < vertexCount; i++) - indices[i] = i; - let isConcave = this.isConcaveArray; - isConcave.length = 0; - for (let i = 0, n = vertexCount; i < n; ++i) - isConcave[i] = Triangulator.isConcave(i, vertexCount, vertices, indices); - let triangles = this.triangles; - triangles.length = 0; - while (vertexCount > 3) { - let previous = vertexCount - 1, i = 0, next = 1; - while (true) { - outer: - if (!isConcave[i]) { - let p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1; - let p1x = vertices[p1], p1y = vertices[p1 + 1]; - let p2x = vertices[p2], p2y = vertices[p2 + 1]; - let p3x = vertices[p3], p3y = vertices[p3 + 1]; - for (let ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) { - if (!isConcave[ii]) - continue; - let v = indices[ii] << 1; - let vx = vertices[v], vy = vertices[v + 1]; - if (Triangulator.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) { - if (Triangulator.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) { - if (Triangulator.positiveArea(p2x, p2y, p3x, p3y, vx, vy)) - break outer; - } - } - } - break; - } - if (next == 0) { - do { - if (!isConcave[i]) - break; - i--; - } while (i > 0); - break; - } - previous = i; - i = next; - next = (next + 1) % vertexCount; - } - triangles.push(indices[(vertexCount + i - 1) % vertexCount]); - triangles.push(indices[i]); - triangles.push(indices[(i + 1) % vertexCount]); - indices.splice(i, 1); - isConcave.splice(i, 1); - vertexCount--; - let previousIndex = (vertexCount + i - 1) % vertexCount; - let nextIndex = i == vertexCount ? 0 : i; - isConcave[previousIndex] = Triangulator.isConcave(previousIndex, vertexCount, vertices, indices); - isConcave[nextIndex] = Triangulator.isConcave(nextIndex, vertexCount, vertices, indices); - } - if (vertexCount == 3) { - triangles.push(indices[2]); - triangles.push(indices[0]); - triangles.push(indices[1]); - } - return triangles; - } - decompose(verticesArray, triangles) { - let vertices = verticesArray; - let convexPolygons = this.convexPolygons; - this.polygonPool.freeAll(convexPolygons); - convexPolygons.length = 0; - let convexPolygonsIndices = this.convexPolygonsIndices; - this.polygonIndicesPool.freeAll(convexPolygonsIndices); - convexPolygonsIndices.length = 0; - let polygonIndices = this.polygonIndicesPool.obtain(); - polygonIndices.length = 0; - let polygon = this.polygonPool.obtain(); - polygon.length = 0; - let fanBaseIndex = -1, lastWinding = 0; - for (let i = 0, n = triangles.length; i < n; i += 3) { - let t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1; - let x1 = vertices[t1], y1 = vertices[t1 + 1]; - let x2 = vertices[t2], y2 = vertices[t2 + 1]; - let x3 = vertices[t3], y3 = vertices[t3 + 1]; - let merged = false; - if (fanBaseIndex == t1) { - let o = polygon.length - 4; - let winding1 = Triangulator.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3); - let winding2 = Triangulator.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]); - if (winding1 == lastWinding && winding2 == lastWinding) { - polygon.push(x3); - polygon.push(y3); - polygonIndices.push(t3); - merged = true; - } - } - if (!merged) { - if (polygon.length > 0) { - convexPolygons.push(polygon); - convexPolygonsIndices.push(polygonIndices); - } else { - this.polygonPool.free(polygon); - this.polygonIndicesPool.free(polygonIndices); - } - polygon = this.polygonPool.obtain(); - polygon.length = 0; - polygon.push(x1); - polygon.push(y1); - polygon.push(x2); - polygon.push(y2); - polygon.push(x3); - polygon.push(y3); - polygonIndices = this.polygonIndicesPool.obtain(); - polygonIndices.length = 0; - polygonIndices.push(t1); - polygonIndices.push(t2); - polygonIndices.push(t3); - lastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3); - fanBaseIndex = t1; - } - } - if (polygon.length > 0) { - convexPolygons.push(polygon); - convexPolygonsIndices.push(polygonIndices); - } - for (let i = 0, n = convexPolygons.length; i < n; i++) { - polygonIndices = convexPolygonsIndices[i]; - if (polygonIndices.length == 0) - continue; - let firstIndex = polygonIndices[0]; - let lastIndex = polygonIndices[polygonIndices.length - 1]; - polygon = convexPolygons[i]; - let o = polygon.length - 4; - let prevPrevX = polygon[o], prevPrevY = polygon[o + 1]; - let prevX = polygon[o + 2], prevY = polygon[o + 3]; - let firstX = polygon[0], firstY = polygon[1]; - let secondX = polygon[2], secondY = polygon[3]; - let winding = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY); - for (let ii = 0; ii < n; ii++) { - if (ii == i) - continue; - let otherIndices = convexPolygonsIndices[ii]; - if (otherIndices.length != 3) - continue; - let otherFirstIndex = otherIndices[0]; - let otherSecondIndex = otherIndices[1]; - let otherLastIndex = otherIndices[2]; - let otherPoly = convexPolygons[ii]; - let x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1]; - if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex) - continue; - let winding1 = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3); - let winding2 = Triangulator.winding(x3, y3, firstX, firstY, secondX, secondY); - if (winding1 == winding && winding2 == winding) { - otherPoly.length = 0; - otherIndices.length = 0; - polygon.push(x3); - polygon.push(y3); - polygonIndices.push(otherLastIndex); - prevPrevX = prevX; - prevPrevY = prevY; - prevX = x3; - prevY = y3; - ii = 0; - } - } - } - for (let i = convexPolygons.length - 1; i >= 0; i--) { - polygon = convexPolygons[i]; - if (polygon.length == 0) { - convexPolygons.splice(i, 1); - this.polygonPool.free(polygon); - polygonIndices = convexPolygonsIndices[i]; - convexPolygonsIndices.splice(i, 1); - this.polygonIndicesPool.free(polygonIndices); - } - } - return convexPolygons; - } - static isConcave(index, vertexCount, vertices, indices) { - let previous = indices[(vertexCount + index - 1) % vertexCount] << 1; - let current = indices[index] << 1; - let next = indices[(index + 1) % vertexCount] << 1; - return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]); - } - static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y) { - return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0; - } - static winding(p1x, p1y, p2x, p2y, p3x, p3y) { - let px = p2x - p1x, py = p2y - p1y; - return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1; - } - }; - - // spine-core/src/SkeletonClipping.ts - var SkeletonClipping = class { - constructor() { - this.triangulator = new Triangulator(); - this.clippingPolygon = new Array(); - this.clipOutput = new Array(); - this.clippedVertices = new Array(); - this.clippedTriangles = new Array(); - this.scratch = new Array(); - } - clipStart(slot, clip) { - if (this.clipAttachment) - return 0; - this.clipAttachment = clip; - let n = clip.worldVerticesLength; - let vertices = Utils.setArraySize(this.clippingPolygon, n); - clip.computeWorldVertices(slot, 0, n, vertices, 0, 2); - let clippingPolygon = this.clippingPolygon; - SkeletonClipping.makeClockwise(clippingPolygon); - let clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon)); - for (let i = 0, n2 = clippingPolygons.length; i < n2; i++) { - let polygon = clippingPolygons[i]; - SkeletonClipping.makeClockwise(polygon); - polygon.push(polygon[0]); - polygon.push(polygon[1]); - } - return clippingPolygons.length; - } - clipEndWithSlot(slot) { - if (this.clipAttachment && this.clipAttachment.endSlot == slot.data) - this.clipEnd(); - } - clipEnd() { - if (!this.clipAttachment) - return; - this.clipAttachment = null; - this.clippingPolygons = null; - this.clippedVertices.length = 0; - this.clippedTriangles.length = 0; - this.clippingPolygon.length = 0; - } - isClipping() { - return this.clipAttachment != null; - } - clipTriangles(vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) { - let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices; - let clippedTriangles = this.clippedTriangles; - let polygons = this.clippingPolygons; - let polygonsCount = this.clippingPolygons.length; - let vertexSize = twoColor ? 12 : 8; - let index = 0; - clippedVertices.length = 0; - clippedTriangles.length = 0; - outer: - for (let i = 0; i < trianglesLength; i += 3) { - let vertexOffset = triangles[i] << 1; - let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1]; - let u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1]; - vertexOffset = triangles[i + 1] << 1; - let x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1]; - let u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1]; - vertexOffset = triangles[i + 2] << 1; - let x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1]; - let u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1]; - for (let p = 0; p < polygonsCount; p++) { - let s = clippedVertices.length; - if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) { - let clipOutputLength = clipOutput.length; - if (clipOutputLength == 0) - continue; - let d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1; - let d = 1 / (d0 * d2 + d1 * (y1 - y3)); - let clipOutputCount = clipOutputLength >> 1; - let clipOutputItems = this.clipOutput; - let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize); - for (let ii = 0; ii < clipOutputLength; ii += 2) { - let x = clipOutputItems[ii], y = clipOutputItems[ii + 1]; - clippedVerticesItems[s] = x; - clippedVerticesItems[s + 1] = y; - clippedVerticesItems[s + 2] = light.r; - clippedVerticesItems[s + 3] = light.g; - clippedVerticesItems[s + 4] = light.b; - clippedVerticesItems[s + 5] = light.a; - let c0 = x - x3, c1 = y - y3; - let a = (d0 * c0 + d1 * c1) * d; - let b = (d4 * c0 + d2 * c1) * d; - let c = 1 - a - b; - clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c; - clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c; - if (twoColor) { - clippedVerticesItems[s + 8] = dark.r; - clippedVerticesItems[s + 9] = dark.g; - clippedVerticesItems[s + 10] = dark.b; - clippedVerticesItems[s + 11] = dark.a; - } - s += vertexSize; - } - s = clippedTriangles.length; - let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2)); - clipOutputCount--; - for (let ii = 1; ii < clipOutputCount; ii++) { - clippedTrianglesItems[s] = index; - clippedTrianglesItems[s + 1] = index + ii; - clippedTrianglesItems[s + 2] = index + ii + 1; - s += 3; - } - index += clipOutputCount + 1; - } else { - let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize); - clippedVerticesItems[s] = x1; - clippedVerticesItems[s + 1] = y1; - clippedVerticesItems[s + 2] = light.r; - clippedVerticesItems[s + 3] = light.g; - clippedVerticesItems[s + 4] = light.b; - clippedVerticesItems[s + 5] = light.a; - if (!twoColor) { - clippedVerticesItems[s + 6] = u1; - clippedVerticesItems[s + 7] = v1; - clippedVerticesItems[s + 8] = x2; - clippedVerticesItems[s + 9] = y2; - clippedVerticesItems[s + 10] = light.r; - clippedVerticesItems[s + 11] = light.g; - clippedVerticesItems[s + 12] = light.b; - clippedVerticesItems[s + 13] = light.a; - clippedVerticesItems[s + 14] = u2; - clippedVerticesItems[s + 15] = v2; - clippedVerticesItems[s + 16] = x3; - clippedVerticesItems[s + 17] = y3; - clippedVerticesItems[s + 18] = light.r; - clippedVerticesItems[s + 19] = light.g; - clippedVerticesItems[s + 20] = light.b; - clippedVerticesItems[s + 21] = light.a; - clippedVerticesItems[s + 22] = u3; - clippedVerticesItems[s + 23] = v3; - } else { - clippedVerticesItems[s + 6] = u1; - clippedVerticesItems[s + 7] = v1; - clippedVerticesItems[s + 8] = dark.r; - clippedVerticesItems[s + 9] = dark.g; - clippedVerticesItems[s + 10] = dark.b; - clippedVerticesItems[s + 11] = dark.a; - clippedVerticesItems[s + 12] = x2; - clippedVerticesItems[s + 13] = y2; - clippedVerticesItems[s + 14] = light.r; - clippedVerticesItems[s + 15] = light.g; - clippedVerticesItems[s + 16] = light.b; - clippedVerticesItems[s + 17] = light.a; - clippedVerticesItems[s + 18] = u2; - clippedVerticesItems[s + 19] = v2; - clippedVerticesItems[s + 20] = dark.r; - clippedVerticesItems[s + 21] = dark.g; - clippedVerticesItems[s + 22] = dark.b; - clippedVerticesItems[s + 23] = dark.a; - clippedVerticesItems[s + 24] = x3; - clippedVerticesItems[s + 25] = y3; - clippedVerticesItems[s + 26] = light.r; - clippedVerticesItems[s + 27] = light.g; - clippedVerticesItems[s + 28] = light.b; - clippedVerticesItems[s + 29] = light.a; - clippedVerticesItems[s + 30] = u3; - clippedVerticesItems[s + 31] = v3; - clippedVerticesItems[s + 32] = dark.r; - clippedVerticesItems[s + 33] = dark.g; - clippedVerticesItems[s + 34] = dark.b; - clippedVerticesItems[s + 35] = dark.a; - } - s = clippedTriangles.length; - let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3); - clippedTrianglesItems[s] = index; - clippedTrianglesItems[s + 1] = index + 1; - clippedTrianglesItems[s + 2] = index + 2; - index += 3; - continue outer; - } - } - } - } - clip(x1, y1, x2, y2, x3, y3, clippingArea, output) { - let originalOutput = output; - let clipped = false; - let input = null; - if (clippingArea.length % 4 >= 2) { - input = output; - output = this.scratch; - } else - input = this.scratch; - input.length = 0; - input.push(x1); - input.push(y1); - input.push(x2); - input.push(y2); - input.push(x3); - input.push(y3); - input.push(x1); - input.push(y1); - output.length = 0; - let clippingVertices = clippingArea; - let clippingVerticesLast = clippingArea.length - 4; - for (let i = 0; ; i += 2) { - let edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1]; - let edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3]; - let deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2; - let inputVertices = input; - let inputVerticesLength = input.length - 2, outputStart = output.length; - for (let ii = 0; ii < inputVerticesLength; ii += 2) { - let inputX = inputVertices[ii], inputY = inputVertices[ii + 1]; - let inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3]; - let side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; - if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { - if (side2) { - output.push(inputX2); - output.push(inputY2); - continue; - } - let c0 = inputY2 - inputY, c2 = inputX2 - inputX; - let s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); - if (Math.abs(s) > 1e-6) { - let ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; - output.push(edgeX + (edgeX2 - edgeX) * ua); - output.push(edgeY + (edgeY2 - edgeY) * ua); - } else { - output.push(edgeX); - output.push(edgeY); - } - } else if (side2) { - let c0 = inputY2 - inputY, c2 = inputX2 - inputX; - let s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); - if (Math.abs(s) > 1e-6) { - let ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; - output.push(edgeX + (edgeX2 - edgeX) * ua); - output.push(edgeY + (edgeY2 - edgeY) * ua); - } else { - output.push(edgeX); - output.push(edgeY); - } - output.push(inputX2); - output.push(inputY2); - } - clipped = true; - } - if (outputStart == output.length) { - originalOutput.length = 0; - return true; - } - output.push(output[0]); - output.push(output[1]); - if (i == clippingVerticesLast) - break; - let temp = output; - output = input; - output.length = 0; - input = temp; - } - if (originalOutput != output) { - originalOutput.length = 0; - for (let i = 0, n = output.length - 2; i < n; i++) - originalOutput[i] = output[i]; - } else - originalOutput.length = originalOutput.length - 2; - return clipped; - } - static makeClockwise(polygon) { - let vertices = polygon; - let verticeslength = polygon.length; - let area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0; - for (let i = 0, n = verticeslength - 3; i < n; i += 2) { - p1x = vertices[i]; - p1y = vertices[i + 1]; - p2x = vertices[i + 2]; - p2y = vertices[i + 3]; - area += p1x * p2y - p2x * p1y; - } - if (area < 0) - return; - for (let i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) { - let x = vertices[i], y = vertices[i + 1]; - let other = lastX - i; - vertices[i] = vertices[other]; - vertices[i + 1] = vertices[other + 1]; - vertices[other] = x; - vertices[other + 1] = y; - } - } - }; - - // spine-core/src/SkeletonJson.ts - var SkeletonJson = class { - constructor(attachmentLoader) { - this.scale = 1; - this.linkedMeshes = new Array(); - this.attachmentLoader = attachmentLoader; - } - readSkeletonData(json) { - let scale = this.scale; - let skeletonData = new SkeletonData(); - let root = typeof json === "string" ? JSON.parse(json) : json; - let skeletonMap = root.skeleton; - if (skeletonMap) { - skeletonData.hash = skeletonMap.hash; - skeletonData.version = skeletonMap.spine; - skeletonData.x = skeletonMap.x; - skeletonData.y = skeletonMap.y; - skeletonData.width = skeletonMap.width; - skeletonData.height = skeletonMap.height; - skeletonData.fps = skeletonMap.fps; - skeletonData.imagesPath = skeletonMap.images; - } - if (root.bones) { - for (let i = 0; i < root.bones.length; i++) { - let boneMap = root.bones[i]; - let parent = null; - let parentName = getValue(boneMap, "parent", null); - if (parentName) - parent = skeletonData.findBone(parentName); - let data = new BoneData(skeletonData.bones.length, boneMap.name, parent); - data.length = getValue(boneMap, "length", 0) * scale; - data.x = getValue(boneMap, "x", 0) * scale; - data.y = getValue(boneMap, "y", 0) * scale; - data.rotation = getValue(boneMap, "rotation", 0); - data.scaleX = getValue(boneMap, "scaleX", 1); - data.scaleY = getValue(boneMap, "scaleY", 1); - data.shearX = getValue(boneMap, "shearX", 0); - data.shearY = getValue(boneMap, "shearY", 0); - data.transformMode = Utils.enumValue(TransformMode, getValue(boneMap, "transform", "Normal")); - data.skinRequired = getValue(boneMap, "skin", false); - let color = getValue(boneMap, "color", null); - if (color) - data.color.setFromString(color); - skeletonData.bones.push(data); - } - } - if (root.slots) { - for (let i = 0; i < root.slots.length; i++) { - let slotMap = root.slots[i]; - let boneData = skeletonData.findBone(slotMap.bone); - let data = new SlotData(skeletonData.slots.length, slotMap.name, boneData); - let color = getValue(slotMap, "color", null); - if (color) - data.color.setFromString(color); - let dark = getValue(slotMap, "dark", null); - if (dark) - data.darkColor = Color.fromString(dark); - data.attachmentName = getValue(slotMap, "attachment", null); - data.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, "blend", "normal")); - skeletonData.slots.push(data); - } - } - if (root.ik) { - for (let i = 0; i < root.ik.length; i++) { - let constraintMap = root.ik[i]; - let data = new IkConstraintData(constraintMap.name); - data.order = getValue(constraintMap, "order", 0); - data.skinRequired = getValue(constraintMap, "skin", false); - for (let ii = 0; ii < constraintMap.bones.length; ii++) - data.bones.push(skeletonData.findBone(constraintMap.bones[ii])); - data.target = skeletonData.findBone(constraintMap.target); - data.mix = getValue(constraintMap, "mix", 1); - data.softness = getValue(constraintMap, "softness", 0) * scale; - data.bendDirection = getValue(constraintMap, "bendPositive", true) ? 1 : -1; - data.compress = getValue(constraintMap, "compress", false); - data.stretch = getValue(constraintMap, "stretch", false); - data.uniform = getValue(constraintMap, "uniform", false); - skeletonData.ikConstraints.push(data); - } - } - if (root.transform) { - for (let i = 0; i < root.transform.length; i++) { - let constraintMap = root.transform[i]; - let data = new TransformConstraintData(constraintMap.name); - data.order = getValue(constraintMap, "order", 0); - data.skinRequired = getValue(constraintMap, "skin", false); - for (let ii = 0; ii < constraintMap.bones.length; ii++) - data.bones.push(skeletonData.findBone(constraintMap.bones[ii])); - let targetName = constraintMap.target; - data.target = skeletonData.findBone(targetName); - data.local = getValue(constraintMap, "local", false); - data.relative = getValue(constraintMap, "relative", false); - data.offsetRotation = getValue(constraintMap, "rotation", 0); - data.offsetX = getValue(constraintMap, "x", 0) * scale; - data.offsetY = getValue(constraintMap, "y", 0) * scale; - data.offsetScaleX = getValue(constraintMap, "scaleX", 0); - data.offsetScaleY = getValue(constraintMap, "scaleY", 0); - data.offsetShearY = getValue(constraintMap, "shearY", 0); - data.mixRotate = getValue(constraintMap, "mixRotate", 1); - data.mixX = getValue(constraintMap, "mixX", 1); - data.mixY = getValue(constraintMap, "mixY", data.mixX); - data.mixScaleX = getValue(constraintMap, "mixScaleX", 1); - data.mixScaleY = getValue(constraintMap, "mixScaleY", data.mixScaleX); - data.mixShearY = getValue(constraintMap, "mixShearY", 1); - skeletonData.transformConstraints.push(data); - } - } - if (root.path) { - for (let i = 0; i < root.path.length; i++) { - let constraintMap = root.path[i]; - let data = new PathConstraintData(constraintMap.name); - data.order = getValue(constraintMap, "order", 0); - data.skinRequired = getValue(constraintMap, "skin", false); - for (let ii = 0; ii < constraintMap.bones.length; ii++) - data.bones.push(skeletonData.findBone(constraintMap.bones[ii])); - let targetName = constraintMap.target; - data.target = skeletonData.findSlot(targetName); - data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent")); - data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length")); - data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent")); - data.offsetRotation = getValue(constraintMap, "rotation", 0); - data.position = getValue(constraintMap, "position", 0); - if (data.positionMode == PositionMode.Fixed) - data.position *= scale; - data.spacing = getValue(constraintMap, "spacing", 0); - if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) - data.spacing *= scale; - data.mixRotate = getValue(constraintMap, "mixRotate", 1); - data.mixX = getValue(constraintMap, "mixX", 1); - data.mixY = getValue(constraintMap, "mixY", data.mixX); - skeletonData.pathConstraints.push(data); - } - } - if (root.skins) { - for (let i = 0; i < root.skins.length; i++) { - let skinMap = root.skins[i]; - let skin = new Skin(skinMap.name); - if (skinMap.bones) { - for (let ii = 0; ii < skinMap.bones.length; ii++) - skin.bones.push(skeletonData.findBone(skinMap.bones[ii])); - } - if (skinMap.ik) { - for (let ii = 0; ii < skinMap.ik.length; ii++) - skin.constraints.push(skeletonData.findIkConstraint(skinMap.ik[ii])); - } - if (skinMap.transform) { - for (let ii = 0; ii < skinMap.transform.length; ii++) - skin.constraints.push(skeletonData.findTransformConstraint(skinMap.transform[ii])); - } - if (skinMap.path) { - for (let ii = 0; ii < skinMap.path.length; ii++) - skin.constraints.push(skeletonData.findPathConstraint(skinMap.path[ii])); - } - for (let slotName in skinMap.attachments) { - let slot = skeletonData.findSlot(slotName); - let slotMap = skinMap.attachments[slotName]; - for (let entryName in slotMap) { - let attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData); - if (attachment) - skin.setAttachment(slot.index, entryName, attachment); - } - } - skeletonData.skins.push(skin); - if (skin.name == "default") - skeletonData.defaultSkin = skin; - } - } - for (let i = 0, n = this.linkedMeshes.length; i < n; i++) { - let linkedMesh = this.linkedMeshes[i]; - let skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); - let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); - linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh; - linkedMesh.mesh.setParentMesh(parent); - linkedMesh.mesh.updateUVs(); - } - this.linkedMeshes.length = 0; - if (root.events) { - for (let eventName in root.events) { - let eventMap = root.events[eventName]; - let data = new EventData(eventName); - data.intValue = getValue(eventMap, "int", 0); - data.floatValue = getValue(eventMap, "float", 0); - data.stringValue = getValue(eventMap, "string", ""); - data.audioPath = getValue(eventMap, "audio", null); - if (data.audioPath) { - data.volume = getValue(eventMap, "volume", 1); - data.balance = getValue(eventMap, "balance", 0); - } - skeletonData.events.push(data); - } - } - if (root.animations) { - for (let animationName in root.animations) { - let animationMap = root.animations[animationName]; - this.readAnimation(animationMap, animationName, skeletonData); - } - } - return skeletonData; - } - readAttachment(map, skin, slotIndex, name, skeletonData) { - let scale = this.scale; - name = getValue(map, "name", name); - switch (getValue(map, "type", "region")) { - case "region": { - let path = getValue(map, "path", name); - let region = this.attachmentLoader.newRegionAttachment(skin, name, path); - if (!region) - return null; - region.path = path; - region.x = getValue(map, "x", 0) * scale; - region.y = getValue(map, "y", 0) * scale; - region.scaleX = getValue(map, "scaleX", 1); - region.scaleY = getValue(map, "scaleY", 1); - region.rotation = getValue(map, "rotation", 0); - region.width = map.width * scale; - region.height = map.height * scale; - let color = getValue(map, "color", null); - if (color) - region.color.setFromString(color); - region.updateOffset(); - return region; - } - case "boundingbox": { - let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name); - if (!box) - return null; - this.readVertices(map, box, map.vertexCount << 1); - let color = getValue(map, "color", null); - if (color) - box.color.setFromString(color); - return box; - } - case "mesh": - case "linkedmesh": { - let path = getValue(map, "path", name); - let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); - if (!mesh) - return null; - mesh.path = path; - let color = getValue(map, "color", null); - if (color) - mesh.color.setFromString(color); - mesh.width = getValue(map, "width", 0) * scale; - mesh.height = getValue(map, "height", 0) * scale; - let parent = getValue(map, "parent", null); - if (parent) { - this.linkedMeshes.push(new LinkedMesh2(mesh, getValue(map, "skin", null), slotIndex, parent, getValue(map, "deform", true))); - return mesh; - } - let uvs = map.uvs; - this.readVertices(map, mesh, uvs.length); - mesh.triangles = map.triangles; - mesh.regionUVs = uvs; - mesh.updateUVs(); - mesh.edges = getValue(map, "edges", null); - mesh.hullLength = getValue(map, "hull", 0) * 2; - return mesh; - } - case "path": { - let path = this.attachmentLoader.newPathAttachment(skin, name); - if (!path) - return null; - path.closed = getValue(map, "closed", false); - path.constantSpeed = getValue(map, "constantSpeed", true); - let vertexCount = map.vertexCount; - this.readVertices(map, path, vertexCount << 1); - let lengths = Utils.newArray(vertexCount / 3, 0); - for (let i = 0; i < map.lengths.length; i++) - lengths[i] = map.lengths[i] * scale; - path.lengths = lengths; - let color = getValue(map, "color", null); - if (color) - path.color.setFromString(color); - return path; - } - case "point": { - let point = this.attachmentLoader.newPointAttachment(skin, name); - if (!point) - return null; - point.x = getValue(map, "x", 0) * scale; - point.y = getValue(map, "y", 0) * scale; - point.rotation = getValue(map, "rotation", 0); - let color = getValue(map, "color", null); - if (color) - point.color.setFromString(color); - return point; - } - case "clipping": { - let clip = this.attachmentLoader.newClippingAttachment(skin, name); - if (!clip) - return null; - let end = getValue(map, "end", null); - if (end) - clip.endSlot = skeletonData.findSlot(end); - let vertexCount = map.vertexCount; - this.readVertices(map, clip, vertexCount << 1); - let color = getValue(map, "color", null); - if (color) - clip.color.setFromString(color); - return clip; - } - } - return null; - } - readVertices(map, attachment, verticesLength) { - let scale = this.scale; - attachment.worldVerticesLength = verticesLength; - let vertices = map.vertices; - if (verticesLength == vertices.length) { - let scaledVertices = Utils.toFloatArray(vertices); - if (scale != 1) { - for (let i = 0, n = vertices.length; i < n; i++) - scaledVertices[i] *= scale; - } - attachment.vertices = scaledVertices; - return; - } - let weights = new Array(); - let bones = new Array(); - for (let i = 0, n = vertices.length; i < n; ) { - let boneCount = vertices[i++]; - bones.push(boneCount); - for (let nn = i + boneCount * 4; i < nn; i += 4) { - bones.push(vertices[i]); - weights.push(vertices[i + 1] * scale); - weights.push(vertices[i + 2] * scale); - weights.push(vertices[i + 3]); - } - } - attachment.bones = bones; - attachment.vertices = Utils.toFloatArray(weights); - } - readAnimation(map, name, skeletonData) { - let scale = this.scale; - let timelines = new Array(); - if (map.slots) { - for (let slotName in map.slots) { - let slotMap = map.slots[slotName]; - let slotIndex = skeletonData.findSlotIndex(slotName); - for (let timelineName in slotMap) { - let timelineMap = slotMap[timelineName]; - if (!timelineMap) - continue; - if (timelineName == "attachment") { - let timeline = new AttachmentTimeline(timelineMap.length, slotIndex); - for (let frame = 0; frame < timelineMap.length; frame++) { - let keyMap = timelineMap[frame]; - timeline.setFrame(frame, getValue(keyMap, "time", 0), keyMap.name); - } - timelines.push(timeline); - } else if (timelineName == "rgba") { - let timeline = new RGBATimeline(timelineMap.length, timelineMap.length << 2, slotIndex); - let keyMap = timelineMap[0]; - let time = getValue(keyMap, "time", 0); - let color = Color.fromString(keyMap.color); - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, color.r, color.g, color.b, color.a); - let nextMap = timelineMap[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - break; - } - let time2 = getValue(nextMap, "time", 0); - let newColor = Color.fromString(nextMap.color); - let curve = keyMap.curve; - if (curve) { - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1); - bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1); - bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1); - bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1); - } - time = time2; - color = newColor; - keyMap = nextMap; - } - timelines.push(timeline); - } else if (timelineName == "rgb") { - let timeline = new RGBTimeline(timelineMap.length, timelineMap.length * 3, slotIndex); - let keyMap = timelineMap[0]; - let time = getValue(keyMap, "time", 0); - let color = Color.fromString(keyMap.color); - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, color.r, color.g, color.b); - let nextMap = timelineMap[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - break; - } - let time2 = getValue(nextMap, "time", 0); - let newColor = Color.fromString(nextMap.color); - let curve = keyMap.curve; - if (curve) { - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1); - bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1); - bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1); - } - time = time2; - color = newColor; - keyMap = nextMap; - } - timelines.push(timeline); - } else if (timelineName == "alpha") { - timelines.push(readTimeline12(timelineMap, new AlphaTimeline(timelineMap.length, timelineMap.length, slotIndex), 0, 1)); - } else if (timelineName == "rgba2") { - let timeline = new RGBA2Timeline(timelineMap.length, timelineMap.length * 7, slotIndex); - let keyMap = timelineMap[0]; - let time = getValue(keyMap, "time", 0); - let color = Color.fromString(keyMap.light); - let color2 = Color.fromString(keyMap.dark); - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b); - let nextMap = timelineMap[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - break; - } - let time2 = getValue(nextMap, "time", 0); - let newColor = Color.fromString(nextMap.light); - let newColor2 = Color.fromString(nextMap.dark); - let curve = keyMap.curve; - if (curve) { - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1); - bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1); - bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1); - bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1); - bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1); - bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1); - bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1); - } - time = time2; - color = newColor; - color2 = newColor2; - keyMap = nextMap; - } - timelines.push(timeline); - } else if (timelineName == "rgb2") { - let timeline = new RGB2Timeline(timelineMap.length, timelineMap.length * 6, slotIndex); - let keyMap = timelineMap[0]; - let time = getValue(keyMap, "time", 0); - let color = Color.fromString(keyMap.light); - let color2 = Color.fromString(keyMap.dark); - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b); - let nextMap = timelineMap[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - break; - } - let time2 = getValue(nextMap, "time", 0); - let newColor = Color.fromString(nextMap.light); - let newColor2 = Color.fromString(nextMap.dark); - let curve = keyMap.curve; - if (curve) { - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1); - bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1); - bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1); - bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1); - bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1); - bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1); - } - time = time2; - color = newColor; - color2 = newColor2; - keyMap = nextMap; - } - timelines.push(timeline); - } - } - } - } - if (map.bones) { - for (let boneName in map.bones) { - let boneMap = map.bones[boneName]; - let boneIndex = skeletonData.findBoneIndex(boneName); - for (let timelineName in boneMap) { - let timelineMap = boneMap[timelineName]; - if (timelineMap.length == 0) - continue; - if (timelineName === "rotate") { - timelines.push(readTimeline12(timelineMap, new RotateTimeline(timelineMap.length, timelineMap.length, boneIndex), 0, 1)); - } else if (timelineName === "translate") { - let timeline = new TranslateTimeline(timelineMap.length, timelineMap.length << 1, boneIndex); - timelines.push(readTimeline22(timelineMap, timeline, "x", "y", 0, scale)); - } else if (timelineName === "translatex") { - let timeline = new TranslateXTimeline(timelineMap.length, timelineMap.length, boneIndex); - timelines.push(readTimeline12(timelineMap, timeline, 0, scale)); - } else if (timelineName === "translatey") { - let timeline = new TranslateYTimeline(timelineMap.length, timelineMap.length, boneIndex); - timelines.push(readTimeline12(timelineMap, timeline, 0, scale)); - } else if (timelineName === "scale") { - let timeline = new ScaleTimeline(timelineMap.length, timelineMap.length << 1, boneIndex); - timelines.push(readTimeline22(timelineMap, timeline, "x", "y", 1, 1)); - } else if (timelineName === "scalex") { - let timeline = new ScaleXTimeline(timelineMap.length, timelineMap.length, boneIndex); - timelines.push(readTimeline12(timelineMap, timeline, 1, 1)); - } else if (timelineName === "scaley") { - let timeline = new ScaleYTimeline(timelineMap.length, timelineMap.length, boneIndex); - timelines.push(readTimeline12(timelineMap, timeline, 1, 1)); - } else if (timelineName === "shear") { - let timeline = new ShearTimeline(timelineMap.length, timelineMap.length << 1, boneIndex); - timelines.push(readTimeline22(timelineMap, timeline, "x", "y", 0, 1)); - } else if (timelineName === "shearx") { - let timeline = new ShearXTimeline(timelineMap.length, timelineMap.length, boneIndex); - timelines.push(readTimeline12(timelineMap, timeline, 0, 1)); - } else if (timelineName === "sheary") { - let timeline = new ShearYTimeline(timelineMap.length, timelineMap.length, boneIndex); - timelines.push(readTimeline12(timelineMap, timeline, 0, 1)); - } - } - } - } - if (map.ik) { - for (let constraintName in map.ik) { - let constraintMap = map.ik[constraintName]; - let keyMap = constraintMap[0]; - if (!keyMap) - continue; - let constraint = skeletonData.findIkConstraint(constraintName); - let constraintIndex = skeletonData.ikConstraints.indexOf(constraint); - let timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, constraintIndex); - let time = getValue(keyMap, "time", 0); - let mix = getValue(keyMap, "mix", 1); - let softness = getValue(keyMap, "softness", 0) * scale; - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, mix, softness, getValue(keyMap, "bendPositive", true) ? 1 : -1, getValue(keyMap, "compress", false), getValue(keyMap, "stretch", false)); - let nextMap = constraintMap[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - break; - } - let time2 = getValue(nextMap, "time", 0); - let mix2 = getValue(nextMap, "mix", 1); - let softness2 = getValue(nextMap, "softness", 0) * scale; - let curve = keyMap.curve; - if (curve) { - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1); - bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale); - } - time = time2; - mix = mix2; - softness = softness2; - keyMap = nextMap; - } - timelines.push(timeline); - } - } - if (map.transform) { - for (let constraintName in map.transform) { - let timelineMap = map.transform[constraintName]; - let keyMap = timelineMap[0]; - if (!keyMap) - continue; - let constraint = skeletonData.findTransformConstraint(constraintName); - let constraintIndex = skeletonData.transformConstraints.indexOf(constraint); - let timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length << 2, constraintIndex); - let time = getValue(keyMap, "time", 0); - let mixRotate = getValue(keyMap, "mixRotate", 1); - let mixX = getValue(keyMap, "mixX", 1); - let mixY = getValue(keyMap, "mixY", mixX); - let mixScaleX = getValue(keyMap, "mixScaleX", 1); - let mixScaleY = getValue(keyMap, "mixScaleY", mixScaleX); - let mixShearY = getValue(keyMap, "mixShearY", 1); - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY); - let nextMap = timelineMap[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - break; - } - let time2 = getValue(nextMap, "time", 0); - let mixRotate2 = getValue(nextMap, "mixRotate", 1); - let mixX2 = getValue(nextMap, "mixX", 1); - let mixY2 = getValue(nextMap, "mixY", mixX2); - let mixScaleX2 = getValue(nextMap, "mixScaleX", 1); - let mixScaleY2 = getValue(nextMap, "mixScaleY", mixScaleX2); - let mixShearY2 = getValue(nextMap, "mixShearY", 1); - let curve = keyMap.curve; - if (curve) { - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1); - bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1); - bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1); - bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1); - bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1); - bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1); - } - time = time2; - mixRotate = mixRotate2; - mixX = mixX2; - mixY = mixY2; - mixScaleX = mixScaleX2; - mixScaleY = mixScaleY2; - mixScaleX = mixScaleX2; - keyMap = nextMap; - } - timelines.push(timeline); - } - } - if (map.path) { - for (let constraintName in map.path) { - let constraintMap = map.path[constraintName]; - let constraint = skeletonData.findPathConstraint(constraintName); - let constraintIndex = skeletonData.pathConstraints.indexOf(constraint); - for (let timelineName in constraintMap) { - let timelineMap = constraintMap[timelineName]; - let keyMap = timelineMap[0]; - if (!keyMap) - continue; - if (timelineName === "position") { - let timeline = new PathConstraintPositionTimeline(timelineMap.length, timelineMap.length, constraintIndex); - timelines.push(readTimeline12(timelineMap, timeline, 0, constraint.positionMode == PositionMode.Fixed ? scale : 1)); - } else if (timelineName === "spacing") { - let timeline = new PathConstraintSpacingTimeline(timelineMap.length, timelineMap.length, constraintIndex); - timelines.push(readTimeline12(timelineMap, timeline, 0, constraint.spacingMode == SpacingMode.Length || constraint.spacingMode == SpacingMode.Fixed ? scale : 1)); - } else if (timelineName === "mix") { - let timeline = new PathConstraintMixTimeline(timelineMap.size, timelineMap.size * 3, constraintIndex); - let time = getValue(keyMap, "time", 0); - let mixRotate = getValue(keyMap, "mixRotate", 1); - let mixX = getValue(keyMap, "mixX", 1); - let mixY = getValue(keyMap, "mixY", mixX); - for (let frame = 0, bezier = 0; ; frame++) { - timeline.setFrame(frame, time, mixRotate, mixX, mixY); - let nextMap = timelineMap[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - break; - } - let time2 = getValue(nextMap, "time", 0); - let mixRotate2 = getValue(nextMap, "mixRotate", 1); - let mixX2 = getValue(nextMap, "mixX", 1); - let mixY2 = getValue(nextMap, "mixY", mixX2); - let curve = keyMap.curve; - if (curve) { - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1); - bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1); - bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1); - } - time = time2; - mixRotate = mixRotate2; - mixX = mixX2; - mixY = mixY2; - keyMap = nextMap; - } - timelines.push(timeline); - } - } - } - } - if (map.deform) { - for (let deformName in map.deform) { - let deformMap = map.deform[deformName]; - let skin = skeletonData.findSkin(deformName); - for (let slotName in deformMap) { - let slotMap = deformMap[slotName]; - let slotIndex = skeletonData.findSlotIndex(slotName); - for (let timelineName in slotMap) { - let timelineMap = slotMap[timelineName]; - let keyMap = timelineMap[0]; - if (!keyMap) - continue; - let attachment = skin.getAttachment(slotIndex, timelineName); - let weighted = attachment.bones; - let vertices = attachment.vertices; - let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length; - let timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment); - let time = getValue(keyMap, "time", 0); - for (let frame = 0, bezier = 0; ; frame++) { - let deform; - let verticesValue = getValue(keyMap, "vertices", null); - if (!verticesValue) - deform = weighted ? Utils.newFloatArray(deformLength) : vertices; - else { - deform = Utils.newFloatArray(deformLength); - let start = getValue(keyMap, "offset", 0); - Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length); - if (scale != 1) { - for (let i = start, n = i + verticesValue.length; i < n; i++) - deform[i] *= scale; - } - if (!weighted) { - for (let i = 0; i < deformLength; i++) - deform[i] += vertices[i]; - } - } - timeline.setFrame(frame, time, deform); - let nextMap = timelineMap[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - break; - } - let time2 = getValue(nextMap, "time", 0); - let curve = keyMap.curve; - if (curve) - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1); - time = time2; - keyMap = nextMap; - } - timelines.push(timeline); - } - } - } - } - if (map.drawOrder) { - let timeline = new DrawOrderTimeline(map.drawOrder.length); - let slotCount = skeletonData.slots.length; - let frame = 0; - for (let i = 0; i < map.drawOrder.length; i++, frame++) { - let drawOrderMap = map.drawOrder[i]; - let drawOrder = null; - let offsets = getValue(drawOrderMap, "offsets", null); - if (offsets) { - drawOrder = Utils.newArray(slotCount, -1); - let unchanged = Utils.newArray(slotCount - offsets.length, 0); - let originalIndex = 0, unchangedIndex = 0; - for (let ii = 0; ii < offsets.length; ii++) { - let offsetMap = offsets[ii]; - let slotIndex = skeletonData.findSlotIndex(offsetMap.slot); - while (originalIndex != slotIndex) - unchanged[unchangedIndex++] = originalIndex++; - drawOrder[originalIndex + offsetMap.offset] = originalIndex++; - } - while (originalIndex < slotCount) - unchanged[unchangedIndex++] = originalIndex++; - for (let ii = slotCount - 1; ii >= 0; ii--) - if (drawOrder[ii] == -1) - drawOrder[ii] = unchanged[--unchangedIndex]; - } - timeline.setFrame(frame, getValue(drawOrderMap, "time", 0), drawOrder); - } - timelines.push(timeline); - } - if (map.events) { - let timeline = new EventTimeline(map.events.length); - let frame = 0; - for (let i = 0; i < map.events.length; i++, frame++) { - let eventMap = map.events[i]; - let eventData = skeletonData.findEvent(eventMap.name); - let event = new Event(Utils.toSinglePrecision(getValue(eventMap, "time", 0)), eventData); - event.intValue = getValue(eventMap, "int", eventData.intValue); - event.floatValue = getValue(eventMap, "float", eventData.floatValue); - event.stringValue = getValue(eventMap, "string", eventData.stringValue); - if (event.data.audioPath) { - event.volume = getValue(eventMap, "volume", 1); - event.balance = getValue(eventMap, "balance", 0); - } - timeline.setFrame(frame, event); - } - timelines.push(timeline); - } - let duration = 0; - for (let i = 0, n = timelines.length; i < n; i++) - duration = Math.max(duration, timelines[i].getDuration()); - skeletonData.animations.push(new Animation(name, timelines, duration)); - } - }; - var LinkedMesh2 = class { - constructor(mesh, skin, slotIndex, parent, inheritDeform) { - this.mesh = mesh; - this.skin = skin; - this.slotIndex = slotIndex; - this.parent = parent; - this.inheritDeform = inheritDeform; - } - }; - function readTimeline12(keys, timeline, defaultValue, scale) { - let keyMap = keys[0]; - let time = getValue(keyMap, "time", 0); - let value = getValue(keyMap, "value", defaultValue) * scale; - let bezier = 0; - for (let frame = 0; ; frame++) { - timeline.setFrame(frame, time, value); - let nextMap = keys[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - return timeline; - } - let time2 = getValue(nextMap, "time", 0); - let value2 = getValue(nextMap, "value", defaultValue) * scale; - if (keyMap.curve) - bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale); - time = time2; - value = value2; - keyMap = nextMap; - } - } - function readTimeline22(keys, timeline, name1, name2, defaultValue, scale) { - let keyMap = keys[0]; - let time = getValue(keyMap, "time", 0); - let value1 = getValue(keyMap, name1, defaultValue) * scale; - let value2 = getValue(keyMap, name2, defaultValue) * scale; - let bezier = 0; - for (let frame = 0; ; frame++) { - timeline.setFrame(frame, time, value1, value2); - let nextMap = keys[frame + 1]; - if (!nextMap) { - timeline.shrink(bezier); - return timeline; - } - let time2 = getValue(nextMap, "time", 0); - let nvalue1 = getValue(nextMap, name1, defaultValue) * scale; - let nvalue2 = getValue(nextMap, name2, defaultValue) * scale; - let curve = keyMap.curve; - if (curve) { - bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale); - bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale); - } - time = time2; - value1 = nvalue1; - value2 = nvalue2; - keyMap = nextMap; - } - } - function readCurve(curve, timeline, bezier, frame, value, time1, time2, value1, value2, scale) { - if (curve == "stepped") { - timeline.setStepped(frame); - return bezier; - } - let i = value << 2; - let cx1 = curve[i]; - let cy1 = curve[i + 1] * scale; - let cx2 = curve[i + 2]; - let cy2 = curve[i + 3] * scale; - timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2); - return bezier + 1; - } - function getValue(map, property, defaultValue) { - return map[property] !== void 0 ? map[property] : defaultValue; - } - - // spine-core/src/polyfills.ts - (() => { - if (typeof Math.fround === "undefined") { - Math.fround = function(array) { - return function(x) { - return array[0] = x, array[0]; - }; - }(new Float32Array(1)); - } - })(); - - // spine-core/src/vertexeffects/JitterEffect.ts - var JitterEffect = class { - constructor(jitterX, jitterY) { - this.jitterX = 0; - this.jitterY = 0; - this.jitterX = jitterX; - this.jitterY = jitterY; - } - begin(skeleton) { - } - transform(position, uv, light, dark) { - position.x += MathUtils.randomTriangular(-this.jitterX, this.jitterY); - position.y += MathUtils.randomTriangular(-this.jitterX, this.jitterY); - } - end() { - } - }; - - // spine-core/src/vertexeffects/SwirlEffect.ts - var _SwirlEffect = class { - constructor(radius) { - this.centerX = 0; - this.centerY = 0; - this.radius = 0; - this.angle = 0; - this.worldX = 0; - this.worldY = 0; - this.radius = radius; - } - begin(skeleton) { - this.worldX = skeleton.x + this.centerX; - this.worldY = skeleton.y + this.centerY; - } - transform(position, uv, light, dark) { - let radAngle = this.angle * MathUtils.degreesToRadians; - let x = position.x - this.worldX; - let y = position.y - this.worldY; - let dist = Math.sqrt(x * x + y * y); - if (dist < this.radius) { - let theta = _SwirlEffect.interpolation.apply(0, radAngle, (this.radius - dist) / this.radius); - let cos = Math.cos(theta); - let sin = Math.sin(theta); - position.x = cos * x - sin * y + this.worldX; - position.y = sin * x + cos * y + this.worldY; - } - } - end() { - } - }; - var SwirlEffect = _SwirlEffect; - SwirlEffect.interpolation = new PowOut(2); - - // spine-canvas/src/CanvasTexture.ts - var CanvasTexture = class extends Texture { - constructor(image) { - super(image); - } - setFilters(minFilter, magFilter) { - } - setWraps(uWrap, vWrap) { - } - dispose() { - } - }; - - // spine-canvas/src/AssetManager.ts - var AssetManager = class extends AssetManagerBase { - constructor(pathPrefix = "", downloader = null) { - super((image) => { - return new CanvasTexture(image); - }, pathPrefix, downloader); - } - }; - - // spine-canvas/src/SkeletonRenderer.ts - var _SkeletonRenderer = class { - constructor(context) { - this.triangleRendering = false; - this.debugRendering = false; - this.vertices = Utils.newFloatArray(8 * 1024); - this.tempColor = new Color(); - this.ctx = context; - } - draw(skeleton) { - if (this.triangleRendering) - this.drawTriangles(skeleton); - else - this.drawImages(skeleton); - } - drawImages(skeleton) { - let ctx = this.ctx; - let color = this.tempColor; - let skeletonColor = skeleton.color; - let drawOrder = skeleton.drawOrder; - if (this.debugRendering) - ctx.strokeStyle = "green"; - for (let i = 0, n = drawOrder.length; i < n; i++) { - let slot = drawOrder[i]; - let bone = slot.bone; - if (!bone.active) - continue; - let attachment = slot.getAttachment(); - if (!(attachment instanceof RegionAttachment)) - continue; - let region = attachment.region; - let image = region.page.texture.getImage(); - let slotColor = slot.color; - let regionColor = attachment.color; - color.set(skeletonColor.r * slotColor.r * regionColor.r, skeletonColor.g * slotColor.g * regionColor.g, skeletonColor.b * slotColor.b * regionColor.b, skeletonColor.a * slotColor.a * regionColor.a); - ctx.save(); - ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY); - ctx.translate(attachment.offset[0], attachment.offset[1]); - ctx.rotate(attachment.rotation * Math.PI / 180); - let atlasScale = attachment.width / region.originalWidth; - ctx.scale(atlasScale * attachment.scaleX, atlasScale * attachment.scaleY); - let w = region.width, h = region.height; - ctx.translate(w / 2, h / 2); - if (attachment.region.degrees == 90) { - let t = w; - w = h; - h = t; - ctx.rotate(-Math.PI / 2); - } - ctx.scale(1, -1); - ctx.translate(-w / 2, -h / 2); - if (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) { - ctx.globalAlpha = color.a; - } - ctx.drawImage(image, region.x, region.y, w, h, 0, 0, w, h); - if (this.debugRendering) - ctx.strokeRect(0, 0, w, h); - ctx.restore(); - } - } - drawTriangles(skeleton) { - let ctx = this.ctx; - let color = this.tempColor; - let skeletonColor = skeleton.color; - let drawOrder = skeleton.drawOrder; - let blendMode = null; - let vertices = this.vertices; - let triangles = null; - for (let i = 0, n = drawOrder.length; i < n; i++) { - let slot = drawOrder[i]; - let attachment = slot.getAttachment(); - let texture; - let region; - if (attachment instanceof RegionAttachment) { - let regionAttachment = attachment; - vertices = this.computeRegionVertices(slot, regionAttachment, false); - triangles = _SkeletonRenderer.QUAD_TRIANGLES; - region = regionAttachment.region; - texture = region.page.texture.getImage(); - } else if (attachment instanceof MeshAttachment) { - let mesh = attachment; - vertices = this.computeMeshVertices(slot, mesh, false); - triangles = mesh.triangles; - texture = mesh.region.renderObject.page.texture.getImage(); - } else - continue; - if (texture) { - if (slot.data.blendMode != blendMode) - blendMode = slot.data.blendMode; - let slotColor = slot.color; - let attachmentColor = attachment.color; - color.set(skeletonColor.r * slotColor.r * attachmentColor.r, skeletonColor.g * slotColor.g * attachmentColor.g, skeletonColor.b * slotColor.b * attachmentColor.b, skeletonColor.a * slotColor.a * attachmentColor.a); - if (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) { - ctx.globalAlpha = color.a; - } - for (var j = 0; j < triangles.length; j += 3) { - let t1 = triangles[j] * 8, t2 = triangles[j + 1] * 8, t3 = triangles[j + 2] * 8; - let x0 = vertices[t1], y0 = vertices[t1 + 1], u0 = vertices[t1 + 6], v0 = vertices[t1 + 7]; - let x1 = vertices[t2], y1 = vertices[t2 + 1], u1 = vertices[t2 + 6], v1 = vertices[t2 + 7]; - let x2 = vertices[t3], y2 = vertices[t3 + 1], u2 = vertices[t3 + 6], v2 = vertices[t3 + 7]; - this.drawTriangle(texture, x0, y0, u0, v0, x1, y1, u1, v1, x2, y2, u2, v2); - if (this.debugRendering) { - ctx.strokeStyle = "green"; - ctx.beginPath(); - ctx.moveTo(x0, y0); - ctx.lineTo(x1, y1); - ctx.lineTo(x2, y2); - ctx.lineTo(x0, y0); - ctx.stroke(); - } - } - } - } - this.ctx.globalAlpha = 1; - } - drawTriangle(img, x0, y0, u0, v0, x1, y1, u1, v1, x2, y2, u2, v2) { - let ctx = this.ctx; - u0 *= img.width; - v0 *= img.height; - u1 *= img.width; - v1 *= img.height; - u2 *= img.width; - v2 *= img.height; - ctx.beginPath(); - ctx.moveTo(x0, y0); - ctx.lineTo(x1, y1); - ctx.lineTo(x2, y2); - ctx.closePath(); - x1 -= x0; - y1 -= y0; - x2 -= x0; - y2 -= y0; - u1 -= u0; - v1 -= v0; - u2 -= u0; - v2 -= v0; - var det = 1 / (u1 * v2 - u2 * v1), a = (v2 * x1 - v1 * x2) * det, b = (v2 * y1 - v1 * y2) * det, c = (u1 * x2 - u2 * x1) * det, d = (u1 * y2 - u2 * y1) * det, e = x0 - a * u0 - c * v0, f = y0 - b * u0 - d * v0; - ctx.save(); - ctx.transform(a, b, c, d, e, f); - ctx.clip(); - ctx.drawImage(img, 0, 0); - ctx.restore(); - } - computeRegionVertices(slot, region, pma) { - let skeletonColor = slot.bone.skeleton.color; - let slotColor = slot.color; - let regionColor = region.color; - let alpha = skeletonColor.a * slotColor.a * regionColor.a; - let multiplier = pma ? alpha : 1; - let color = this.tempColor; - color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha); - region.computeWorldVertices(slot.bone, this.vertices, 0, _SkeletonRenderer.VERTEX_SIZE); - let vertices = this.vertices; - let uvs = region.uvs; - vertices[RegionAttachment.C1R] = color.r; - vertices[RegionAttachment.C1G] = color.g; - vertices[RegionAttachment.C1B] = color.b; - vertices[RegionAttachment.C1A] = color.a; - vertices[RegionAttachment.U1] = uvs[0]; - vertices[RegionAttachment.V1] = uvs[1]; - vertices[RegionAttachment.C2R] = color.r; - vertices[RegionAttachment.C2G] = color.g; - vertices[RegionAttachment.C2B] = color.b; - vertices[RegionAttachment.C2A] = color.a; - vertices[RegionAttachment.U2] = uvs[2]; - vertices[RegionAttachment.V2] = uvs[3]; - vertices[RegionAttachment.C3R] = color.r; - vertices[RegionAttachment.C3G] = color.g; - vertices[RegionAttachment.C3B] = color.b; - vertices[RegionAttachment.C3A] = color.a; - vertices[RegionAttachment.U3] = uvs[4]; - vertices[RegionAttachment.V3] = uvs[5]; - vertices[RegionAttachment.C4R] = color.r; - vertices[RegionAttachment.C4G] = color.g; - vertices[RegionAttachment.C4B] = color.b; - vertices[RegionAttachment.C4A] = color.a; - vertices[RegionAttachment.U4] = uvs[6]; - vertices[RegionAttachment.V4] = uvs[7]; - return vertices; - } - computeMeshVertices(slot, mesh, pma) { - let skeletonColor = slot.bone.skeleton.color; - let slotColor = slot.color; - let regionColor = mesh.color; - let alpha = skeletonColor.a * slotColor.a * regionColor.a; - let multiplier = pma ? alpha : 1; - let color = this.tempColor; - color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha); - let vertexCount = mesh.worldVerticesLength / 2; - let vertices = this.vertices; - if (vertices.length < mesh.worldVerticesLength) - this.vertices = vertices = Utils.newFloatArray(mesh.worldVerticesLength); - mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, _SkeletonRenderer.VERTEX_SIZE); - let uvs = mesh.uvs; - for (let i = 0, u = 0, v = 2; i < vertexCount; i++) { - vertices[v++] = color.r; - vertices[v++] = color.g; - vertices[v++] = color.b; - vertices[v++] = color.a; - vertices[v++] = uvs[u++]; - vertices[v++] = uvs[u++]; - v += 2; - } - return vertices; - } - }; - var SkeletonRenderer = _SkeletonRenderer; - SkeletonRenderer.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0]; - SkeletonRenderer.VERTEX_SIZE = 2 + 2 + 4; - - // spine-canvas/src/index.ts - var exports = eval("src_exports"); - exports.canvas = exports; - return src_exports; -})(); +var spine=(()=>{var gr=Object.defineProperty;var Lr=Y=>gr(Y,"__esModule",{value:!0});var Vr=(Y,e)=>{Lr(Y);for(var r in e)gr(Y,r,{get:e[r],enumerable:!0})};var nn={};Vr(nn,{AlphaTimeline:()=>Ze,Animation:()=>Ye,AnimationState:()=>At,AnimationStateAdapter:()=>Ar,AnimationStateData:()=>vr,AssetManager:()=>Pr,AssetManagerBase:()=>Pt,AtlasAttachmentLoader:()=>Tr,Attachment:()=>xt,AttachmentTimeline:()=>de,BinaryInput:()=>ir,BlendMode:()=>St,Bone:()=>vt,BoneData:()=>ht,BoundingBoxAttachment:()=>Be,CURRENT:()=>kr,CanvasTexture:()=>Nt,ClippingAttachment:()=>ot,Color:()=>R,ConstraintData:()=>De,CurveTimeline:()=>me,CurveTimeline1:()=>ce,CurveTimeline2:()=>yt,DebugUtils:()=>pr,DeformTimeline:()=>tt,Downloader:()=>nr,DrawOrderTimeline:()=>fe,Event:()=>mt,EventData:()=>ct,EventQueue:()=>Jt,EventTimeline:()=>ve,EventType:()=>ae,FIRST:()=>Qt,FakeTexture:()=>Sr,HOLD_FIRST:()=>Ft,HOLD_MIX:()=>wr,HOLD_SUBSEQUENT:()=>Zt,IkConstraint:()=>Lt,IkConstraintData:()=>ut,IkConstraintTimeline:()=>rt,IntSet:()=>br,Interpolation:()=>qt,JitterEffect:()=>Er,MathUtils:()=>M,MeshAttachment:()=>se,MixBlend:()=>S,MixDirection:()=>re,PathAttachment:()=>ge,PathConstraint:()=>Ee,PathConstraintData:()=>dt,PathConstraintMixTimeline:()=>st,PathConstraintPositionTimeline:()=>it,PathConstraintSpacingTimeline:()=>at,PointAttachment:()=>lt,Pool:()=>we,PositionMode:()=>oe,Pow:()=>Ht,PowOut:()=>Yt,RGB2Timeline:()=>et,RGBA2Timeline:()=>Ke,RGBATimeline:()=>Je,RGBTimeline:()=>Qe,RegionAttachment:()=>V,RotateMode:()=>Se,RotateTimeline:()=>ke,SETUP:()=>Kt,SUBSEQUENT:()=>Xt,ScaleTimeline:()=>qe,ScaleXTimeline:()=>He,ScaleYTimeline:()=>Ge,ShearTimeline:()=>je,ShearXTimeline:()=>$e,ShearYTimeline:()=>_e,Skeleton:()=>Ir,SkeletonBinary:()=>Mr,SkeletonBounds:()=>Xr,SkeletonClipping:()=>Ct,SkeletonData:()=>ft,SkeletonJson:()=>Fr,SkeletonRenderer:()=>Ot,Skin:()=>Le,SkinEntry:()=>Ut,Slot:()=>Vt,SlotData:()=>gt,SpacingMode:()=>Z,StringSet:()=>Ne,SwirlEffect:()=>or,Texture:()=>wt,TextureAtlas:()=>Et,TextureAtlasPage:()=>tr,TextureAtlasRegion:()=>kt,TextureFilter:()=>Xe,TextureRegion:()=>Dt,TextureWrap:()=>Fe,TimeKeeper:()=>xr,Timeline:()=>Q,TrackEntry:()=>_t,TransformConstraint:()=>Rt,TransformConstraintData:()=>bt,TransformConstraintTimeline:()=>nt,TransformMode:()=>ee,TranslateTimeline:()=>Oe,TranslateXTimeline:()=>We,TranslateYTimeline:()=>ze,Triangulator:()=>ne,Utils:()=>P,Vector2:()=>Bt,VertexAttachment:()=>K,WindowedMean:()=>yr});var br=class{constructor(){this.array=new Array}add(e){let r=this.contains(e);return this.array[e|0]=e|0,!r}contains(e){return this.array[e|0]!=null}remove(e){this.array[e|0]=void 0}clear(){this.array.length=0}},Ne=class{constructor(){this.entries={};this.size=0}add(e){let r=this.entries[e];return this.entries[e]=!0,r?!1:(this.size++,!0)}addAll(e){let r=this.size;for(var t=0,a=e.length;t1&&(this.r=1),this.g<0?this.g=0:this.g>1&&(this.g=1),this.b<0?this.b=0:this.b>1&&(this.b=1),this.a<0?this.a=0:this.a>1&&(this.a=1),this}static rgba8888ToColor(e,r){e.r=((r&4278190080)>>>24)/255,e.g=((r&16711680)>>>16)/255,e.b=((r&65280)>>>8)/255,e.a=(r&255)/255}static rgb888ToColor(e,r){e.r=((r&16711680)>>>16)/255,e.g=((r&65280)>>>8)/255,e.b=(r&255)/255}static fromString(e){return new Me().setFromString(e)}},R=Me;R.WHITE=new Me(1,1,1,1),R.RED=new Me(1,0,0,1),R.GREEN=new Me(0,1,0,1),R.BLUE=new Me(0,0,1,1),R.MAGENTA=new Me(1,0,1,1);var xe=class{static clamp(e,r,t){return et?t:e}static cosDeg(e){return Math.cos(e*xe.degRad)}static sinDeg(e){return Math.sin(e*xe.degRad)}static signum(e){return e>0?1:e<0?-1:0}static toInt(e){return e>0?Math.floor(e):Math.ceil(e)}static cbrt(e){let r=Math.pow(Math.abs(e),1/3);return e<0?-r:r}static randomTriangular(e,r){return xe.randomTriangularWith(e,r,(e+r)*.5)}static randomTriangularWith(e,r,t){let a=Math.random(),i=r-e;return a<=(t-e)/i?e+Math.sqrt(a*i*(t-e)):r-Math.sqrt((1-a)*i*(r-t))}static isPowerOfTwo(e){return e&&(e&e-1)==0}},M=xe;M.PI=3.1415927,M.PI2=xe.PI*2,M.radiansToDegrees=180/xe.PI,M.radDeg=xe.radiansToDegrees,M.degreesToRadians=xe.PI/180,M.degRad=xe.degreesToRadians;var qt=class{apply(e,r,t){return e+(r-e)*this.applyInternal(t)}},Ht=class extends qt{constructor(e){super();this.power=2;this.power=e}applyInternal(e){return e<=.5?Math.pow(e*2,this.power)/2:Math.pow((e-1)*2,this.power)/(this.power%2==0?-2:2)+1}},Yt=class extends Ht{constructor(e){super(e)}applyInternal(e){return Math.pow(e-1,this.power)*(this.power%2==0?-1:1)+1}},Pe=class{static arrayCopy(e,r,t,a,i){for(let m=r,s=a;m=r?e:Pe.setArraySize(e,r,t)}static newArray(e,r){let t=new Array(e);for(let a=0;a0?this.items.pop():this.instantiator()}free(e){e.reset&&e.reset(),this.items.push(e)}freeAll(e){for(let r=0;rthis.maxDelta&&(this.delta=this.maxDelta),this.lastTime=e,this.frameCount++,this.frameTime>1&&(this.framesPerSecond=this.frameCount/this.frameTime,this.frameTime=0,this.frameCount=0)}},yr=class{constructor(e=32){this.addedValues=0;this.lastValue=0;this.mean=0;this.dirty=!0;this.values=new Array(e)}hasEnoughData(){return this.addedValues>=this.values.length}addValue(e){this.addedValuesthis.values.length-1&&(this.lastValue=0),this.dirty=!0}getMean(){if(this.hasEnoughData()){if(this.dirty){let e=0;for(let r=0;r>1)*m;let s=e.bone.skeleton,n=e.deform,l=this.vertices,o=this.bones;if(!o){n.length>0&&(l=n);let d=e.bone,f=d.worldX,b=d.worldY,y=d.a,A=d.b,g=d.c,p=d.d;for(let x=r,w=i;w0&&(r%=this.duration));let l=this.timelines;for(let o=0,h=l.length;or)return a-1;return t-1}static search(e,r,t){let a=e.length;for(let i=t;ir)return i-t;return a-t}},me=class extends Q{constructor(e,r,t){super(e,t);this.curves=P.newFloatArray(e+r*18),this.curves[e-1]=1}setLinear(e){this.curves[e]=0}setStepped(e){this.curves[e]=1}shrink(e){let r=this.getFrameCount()+e*18;if(this.curves.length>r){let t=P.newFloatArray(r);P.arrayCopy(this.curves,0,t,0,r),this.curves=t}}setBezier(e,r,t,a,i,m,s,n,l,o,h){let c=this.curves,u=this.getFrameCount()+e*18;t==0&&(c[r]=2+u);let d=(a-m*2+n)*.03,f=(i-s*2+l)*.03,b=((m-n)*3-a+o)*.006,y=((s-l)*3-i+h)*.006,A=d*2+b,g=f*2+y,p=(m-a)*.3+d+b*.16666667,x=(s-i)*.3+f+y*.16666667,w=a+p,k=i+x;for(let v=u+18;ue){let l=this.frames[r],o=this.frames[r+t];return o+(e-l)/(i[a]-l)*(i[a+1]-o)}let m=a+18;for(a+=2;a=e){let l=i[a-2],o=i[a-1];return o+(e-l)/(i[a]-l)*(i[a+1]-o)}r+=this.getFrameEntries();let s=i[m-2],n=i[m-1];return n+(e-s)/(this.frames[r]-s)*(this.frames[r+t]-n)}},ce=class extends me{constructor(e,r,t){super(e,r,[t])}getFrameEntries(){return 2}setFrame(e,r,t){e<<=1,this.frames[e]=r,this.frames[e+1]=t}getCurveValue(e){let r=this.frames,t=r.length-2;for(let i=2;i<=t;i+=2)if(r[i]>e){t=i-2;break}let a=this.curves[t>>1];switch(a){case 0:let i=r[t],m=r[t+1];return m+(e-i)/(r[t+2]-i)*(r[t+2+1]-m);case 1:return r[t+1]}return this.getBezierValue(e,t,1,a-2)}},yt=class extends me{constructor(e,r,t,a){super(e,r,[t,a])}getFrameEntries(){return 3}setFrame(e,r,t,a){e*=3,this.frames[e]=r,this.frames[e+1]=t,this.frames[e+2]=a}},ke=class extends ce{constructor(e,r,t){super(e,r,_.rotate+"|"+t);this.boneIndex=0;this.boneIndex=t}apply(e,r,t,a,i,m,s){let n=e.bones[this.boneIndex];if(!n.active)return;let l=this.frames;if(t>2];switch(f){case 0:let b=l[d];h=l[d+1],c=l[d+2],u=l[d+3];let y=(t-b)/(l[d+4]-b);h+=(l[d+4+1]-h)*y,c+=(l[d+4+2]-c)*y,u+=(l[d+4+3]-u)*y;break;case 1:h=l[d+1],c=l[d+2],u=l[d+3];break;default:h=this.getBezierValue(t,d,1,f-2),c=this.getBezierValue(t,d,2,f+18-2),u=this.getBezierValue(t,d,3,f+18*2-2)}if(i==1)o.r=h,o.g=c,o.b=u;else{if(m==0){let b=n.data.color;o.r=b.r,o.g=b.g,o.b=b.b}o.r+=(h-o.r)*i,o.g+=(c-o.g)*i,o.b+=(u-o.b)*i}}},Ze=class extends ce{constructor(e,r,t){super(e,r,_.alpha+"|"+t);this.slotIndex=0;this.slotIndex=t}apply(e,r,t,a,i,m,s){let n=e.slots[this.slotIndex];if(!n.bone.active)return;let l=n.color;if(t>3];switch(p){case 0:let x=l[g];c=l[g+1],u=l[g+2],d=l[g+3],f=l[g+4],b=l[g+5],y=l[g+6],A=l[g+7];let w=(t-x)/(l[g+8]-x);c+=(l[g+8+1]-c)*w,u+=(l[g+8+2]-u)*w,d+=(l[g+8+3]-d)*w,f+=(l[g+8+4]-f)*w,b+=(l[g+8+5]-b)*w,y+=(l[g+8+6]-y)*w,A+=(l[g+8+7]-A)*w;break;case 1:c=l[g+1],u=l[g+2],d=l[g+3],f=l[g+4],b=l[g+5],y=l[g+6],A=l[g+7];break;default:c=this.getBezierValue(t,g,1,p-2),u=this.getBezierValue(t,g,2,p+18-2),d=this.getBezierValue(t,g,3,p+18*2-2),f=this.getBezierValue(t,g,4,p+18*3-2),b=this.getBezierValue(t,g,5,p+18*4-2),y=this.getBezierValue(t,g,6,p+18*5-2),A=this.getBezierValue(t,g,7,p+18*6-2)}if(i==1)o.set(c,u,d,f),h.r=b,h.g=y,h.b=A;else{if(m==0){o.setFromColor(n.data.color);let x=n.data.darkColor;h.r=x.r,h.g=x.g,h.b=x.b}o.add((c-o.r)*i,(u-o.g)*i,(d-o.b)*i,(f-o.a)*i),h.r+=(b-h.r)*i,h.g+=(y-h.g)*i,h.b+=(A-h.b)*i}}},et=class extends me{constructor(e,r,t){super(e,r,[_.rgb+"|"+t,_.rgb2+"|"+t]);this.slotIndex=0;this.slotIndex=t}getFrameEntries(){return 7}setFrame(e,r,t,a,i,m,s,n){e*=7,this.frames[e]=r,this.frames[e+1]=t,this.frames[e+2]=a,this.frames[e+3]=i,this.frames[e+4]=m,this.frames[e+5]=s,this.frames[e+6]=n}apply(e,r,t,a,i,m,s){let n=e.slots[this.slotIndex];if(!n.bone.active)return;let l=this.frames,o=n.color,h=n.darkColor;if(te){let n=this.frames[r];return t[a+1]*(e-n)/(t[a]-n)}let i=a+18;for(a+=2;a=e){let n=t[a-2],l=t[a-1];return l+(e-n)/(t[a]-n)*(t[a+1]-l)}let m=t[i-2],s=t[i-1];return s+(1-s)*(e-m)/(this.frames[r+this.getFrameEntries()]-m)}apply(e,r,t,a,i,m,s){let n=e.slots[this.slotIndex];if(!n.bone.active)return;let l=n.getAttachment();if(!(l instanceof K)||l.deformAttachment!=this.attachment)return;let o=n.deform;o.length==0&&(m=0);let h=this.vertices,c=h[0].length,u=this.frames;if(t=u[u.length-1]){let g=h[u.length-1];if(i==1)if(m==3){let p=l;if(p.bones)for(let x=0;xt)this.apply(e,r,Number.MAX_VALUE,a,i,m,s),r=-1;else if(r>=n[l-1])return;if(t0&&n[o-1]==h;)o--}for(;o=n[o];o++)a.push(this.events[o])}},ve=jt;ve.propertyIds=[""+_.event];var $t=class extends Q{constructor(e){super(e,$t.propertyIds);this.drawOrders=new Array(e)}getFrameCount(){return this.frames.length}setFrame(e,r,t){this.frames[e]=r,this.drawOrders[e]=t}apply(e,r,t,a,i,m,s){if(s==1){m==0&&P.arrayCopy(e.slots,0,e.drawOrder,0,e.slots.length);return}if(t>2];switch(d){case 0:let f=l[u];o=l[u+1],h=l[u+2],c=l[u+3];let b=(t-f)/(l[u+4]-f);o+=(l[u+4+1]-o)*b,h+=(l[u+4+2]-h)*b,c+=(l[u+4+3]-c)*b;break;case 1:o=l[u+1],h=l[u+2],c=l[u+3];break;default:o=this.getBezierValue(t,u,1,d-2),h=this.getBezierValue(t,u,2,d+18-2),c=this.getBezierValue(t,u,3,d+18*2-2)}if(m==0){let f=n.data;n.mixRotate=f.mixRotate+(o-f.mixRotate)*i,n.mixX=f.mixX+(h-f.mixX)*i,n.mixY=f.mixY+(c-f.mixY)*i}else n.mixRotate+=(o-n.mixRotate)*i,n.mixX+=(h-n.mixX)*i,n.mixY+=(c-n.mixY)*i}};var At=class{constructor(e){this.tracks=new Array;this.timeScale=1;this.unkeyedState=0;this.events=new Array;this.listeners=new Array;this.queue=new Jt(this);this.propertyIDs=new Ne;this.animationsChanged=!1;this.trackEntryPool=new we(()=>new _t);this.data=e}static emptyAnimation(){return er||(er=new Ye("",[],0)),er}update(e){e*=this.timeScale;let r=this.tracks;for(let t=0,a=r.length;t0){if(i.delay-=m,i.delay>0)continue;m=-i.delay,i.delay=0}let s=i.next;if(s){let n=i.trackLast-s.delay;if(n>=0){for(s.delay=0,s.trackTime+=i.timeScale==0?0:(n/i.timeScale+e)*s.timeScale,i.trackTime+=m,this.setCurrent(t,s,!0);s.mixingFrom;)s.mixTime+=e,s=s.mixingFrom;continue}}else if(i.trackLast>=i.trackEnd&&!i.mixingFrom){r[t]=null,this.queue.end(i),this.clearNext(i);continue}if(i.mixingFrom&&this.updateMixingFrom(i,e)){let n=i.mixingFrom;for(i.mixingFrom=null,n&&(n.mixingTo=null);n;)this.queue.end(n),n=n.mixingFrom}i.trackTime+=m}this.queue.drain()}updateMixingFrom(e,r){let t=e.mixingFrom;if(!t)return!0;let a=this.updateMixingFrom(t,r);return t.animationLast=t.nextAnimationLast,t.trackLast=t.nextTrackLast,e.mixTime>0&&e.mixTime>=e.mixDuration?((t.totalAlpha==0||e.mixDuration==0)&&(e.mixingFrom=t.mixingFrom,t.mixingFrom&&(t.mixingFrom.mixingTo=e),e.interruptAlpha=t.interruptAlpha,this.queue.end(t)),a):(t.trackTime+=r*t.timeScale,e.mixTime+=r,!1)}apply(e){if(!e)throw new Error("skeleton cannot be null.");this.animationsChanged&&this._animationsChanged();let r=this.events,t=this.tracks,a=!1;for(let c=0,u=t.length;c0)continue;a=!0;let f=c==0?S.first:d.mixBlend,b=d.alpha;d.mixingFrom?b*=this.applyMixingFrom(d,e,f):d.trackTime>=d.trackEnd&&!d.next&&(b=0);let y=d.animationLast,A=d.getAnimationTime(),g=A,p=r;d.reverse&&(g=d.animation.duration-g,p=null);let x=d.animation.timelines,w=x.length;if(c==0&&b==1||f==S.add)for(let k=0;k1&&(i=1),t!=S.first&&(t=a.mixBlend));let m=i0&&this.queueEvents(a,u),this.events.length=0,a.nextAnimationLast=u,a.nextTrackLast=a.trackTime,i}applyAttachmentTimeline(e,r,t,a,i){var m=r.slots[e.slotIndex];!m.bone.active||(t0,A=f>=0;M.signum(b)!=M.signum(d)&&Math.abs(b)<=90&&(Math.abs(f)>180&&(f+=360*M.signum(f)),A=y),u=d+f-f%360,A!=y&&(u+=360*M.signum(f)),m[s]=u}m[s+1]=d,l.rotation=h+u*a}queueEvents(e,r){let t=e.animationStart,a=e.animationEnd,i=a-t,m=e.trackLast%i,s=this.events,n=0,l=s.length;for(;na||this.queue.event(e,h)}let o=!1;for(e.loop?o=i==0||m>e.trackTime%i:o=r>=a&&e.animationLast=this.tracks.length)return;let r=this.tracks[e];if(!r)return;this.queue.end(r),this.clearNext(r);let t=r;for(;;){let a=t.mixingFrom;if(!a)break;this.queue.end(a),t.mixingFrom=null,t.mixingTo=null,t=a}this.tracks[r.trackIndex]=null,this.queue.drain()}setCurrent(e,r,t){let a=this.expandToIndex(e);this.tracks[e]=r,r.previous=null,a&&(t&&this.queue.interrupt(a),r.mixingFrom=a,a.mixingTo=r,r.mixTime=0,a.mixingFrom&&a.mixDuration>0&&(r.interruptAlpha*=Math.min(1,a.mixTime/a.mixDuration)),a.timelinesRotation.length=0),this.queue.start(r)}setAnimation(e,r,t=!1){let a=this.data.skeletonData.findAnimation(r);if(!a)throw new Error("Animation not found: "+r);return this.setAnimationWith(e,a,t)}setAnimationWith(e,r,t=!1){if(!r)throw new Error("animation cannot be null.");let a=!0,i=this.expandToIndex(e);i&&(i.nextTrackLast==-1?(this.tracks[e]=i.mixingFrom,this.queue.interrupt(i),this.queue.end(i),this.clearNext(i),i=i.mixingFrom,a=!1):this.clearNext(i));let m=this.trackEntry(e,r,t,i);return this.setCurrent(e,m,a),this.queue.drain(),m}addAnimation(e,r,t=!1,a=0){let i=this.data.skeletonData.findAnimation(r);if(!i)throw new Error("Animation not found: "+r);return this.addAnimationWith(e,i,t,a)}addAnimationWith(e,r,t=!1,a=0){if(!r)throw new Error("animation cannot be null.");let i=this.expandToIndex(e);if(i)for(;i.next;)i=i.next;let m=this.trackEntry(e,r,t,i);return i?(i.next=m,m.previous=i,a<=0&&(a+=i.getTrackComplete()-m.mixDuration)):(this.setCurrent(e,m,!0),this.queue.drain()),m.delay=a,m}setEmptyAnimation(e,r=0){let t=this.setAnimationWith(e,At.emptyAnimation(),!1);return t.mixDuration=r,t.trackEnd=r,t}addEmptyAnimation(e,r=0,t=0){let a=this.addAnimationWith(e,At.emptyAnimation(),!1,t);return t<=0&&(a.delay+=a.mixDuration-r),a.mixDuration=r,a.trackEnd=r,a}setEmptyAnimations(e=0){let r=this.queue.drainDisabled;this.queue.drainDisabled=!0;for(let t=0,a=this.tracks.length;t0){i[n]=wr,m[n]=h;continue e}break}i[n]=Ft}}}getCurrent(e){return e>=this.tracks.length?null:this.tracks[e]}addListener(e){if(!e)throw new Error("listener cannot be null.");this.listeners.push(e)}removeListener(e){let r=this.listeners.indexOf(e);r>=0&&this.listeners.splice(r,1)}clearListeners(){this.listeners.length=0}clearListenerNotifications(){this.queue.clear()}},_t=class{constructor(){this.mixBlend=S.replace;this.timelineMode=new Array;this.timelineHoldMix=new Array;this.timelinesRotation=new Array}reset(){this.next=null,this.previous=null,this.mixingFrom=null,this.mixingTo=null,this.animation=null,this.listener=null,this.timelineMode.length=0,this.timelineHoldMix.length=0,this.timelinesRotation.length=0}getAnimationTime(){if(this.loop){let e=this.animationEnd-this.animationStart;return e==0?this.animationStart:this.trackTime%e+this.animationStart}return Math.min(this.trackTime+this.animationStart,this.animationEnd)}setAnimationLast(e){this.animationLast=e,this.nextAnimationLast=e}isComplete(){return this.trackTime>=this.animationEnd-this.animationStart}resetRotationDirections(){this.timelinesRotation.length=0}getTrackComplete(){let e=this.animationEnd-this.animationStart;if(e!=0){if(this.loop)return e*(1+(this.trackTime/e|0));if(this.trackTime{a.width=parseInt(t[1]),a.height=parseInt(t[2])},m.format=()=>{},m.filter=()=>{a.minFilter=P.enumValue(Xe,t[1]),a.magFilter=P.enumValue(Xe,t[2])},m.repeat=()=>{t[1].indexOf("x")!=-1&&(a.uWrap=Fe.Repeat),t[1].indexOf("y")!=-1&&(a.vWrap=Fe.Repeat)},m.pma=()=>{a.pma=t[1]=="true"};var s={};s.xy=()=>{i.x=parseInt(t[1]),i.y=parseInt(t[2])},s.size=()=>{i.width=parseInt(t[1]),i.height=parseInt(t[2])},s.bounds=()=>{i.x=parseInt(t[1]),i.y=parseInt(t[2]),i.width=parseInt(t[3]),i.height=parseInt(t[4])},s.offset=()=>{i.offsetX=parseInt(t[1]),i.offsetY=parseInt(t[2])},s.orig=()=>{i.originalWidth=parseInt(t[1]),i.originalHeight=parseInt(t[2])},s.offsets=()=>{i.offsetX=parseInt(t[1]),i.offsetY=parseInt(t[2]),i.originalWidth=parseInt(t[3]),i.originalHeight=parseInt(t[4])},s.rotate=()=>{let h=t[1];h=="true"?i.degrees=90:h!="false"&&(i.degrees=parseInt(h))},s.index=()=>{i.index=parseInt(t[1])};let n=r.readLine();for(;n&&n.trim().length==0;)n=r.readLine();for(;!(!n||n.trim().length==0||r.readEntry(t,n)==0);)n=r.readLine();let l=null,o=null;for(;n!==null;)if(n.trim().length==0)a=null,n=r.readLine();else if(a){for(i=new kt,i.page=a,i.name=n;;){let h=r.readEntry(t,n=r.readLine());if(h==0)break;let c=s[t[0]];if(c)c();else{l||(l=[],o=[]),l.push(t[0]);let u=[];for(let d=0;d0&&(i.names=l,i.values=o,l=null,o=null),i.u=i.x/a.width,i.v=i.y/a.height,i.degrees==90?(i.u2=(i.x+i.height)/a.width,i.v2=(i.y+i.width)/a.height):(i.u2=(i.x+i.width)/a.width,i.v2=(i.y+i.height)/a.height),this.regions.push(i)}else{for(a=new tr,a.name=n.trim();r.readEntry(t,n=r.readLine())!=0;){let h=m[t[0]];h&&h()}this.pages.push(a)}}findRegion(e){for(let r=0;r=this.lines.length?null:this.lines[this.index++]}readEntry(e,r){if(!r||(r=r.trim(),r.length==0))return 0;let t=r.indexOf(":");if(t==-1)return 0;e[0]=r.substr(0,t).trim();for(let a=1,i=t+1;;a++){let m=r.indexOf(",",i);if(m==-1)return e[a]=r.substr(i).trim(),a;if(e[a]=r.substr(i,m-i).trim(),i=m+1,a==4)return 4}}},tr=class{constructor(){this.minFilter=Xe.Nearest;this.magFilter=Xe.Nearest;this.uWrap=Fe.ClampToEdge;this.vWrap=Fe.ClampToEdge}setTexture(e){this.texture=e,e.setFilters(this.minFilter,this.magFilter),e.setWraps(this.uWrap,this.vWrap)}},kt=class extends Dt{};var se=class extends K{constructor(e){super(e);this.color=new R(1,1,1,1);this.tempColor=new R(0,0,0,0)}updateUVs(){let e=this.regionUVs;(!this.uvs||this.uvs.length!=e.length)&&(this.uvs=P.newFloatArray(e.length));let r=this.uvs,t=this.uvs.length,a=this.region.u,i=this.region.v,m=0,s=0;if(this.region instanceof kt){let n=this.region,l=n.page.texture.getImage(),o=l.width,h=l.height;switch(n.degrees){case 90:a-=(n.originalHeight-n.offsetY-n.height)/o,i-=(n.originalWidth-n.offsetX-n.width)/h,m=n.originalHeight/o,s=n.originalWidth/h;for(let c=0;c= 0.");if(!r)throw new Error("name cannot be null.");this.index=e,this.name=r,this.parent=t}},ee;(function(i){i[i.Normal=0]="Normal",i[i.OnlyTranslation=1]="OnlyTranslation",i[i.NoRotationOrReflection=2]="NoRotationOrReflection",i[i.NoScale=3]="NoScale",i[i.NoScaleOrReflection=4]="NoScaleOrReflection"})(ee||(ee={}));var vt=class{constructor(e,r,t){this.children=new Array;this.x=0;this.y=0;this.rotation=0;this.scaleX=0;this.scaleY=0;this.shearX=0;this.shearY=0;this.ax=0;this.ay=0;this.arotation=0;this.ascaleX=0;this.ascaleY=0;this.ashearX=0;this.ashearY=0;this.a=0;this.b=0;this.c=0;this.d=0;this.worldY=0;this.worldX=0;this.sorted=!1;this.active=!1;if(!e)throw new Error("data cannot be null.");if(!r)throw new Error("skeleton cannot be null.");this.data=e,this.skeleton=r,this.parent=t,this.setToSetupPose()}isActive(){return this.active}update(){this.updateWorldTransformWith(this.ax,this.ay,this.arotation,this.ascaleX,this.ascaleY,this.ashearX,this.ashearY)}updateWorldTransform(){this.updateWorldTransformWith(this.x,this.y,this.rotation,this.scaleX,this.scaleY,this.shearX,this.shearY)}updateWorldTransformWith(e,r,t,a,i,m,s){this.ax=e,this.ay=r,this.arotation=t,this.ascaleX=a,this.ascaleY=i,this.ashearX=m,this.ashearY=s;let n=this.parent;if(!n){let u=this.skeleton,d=t+90+s,f=u.scaleX,b=u.scaleY;this.a=M.cosDeg(t+m)*a*f,this.b=M.cosDeg(d)*i*f,this.c=M.sinDeg(t+m)*a*b,this.d=M.sinDeg(d)*i*b,this.worldX=e*f+u.x,this.worldY=r*b+u.y;return}let l=n.a,o=n.b,h=n.c,c=n.d;switch(this.worldX=l*e+o*r+n.worldX,this.worldY=h*e+c*r+n.worldY,this.data.transformMode){case ee.Normal:{let u=t+90+s,d=M.cosDeg(t+m)*a,f=M.cosDeg(u)*i,b=M.sinDeg(t+m)*a,y=M.sinDeg(u)*i;this.a=l*d+o*b,this.b=l*f+o*y,this.c=h*d+c*b,this.d=h*f+c*y;return}case ee.OnlyTranslation:{let u=t+90+s;this.a=M.cosDeg(t+m)*a,this.b=M.cosDeg(u)*i,this.c=M.sinDeg(t+m)*a,this.d=M.sinDeg(u)*i;break}case ee.NoRotationOrReflection:{let u=l*l+h*h,d=0;u>1e-4?(u=Math.abs(l*c-o*h)/u,l/=this.skeleton.scaleX,h/=this.skeleton.scaleY,o=h*u,c=l*u,d=Math.atan2(h,l)*M.radDeg):(l=0,h=0,d=90-Math.atan2(c,o)*M.radDeg);let f=t+m-d,b=t+s-d+90,y=M.cosDeg(f)*a,A=M.cosDeg(b)*i,g=M.sinDeg(f)*a,p=M.sinDeg(b)*i;this.a=l*y-o*g,this.b=l*A-o*p,this.c=h*y+c*g,this.d=h*A+c*p;break}case ee.NoScale:case ee.NoScaleOrReflection:{let u=M.cosDeg(t),d=M.sinDeg(t),f=(l*u+o*d)/this.skeleton.scaleX,b=(h*u+c*d)/this.skeleton.scaleY,y=Math.sqrt(f*f+b*b);y>1e-5&&(y=1/y),f*=y,b*=y,y=Math.sqrt(f*f+b*b),this.data.transformMode==ee.NoScale&&l*c-o*h<0!=(this.skeleton.scaleX<0!=this.skeleton.scaleY<0)&&(y=-y);let A=Math.PI/2+Math.atan2(b,f),g=Math.cos(A)*y,p=Math.sin(A)*y,x=M.cosDeg(m)*a,w=M.cosDeg(90+s)*i,k=M.sinDeg(m)*a,v=M.sinDeg(90+s)*i;this.a=f*x+g*k,this.b=f*w+g*v,this.c=b*x+p*k,this.d=b*w+p*v;break}}this.a*=this.skeleton.scaleX,this.b*=this.skeleton.scaleX,this.c*=this.skeleton.scaleY,this.d*=this.skeleton.scaleY}setToSetupPose(){let e=this.data;this.x=e.x,this.y=e.y,this.rotation=e.rotation,this.scaleX=e.scaleX,this.scaleY=e.scaleY,this.shearX=e.shearX,this.shearY=e.shearY}getWorldRotationX(){return Math.atan2(this.c,this.a)*M.radDeg}getWorldRotationY(){return Math.atan2(this.d,this.b)*M.radDeg}getWorldScaleX(){return Math.sqrt(this.a*this.a+this.c*this.c)}getWorldScaleY(){return Math.sqrt(this.b*this.b+this.d*this.d)}updateAppliedTransform(){let e=this.parent;if(!e){this.ax=this.worldX,this.ay=this.worldY,this.arotation=Math.atan2(this.c,this.a)*M.radDeg,this.ascaleX=Math.sqrt(this.a*this.a+this.c*this.c),this.ascaleY=Math.sqrt(this.b*this.b+this.d*this.d),this.ashearX=0,this.ashearY=Math.atan2(this.a*this.b+this.c*this.d,this.a*this.d-this.b*this.c)*M.radDeg;return}let r=e.a,t=e.b,a=e.c,i=e.d,m=1/(r*i-t*a),s=this.worldX-e.worldX,n=this.worldY-e.worldY;this.ax=s*i*m-n*t*m,this.ay=n*r*m-s*a*m;let l=m*i,o=m*r,h=m*t,c=m*a,u=l*this.a-h*this.c,d=l*this.b-h*this.d,f=o*this.c-c*this.a,b=o*this.d-c*this.b;if(this.ashearX=0,this.ascaleX=Math.sqrt(u*u+f*f),this.ascaleX>1e-4){let y=u*b-d*f;this.ascaleY=y/this.ascaleX,this.ashearY=Math.atan2(u*d+f*b,y)*M.radDeg,this.arotation=Math.atan2(f,u)*M.radDeg}else this.ascaleX=0,this.ascaleY=Math.sqrt(d*d+b*b),this.ashearY=0,this.arotation=90-Math.atan2(b,d)*M.radDeg}worldToLocal(e){let r=1/(this.a*this.d-this.b*this.c),t=e.x-this.worldX,a=e.y-this.worldY;return e.x=t*this.d*r-a*this.b*r,e.y=a*this.a*r-t*this.c*r,e}localToWorld(e){let r=e.x,t=e.y;return e.x=r*this.a+t*this.b+this.worldX,e.y=r*this.c+t*this.d+this.worldY,e}worldToLocalRotation(e){let r=M.sinDeg(e),t=M.cosDeg(e);return Math.atan2(this.a*r-this.c*t,this.d*t-this.b*r)*M.radDeg+this.rotation-this.shearX}localToWorldRotation(e){e-=this.rotation-this.shearX;let r=M.sinDeg(e),t=M.cosDeg(e);return Math.atan2(t*this.c+r*this.d,t*this.a+r*this.b)*M.radDeg}rotateWorld(e){let r=this.a,t=this.b,a=this.c,i=this.d,m=M.cosDeg(e),s=M.sinDeg(e);this.a=m*r-s*a,this.b=m*t-s*i,this.c=s*r+m*a,this.d=s*t+m*i}};var De=class{constructor(e,r,t){this.name=e;this.order=r;this.skinRequired=t}};var Pt=class{constructor(e,r="",t=null){this.assets={};this.errors={};this.toLoad=0;this.loaded=0;this.textureLoader=e,this.pathPrefix=r,this.downloader=t||new nr}start(e){return this.toLoad++,this.pathPrefix+e}success(e,r,t){this.toLoad--,this.loaded++,this.assets[r]=t,e&&e(r,t)}error(e,r,t){this.toLoad--,this.loaded++,this.errors[r]=t,e&&e(r,t)}setRawDataURI(e,r){this.downloader.rawDataUris[this.pathPrefix+e]=r}loadBinary(e,r=null,t=null){e=this.start(e),this.downloader.downloadBinary(e,a=>{this.success(r,e,a)},(a,i)=>{this.error(t,e,`Couldn't load binary ${e}: status ${a}, ${i}`)})}loadText(e,r=null,t=null){e=this.start(e),this.downloader.downloadText(e,a=>{this.success(r,e,a)},(a,i)=>{this.error(t,e,`Couldn't load text ${e}: status ${a}, ${i}`)})}loadJson(e,r=null,t=null){e=this.start(e),this.downloader.downloadJson(e,a=>{this.success(r,e,a)},(a,i)=>{this.error(t,e,`Couldn't load JSON ${e}: status ${a}, ${i}`)})}loadTexture(e,r=null,t=null){if(e=this.start(e),!!!(typeof window!="undefined"&&typeof navigator!="undefined"&&window.document))fetch(e,{mode:"cors"}).then(m=>m.ok?m.blob():(this.error(t,e,`Couldn't load image: ${e}`),null)).then(m=>m?createImageBitmap(m,{premultiplyAlpha:"none",colorSpaceConversion:"none"}):null).then(m=>{m&&this.success(r,e,this.textureLoader(m))});else{let m=new Image;m.crossOrigin="anonymous",m.onload=()=>{this.success(r,e,this.textureLoader(m))},m.onerror=()=>{this.error(t,e,`Couldn't load image: ${e}`)},this.downloader.rawDataUris[e]&&(e=this.downloader.rawDataUris[e]),m.src=e}}loadTextureAtlas(e,r=null,t=null){let a=e.lastIndexOf("/"),i=a>=0?e.substring(0,a+1):"";e=this.start(e),this.downloader.downloadText(e,m=>{try{let s=new Et(m),n=s.pages.length,l=!1;for(let o of s.pages)this.loadTexture(i+o.name,(h,c)=>{l||(o.setTexture(c),--n==0&&this.success(r,e,s))},(h,c)=>{l||this.error(t,e,`Couldn't load texture atlas ${e} page image: ${h}`),l=!0})}catch(s){this.error(t,e,`Couldn't parse texture atlas ${e}: ${s.message}`)}},(m,s)=>{this.error(t,e,`Couldn't load texture atlas ${e}: status ${m}, ${s}`)})}get(e){return this.assets[this.pathPrefix+e]}require(e){e=this.pathPrefix+e;let r=this.assets[e];if(r)return r;let t=this.errors[e];throw Error("Asset not found: "+e+(t?` +`+t:""))}remove(e){e=this.pathPrefix+e;let r=this.assets[e];return r.dispose&&r.dispose(),delete this.assets[e],r}removeAll(){for(let e in this.assets){let r=this.assets[e];r.dispose&&r.dispose()}this.assets={}}isLoadingComplete(){return this.toLoad==0}getToLoad(){return this.toLoad}getLoaded(){return this.loaded}dispose(){this.removeAll()}hasErrors(){return Object.keys(this.errors).length>0}getErrors(){return this.errors}},nr=class{constructor(){this.callbacks={};this.rawDataUris={}}downloadText(e,r,t){if(this.rawDataUris[e]&&(e=this.rawDataUris[e]),this.start(e,r,t))return;let a=new XMLHttpRequest;a.overrideMimeType("text/html"),a.open("GET",e,!0);let i=()=>{this.finish(e,a.status,a.responseText)};a.onload=i,a.onerror=i,a.send()}downloadJson(e,r,t){this.downloadText(e,a=>{r(JSON.parse(a))},t)}downloadBinary(e,r,t){if(this.rawDataUris[e]&&(e=this.rawDataUris[e]),this.start(e,r,t))return;let a=new XMLHttpRequest;a.open("GET",e,!0),a.responseType="arraybuffer";let i=()=>{this.finish(e,a.status,a.responseText)};a.onload=()=>{a.status==200?this.finish(e,200,new Uint8Array(a.response)):i()},a.onerror=i,a.send()}start(e,r,t){let a=this.callbacks[e];try{if(a)return!0;this.callbacks[e]=a=[]}finally{a.push(r,t)}}finish(e,r,t){let a=this.callbacks[e];delete this.callbacks[e];let i=r==200?[t]:[r,t];for(let m=i.length-1,s=a.length;m180?u-=360:u<-180&&(u+=360);let b=e.ascaleX,y=e.ascaleY;if(a||i){switch(e.data.transformMode){case ee.NoScale:case ee.NoScaleOrReflection:d=r-e.worldX,f=t-e.worldY}let A=e.data.length*b,g=Math.sqrt(d*d+f*f);if(a&&gA&&A>1e-4){let p=(g/A-1)*s+1;b*=p,m&&(y*=p)}}e.updateWorldTransformWith(e.ax,e.ay,e.arotation+u*s,b,y,e.ashearX,e.ashearY)}apply2(e,r,t,a,i,m,s,n,l){let o=e.ax,h=e.ay,c=e.ascaleX,u=e.ascaleY,d=c,f=u,b=r.ascaleX,y=0,A=0,g=0;c<0?(c=-c,y=180,g=-1):(y=0,g=1),u<0&&(u=-u,g=-g),b<0?(b=-b,A=180):A=0;let p=r.ax,x=0,w=0,k=0,v=e.a,B=e.b,I=e.c,D=e.d,L=Math.abs(c-u)<=1e-4;!L||m?(x=0,w=v*p+e.worldX,k=I*p+e.worldY):(x=r.ay,w=v*p+B*x+e.worldX,k=I*p+D*x+e.worldY);let E=e.parent;v=E.a,B=E.b,I=E.c,D=E.d;let F=1/(v*D-B*I),T=w-E.worldX,X=k-E.worldY,W=(T*D-X*B)*F-o,H=(X*v-T*I)*F-h,U=Math.sqrt(W*W+H*H),G=r.data.length*b,J,j;if(U<1e-4){this.apply1(e,t,a,!1,m,!1,l),r.updateWorldTransformWith(p,x,0,r.ascaleX,r.ascaleY,r.ashearX,r.ashearY);return}T=t-E.worldX,X=a-E.worldY;let O=(T*D-X*B)*F-o,N=(X*v-T*I)*F-h,$=O*O+N*N;if(n!=0){n*=c*(b+1)*.5;let te=Math.sqrt($),le=te-U-G*c+n;if(le>0){let he=Math.min(1,le/(n*2))-1;he=(le-n*(1-he*he))/te,O-=he*O,N-=he*N,$=O*O+N*N}}e:if(L){G*=c;let te=($-U*U-G*G)/(2*U*G);te<-1?(te=-1,j=Math.PI*i):te>1?(te=1,j=0,m&&(v=(Math.sqrt($)/(U+G)-1)*l+1,d*=v,s&&(f*=v))):j=Math.acos(te)*i,v=U+G*te,B=G*Math.sin(j),J=Math.atan2(N*v-O*B,O*v+N*B)}else{v=c*G,B=u*G;let te=v*v,le=B*B,he=Math.atan2(N,O);I=le*U*U+te*$-te*le;let Ie=-2*le*U,Ve=le-te;if(D=Ie*Ie-4*Ve*I,D>=0){let Re=Math.sqrt(D);Ie<0&&(Re=-Re),Re=-(Ie+Re)*.5;let dr=Re/Ve,fr=I/Re,Ue=Math.abs(dr)=-1&&I<=1&&(I=Math.acos(I),T=v*Math.cos(I)+U,X=B*Math.sin(I),D=T*T+X*X,Dzt&&(cr=I,zt=D,Mt=T,ur=X)),$<=(Wt+zt)*.5?(J=he-Math.atan2(mr*i,It),j=pt*i):(J=he-Math.atan2(ur*i,Mt),j=cr*i)}let ie=Math.atan2(x,p)*g,ue=e.arotation;J=(J-ie)*M.radDeg+y-ue,J>180?J-=360:J<-180&&(J+=360),e.updateWorldTransformWith(o,h,ue+J*l,d,f,0,0),ue=r.arotation,j=((j+ie)*M.radDeg-r.ashearX)*g+A-ue,j>180?j-=360:j<-180&&(j+=360),r.updateWorldTransformWith(p,x,ue+j*l,r.ascaleX,r.ascaleY,r.ashearX,r.ashearY)}};var ut=class extends De{constructor(e){super(e,0,!1);this.bones=new Array;this.bendDirection=1;this.compress=!1;this.stretch=!1;this.uniform=!1;this.mix=1;this.softness=0}};var dt=class extends De{constructor(e){super(e,0,!1);this.bones=new Array;this.mixRotate=0;this.mixX=0;this.mixY=0}},oe;(function(r){r[r.Fixed=0]="Fixed",r[r.Percent=1]="Percent"})(oe||(oe={}));var Z;(function(a){a[a.Length=0]="Length",a[a.Fixed=1]="Fixed",a[a.Percent=2]="Percent",a[a.Proportional=3]="Proportional"})(Z||(Z={}));var Se;(function(t){t[t.Tangent=0]="Tangent",t[t.Chain=1]="Chain",t[t.ChainScale=2]="ChainScale"})(Se||(Se={}));var ye=class{constructor(e,r){this.position=0;this.spacing=0;this.mixRotate=0;this.mixX=0;this.mixY=0;this.spaces=new Array;this.positions=new Array;this.world=new Array;this.curves=new Array;this.lengths=new Array;this.segments=new Array;this.active=!1;if(!e)throw new Error("data cannot be null.");if(!r)throw new Error("skeleton cannot be null.");this.data=e,this.bones=new Array;for(let t=0,a=e.bones.length;t0){g=o/g*u;for(let x=1;x0?M.degRad:-M.degRad}for(let g=0,p=3;g0){let I=x.a,D=x.b,L=x.c,E=x.d,F=0,T=0,X=0;if(m?F=d[p-1]:h[g+1]==0?F=d[p+2]:F=Math.atan2(B,v),F-=Math.atan2(L,I),A){T=Math.cos(F),X=Math.sin(F);let W=x.data.length;f+=(W*(T*I-X*L)-v)*r,b+=(W*(X*I+T*L)-B)*r}else F+=y;F>M.PI?F-=M.PI2:F<-M.PI&&(F+=M.PI2),F*=r,T=Math.cos(F),X=Math.sin(F),x.a=T*I-X*L,x.b=T*D-X*E,x.c=X*I+T*L,x.d=X*D+T*E}x.updateAppliedTransform()}}computeWorldPositions(e,r,t){let a=this.target,i=this.position,m=this.spaces,s=P.setArraySize(this.positions,r*3+2),n=null,l=e.closed,o=e.worldVerticesLength,h=o/6,c=ye.NONE;if(!e.constantSpeed){let H=e.lengths;h-=l?1:2;let U=H[h];this.data.positionMode==oe.Percent&&(i*=U);let G;switch(this.data.spacingMode){case Z.Percent:G=U;break;case Z.Proportional:G=U/r;break;default:G=1}n=P.setArraySize(this.world,8);for(let J=0,j=0,O=0;JU){c!=ye.AFTER&&(c=ye.AFTER,e.computeWorldVertices(a,o-6,4,n,0,2)),this.addAfterPosition($-U,n,0,s,j);continue}for(;;O++){let ie=H[O];if(!($>ie)){if(O==0)$/=ie;else{let ue=H[O-1];$=($-ue)/(ie-ue)}break}}O!=c&&(c=O,l&&O==h?(e.computeWorldVertices(a,o-4,4,n,0,2),e.computeWorldVertices(a,0,4,n,4,2)):e.computeWorldVertices(a,O*6+2,8,n,0,2)),this.addCurvePosition($,n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],s,j,t||J>0&&N==0)}return s}l?(o+=2,n=P.setArraySize(this.world,o),e.computeWorldVertices(a,2,o-4,n,0,2),e.computeWorldVertices(a,0,2,n,o-4,2),n[o-2]=n[0],n[o-1]=n[1]):(h--,o-=4,n=P.setArraySize(this.world,o),e.computeWorldVertices(a,2,o,n,0,2));let u=P.setArraySize(this.curves,h),d=0,f=n[0],b=n[1],y=0,A=0,g=0,p=0,x=0,w=0,k=0,v=0,B=0,I=0,D=0,L=0,E=0,F=0;for(let H=0,U=2;Hd){this.addAfterPosition(O-d,n,o-4,s,U);continue}for(;;G++){let N=u[G];if(!(O>N)){if(G==0)O/=N;else{let $=u[G-1];O=(O-$)/(N-$)}break}}if(G!=c){c=G;let N=G*6;for(f=n[N],b=n[N+1],y=n[N+2],A=n[N+3],g=n[N+4],p=n[N+5],x=n[N+6],w=n[N+7],k=(f-y*2+g)*.03,v=(b-A*2+p)*.03,B=((y-g)*3-f+x)*.006,I=((A-p)*3-b+w)*.006,D=k*2+B,L=v*2+I,E=(y-f)*.3+k+B*.16666667,F=(A-b)*.3+v+I*.16666667,W=Math.sqrt(E*E+F*F),X[0]=W,N=1;N<8;N++)E+=D,F+=L,D+=B,L+=I,W+=Math.sqrt(E*E+F*F),X[N]=W;E+=D,F+=L,W+=Math.sqrt(E*E+F*F),X[8]=W,E+=D+B,F+=L+I,W+=Math.sqrt(E*E+F*F),X[9]=W,J=0}for(O*=W;;J++){let N=X[J];if(!(O>N)){if(J==0)O/=N;else{let $=X[J-1];O=J+(O-$)/(N-$)}break}}this.addCurvePosition(O*.1,f,b,y,A,g,p,x,w,s,U,t||H>0&&j==0)}return s}addBeforePosition(e,r,t,a,i){let m=r[t],s=r[t+1],n=r[t+2]-m,l=r[t+3]-s,o=Math.atan2(l,n);a[i]=m+e*Math.cos(o),a[i+1]=s+e*Math.sin(o),a[i+2]=o}addAfterPosition(e,r,t,a,i){let m=r[t+2],s=r[t+3],n=m-r[t],l=s-r[t+1],o=Math.atan2(l,n);a[i]=m+e*Math.cos(o),a[i+1]=s+e*Math.sin(o),a[i+2]=o}addCurvePosition(e,r,t,a,i,m,s,n,l,o,h,c){if(e==0||isNaN(e)){o[h]=r,o[h+1]=t,o[h+2]=Math.atan2(i-t,a-r);return}let u=e*e,d=u*e,f=1-e,b=f*f,y=b*f,A=f*e,g=A*3,p=f*g,x=g*e,w=r*y+a*p+m*x+n*d,k=t*y+i*p+s*x+l*d;o[h]=w,o[h+1]=k,c&&(e<.001?o[h+2]=Math.atan2(i-t,a-r):o[h+2]=Math.atan2(k-(t*b+i*A*2+s*u),w-(r*b+a*A*2+m*u)))}},Ee=ye;Ee.NONE=-1,Ee.BEFORE=-2,Ee.AFTER=-3,Ee.epsilon=1e-5;var Vt=class{constructor(e,r){this.deform=new Array;if(!e)throw new Error("data cannot be null.");if(!r)throw new Error("bone cannot be null.");this.data=e,this.bone=r,this.color=new R,this.darkColor=e.darkColor?new R:null,this.setToSetupPose()}getSkeleton(){return this.bone.skeleton}getAttachment(){return this.attachment}setAttachment(e){this.attachment!=e&&((!(e instanceof K)||!(this.attachment instanceof K)||e.deformAttachment!=this.attachment.deformAttachment)&&(this.deform.length=0),this.attachment=e,this.attachmentTime=this.bone.skeleton.time)}setAttachmentTime(e){this.attachmentTime=this.bone.skeleton.time-e}getAttachmentTime(){return this.bone.skeleton.time-this.attachmentTime}setToSetupPose(){this.color.setFromColor(this.data.color),this.darkColor&&this.darkColor.setFromColor(this.data.darkColor),this.data.attachmentName?(this.attachment=null,this.setAttachment(this.bone.skeleton.getAttachment(this.data.index,this.data.attachmentName))):this.attachment=null}};var Rt=class{constructor(e,r){this.mixRotate=0;this.mixX=0;this.mixY=0;this.mixScaleX=0;this.mixScaleY=0;this.mixShearY=0;this.temp=new Bt;this.active=!1;if(!e)throw new Error("data cannot be null.");if(!r)throw new Error("skeleton cannot be null.");this.data=e,this.mixRotate=e.mixRotate,this.mixX=e.mixX,this.mixY=e.mixY,this.mixScaleX=e.mixScaleX,this.mixScaleY=e.mixScaleY,this.mixShearY=e.mixShearY,this.bones=new Array;for(let t=0;t0?M.degRad:-M.degRad,d=this.data.offsetRotation*u,f=this.data.offsetShearY*u,b=this.bones;for(let y=0,A=b.length;yM.PI?v-=M.PI2:v<-M.PI&&(v+=M.PI2),v*=e;let B=Math.cos(v),I=Math.sin(v);g.a=B*p-I*w,g.b=B*x-I*k,g.c=I*p+B*w,g.d=I*x+B*k}if(s){let p=this.temp;n.localToWorld(p.set(this.data.offsetX,this.data.offsetY)),g.worldX+=(p.x-g.worldX)*r,g.worldY+=(p.y-g.worldY)*t}if(a!=0){let p=Math.sqrt(g.a*g.a+g.c*g.c);p!=0&&(p=(p+(Math.sqrt(l*l+h*h)-p+this.data.offsetScaleX)*a)/p),g.a*=p,g.c*=p}if(i!=0){let p=Math.sqrt(g.b*g.b+g.d*g.d);p!=0&&(p=(p+(Math.sqrt(o*o+c*c)-p+this.data.offsetScaleY)*i)/p),g.b*=p,g.d*=p}if(m>0){let p=g.b,x=g.d,w=Math.atan2(x,p),k=Math.atan2(c,o)-Math.atan2(h,l)-(w-Math.atan2(g.c,g.a));k>M.PI?k-=M.PI2:k<-M.PI&&(k+=M.PI2),k=w+(k+f)*m;let v=Math.sqrt(p*p+x*x);g.b=Math.cos(k)*v,g.d=Math.sin(k)*v}g.updateAppliedTransform()}}applyRelativeWorld(){let e=this.mixRotate,r=this.mixX,t=this.mixY,a=this.mixScaleX,i=this.mixScaleY,m=this.mixShearY,s=r!=0||t!=0,n=this.target,l=n.a,o=n.b,h=n.c,c=n.d,u=l*c-o*h>0?M.degRad:-M.degRad,d=this.data.offsetRotation*u,f=this.data.offsetShearY*u,b=this.bones;for(let y=0,A=b.length;yM.PI?v-=M.PI2:v<-M.PI&&(v+=M.PI2),v*=e;let B=Math.cos(v),I=Math.sin(v);g.a=B*p-I*w,g.b=B*x-I*k,g.c=I*p+B*w,g.d=I*x+B*k}if(s){let p=this.temp;n.localToWorld(p.set(this.data.offsetX,this.data.offsetY)),g.worldX+=p.x*r,g.worldY+=p.y*t}if(a!=0){let p=(Math.sqrt(l*l+h*h)-1+this.data.offsetScaleX)*a+1;g.a*=p,g.c*=p}if(i!=0){let p=(Math.sqrt(o*o+c*c)-1+this.data.offsetScaleY)*i+1;g.b*=p,g.d*=p}if(m>0){let p=Math.atan2(c,o)-Math.atan2(h,l);p>M.PI?p-=M.PI2:p<-M.PI&&(p+=M.PI2);let x=g.b,w=g.d;p=Math.atan2(w,x)+(p-M.PI/2+f)*m;let k=Math.sqrt(x*x+w*w);g.b=Math.cos(p)*k,g.d=Math.sin(p)*k}g.updateAppliedTransform()}}applyAbsoluteLocal(){let e=this.mixRotate,r=this.mixX,t=this.mixY,a=this.mixScaleX,i=this.mixScaleY,m=this.mixShearY,s=this.target,n=this.bones;for(let l=0,o=n.length;l=a.length&&(a.length=e+1),a[e]||(a[e]={}),a[e][r]=t}addSkin(e){for(let a=0;a= 0.");if(!r)throw new Error("name cannot be null.");if(!t)throw new Error("boneData cannot be null.");this.index=e,this.name=r,this.boneData=t}},St;(function(a){a[a.Normal=0]="Normal",a[a.Additive=1]="Additive",a[a.Multiply=2]="Multiply",a[a.Screen=3]="Screen"})(St||(St={}));var bt=class extends De{constructor(e){super(e,0,!1);this.bones=new Array;this.mixRotate=0;this.mixX=0;this.mixY=0;this.mixScaleX=0;this.mixScaleY=0;this.mixShearY=0;this.offsetRotation=0;this.offsetX=0;this.offsetY=0;this.offsetScaleX=0;this.offsetScaleY=0;this.offsetShearY=0;this.relative=!1;this.local=!1}};var Mr=class{constructor(e){this.scale=1;this.linkedMeshes=new Array;this.attachmentLoader=e}readSkeletonData(e){let r=this.scale,t=new ft;t.name="";let a=new ir(e),i=a.readInt32(),m=a.readInt32();t.hash=m==0&&i==0?null:m.toString(16)+i.toString(16),t.version=a.readString(),t.x=a.readFloat(),t.y=a.readFloat(),t.width=a.readFloat(),t.height=a.readFloat();let s=a.readBoolean();s&&(t.fps=a.readFloat(),t.imagesPath=a.readString(),t.audioPath=a.readString());let n=0;n=a.readInt(!0);for(let o=0;o0){let h=new fe(n),c=t.slots.length;for(let u=0;u=0;p--)b[p]=-1;let y=P.newArray(c-f,0),A=0,g=0;for(let p=0;p=0;p--)b[p]==-1&&(b[p]=y[--g]);h.setFrame(u,d,b)}a.push(h)}let l=e.readInt(!0);if(l>0){let h=new ve(l);for(let c=0;c>>1^-(t&1)}readStringRef(){let e=this.readInt(!0);return e==0?null:this.strings[e-1]}readString(){let e=this.readInt(!0);switch(e){case 0:return null;case 1:return""}e--;let r="",t=0;for(let a=0;a>4){case 12:case 13:r+=String.fromCharCode((i&31)<<6|this.readByte()&63),a+=2;break;case 14:r+=String.fromCharCode((i&15)<<12|(this.readByte()&63)<<6|this.readByte()&63),a+=3;break;default:r+=String.fromCharCode(i),a++}}return r}readFloat(){let e=this.buffer.getFloat32(this.index);return this.index+=4,e}readBoolean(){return this.readByte()!=0}},Yr=class{constructor(e,r,t,a,i){this.mesh=e,this.skin=r,this.slotIndex=t,this.parent=a,this.inheritDeform=i}},Br=class{constructor(e=null,r=null){this.bones=e;this.vertices=r}},Ce;(function(s){s[s.Region=0]="Region",s[s.BoundingBox=1]="BoundingBox",s[s.Mesh=2]="Mesh",s[s.LinkedMesh=3]="LinkedMesh",s[s.Path=4]="Path",s[s.Point=5]="Point",s[s.Clipping=6]="Clipping"})(Ce||(Ce={}));function Te(Y,e,r){let t=Y.readFloat(),a=Y.readFloat()*r;for(let i=0,m=0,s=e.getFrameCount()-1;e.setFrame(i,t,a),i!=s;i++){let n=Y.readFloat(),l=Y.readFloat()*r;switch(Y.readByte()){case be:e.setStepped(i);break;case pe:z(Y,e,m++,i,0,t,n,a,l,r)}t=n,a=l}return e}function ar(Y,e,r){let t=Y.readFloat(),a=Y.readFloat()*r,i=Y.readFloat()*r;for(let m=0,s=0,n=e.getFrameCount()-1;e.setFrame(m,t,a,i),m!=n;m++){let l=Y.readFloat(),o=Y.readFloat()*r,h=Y.readFloat()*r;switch(Y.readByte()){case be:e.setStepped(m);break;case pe:z(Y,e,s++,m,0,t,l,a,o,r),z(Y,e,s++,m,1,t,l,i,h,r)}t=l,a=o,i=h}return e}function z(Y,e,r,t,a,i,m,s,n,l){e.setBezier(r,t,a,i,s,Y.readFloat(),Y.readFloat()*l,Y.readFloat(),Y.readFloat()*l,m,n)}var Rr=0,Ur=1,Nr=2,Or=3,Wr=4,zr=5,qr=6,Hr=7,Gr=8,jr=9,$r=0,_r=1,Jr=2,Qr=3,Zr=4,Kr=5,en=0,tn=1,rn=2;var be=1,pe=2;var Xr=class{constructor(){this.minX=0;this.minY=0;this.maxX=0;this.maxY=0;this.boundingBoxes=new Array;this.polygons=new Array;this.polygonPool=new we(()=>P.newFloatArray(16))}update(e,r){if(!e)throw new Error("skeleton cannot be null.");let t=this.boundingBoxes,a=this.polygons,i=this.polygonPool,m=e.slots,s=m.length;t.length=0,i.freeAll(a),a.length=0;for(let n=0;n=this.minX&&e<=this.maxX&&r>=this.minY&&r<=this.maxY}aabbIntersectsSegment(e,r,t,a){let i=this.minX,m=this.minY,s=this.maxX,n=this.maxY;if(e<=i&&t<=i||r<=m&&a<=m||e>=s&&t>=s||r>=n&&a>=n)return!1;let l=(a-r)/(t-e),o=l*(i-e)+r;if(o>m&&om&&oi&&hi&&he.minX&&this.minYe.minY}containsPoint(e,r){let t=this.polygons;for(let a=0,i=t.length;a=t||o=t){let h=a[n];h+(t-l)/(o-l)*(a[m]-h)=h&&p<=d||p>=d&&p<=h)&&(p>=r&&p<=a||p>=a&&p<=r)){let x=(o*A-l*b)/g;if((x>=c&&x<=f||x>=f&&x<=c)&&(x>=t&&x<=i||x>=i&&x<=t))return!0}h=d,c=f}return!1}getPolygon(e){if(!e)throw new Error("boundingBox cannot be null.");let r=this.boundingBoxes.indexOf(e);return r==-1?null:this.polygons[r]}getWidth(){return this.maxX-this.minX}getHeight(){return this.maxY-this.minY}};var ne=class{constructor(){this.convexPolygons=new Array;this.convexPolygonsIndices=new Array;this.indicesArray=new Array;this.isConcaveArray=new Array;this.triangles=new Array;this.polygonPool=new we(()=>new Array);this.polygonIndicesPool=new we(()=>new Array)}triangulate(e){let r=e,t=e.length>>1,a=this.indicesArray;a.length=0;for(let s=0;s3;){let s=t-1,n=0,l=1;for(;;){e:if(!i[n]){let c=a[s]<<1,u=a[n]<<1,d=a[l]<<1,f=r[c],b=r[c+1],y=r[u],A=r[u+1],g=r[d],p=r[d+1];for(let x=(l+1)%t;x!=s;x=(x+1)%t){if(!i[x])continue;let w=a[x]<<1,k=r[w],v=r[w+1];if(ne.positiveArea(g,p,f,b,k,v)&&ne.positiveArea(f,b,y,A,k,v)&&ne.positiveArea(y,A,g,p,k,v))break e}break}if(l==0){do{if(!i[n])break;n--}while(n>0);break}s=n,n=l,l=(l+1)%t}m.push(a[(t+n-1)%t]),m.push(a[n]),m.push(a[(n+1)%t]),a.splice(n,1),i.splice(n,1),t--;let o=(t+n-1)%t,h=n==t?0:n;i[o]=ne.isConcave(o,t,r,a),i[h]=ne.isConcave(h,t,r,a)}return t==3&&(m.push(a[2]),m.push(a[0]),m.push(a[1])),m}decompose(e,r){let t=e,a=this.convexPolygons;this.polygonPool.freeAll(a),a.length=0;let i=this.convexPolygonsIndices;this.polygonIndicesPool.freeAll(i),i.length=0;let m=this.polygonIndicesPool.obtain();m.length=0;let s=this.polygonPool.obtain();s.length=0;let n=-1,l=0;for(let o=0,h=r.length;o0?(a.push(s),i.push(m)):(this.polygonPool.free(s),this.polygonIndicesPool.free(m)),s=this.polygonPool.obtain(),s.length=0,s.push(f),s.push(b),s.push(y),s.push(A),s.push(g),s.push(p),m=this.polygonIndicesPool.obtain(),m.length=0,m.push(c),m.push(u),m.push(d),l=ne.winding(f,b,y,A,g,p),n=c)}s.length>0&&(a.push(s),i.push(m));for(let o=0,h=a.length;o=0;o--)s=a[o],s.length==0&&(a.splice(o,1),this.polygonPool.free(s),m=i[o],i.splice(o,1),this.polygonIndicesPool.free(m));return a}static isConcave(e,r,t,a){let i=a[(r+e-1)%r]<<1,m=a[e]<<1,s=a[(e+1)%r]<<1;return!this.positiveArea(t[i],t[i+1],t[m],t[m+1],t[s],t[s+1])}static positiveArea(e,r,t,a,i,m){return e*(m-a)+t*(r-m)+i*(a-r)>=0}static winding(e,r,t,a,i,m){let s=t-e,n=a-r;return i*n-m*s+s*r-e*n>=0?1:-1}};var Ct=class{constructor(){this.triangulator=new ne;this.clippingPolygon=new Array;this.clipOutput=new Array;this.clippedVertices=new Array;this.clippedTriangles=new Array;this.scratch=new Array}clipStart(e,r){if(this.clipAttachment)return 0;this.clipAttachment=r;let t=r.worldVerticesLength,a=P.setArraySize(this.clippingPolygon,t);r.computeWorldVertices(e,0,t,a,0,2);let i=this.clippingPolygon;Ct.makeClockwise(i);let m=this.clippingPolygons=this.triangulator.decompose(i,this.triangulator.triangulate(i));for(let s=0,n=m.length;s>1,O=this.clipOutput,N=P.setArraySize(o,T+j*d);for(let ie=0;ie=2?(h=n,n=this.scratch):h=this.scratch,h.length=0,h.push(e),h.push(r),h.push(t),h.push(a),h.push(i),h.push(m),h.push(e),h.push(r),n.length=0;let c=s,u=s.length-4;for(let d=0;;d+=2){let f=c[d],b=c[d+1],y=c[d+2],A=c[d+3],g=f-y,p=b-A,x=h,w=h.length-2,k=n.length;for(let B=0;B0;if(g*(D-A)-p*(I-y)>0){if(F){n.push(L),n.push(E);continue}let T=E-D,X=L-I,W=T*(y-f)-X*(A-b);if(Math.abs(W)>1e-6){let H=(X*(b-D)-T*(f-I))/W;n.push(f+(y-f)*H),n.push(b+(A-b)*H)}else n.push(f),n.push(b)}else if(F){let T=E-D,X=L-I,W=T*(y-f)-X*(A-b);if(Math.abs(W)>1e-6){let H=(X*(b-D)-T*(f-I))/W;n.push(f+(y-f)*H),n.push(b+(A-b)*H)}else n.push(f),n.push(b);n.push(L),n.push(E)}o=!0}if(k==n.length)return l.length=0,!0;if(n.push(n[0]),n.push(n[1]),d==u)break;let v=n;n=h,n.length=0,h=v}if(l!=n){l.length=0;for(let d=0,f=n.length-2;d>1;l=0;y--)c[y]==-1&&(c[y]=d[--b])}s.setFrame(l,C(h,"time",0),c)}i.push(s)}if(e.events){let s=new ve(e.events.length),n=0;for(let l=0;l{typeof Math.fround=="undefined"&&(Math.fround=function(Y){return function(e){return Y[0]=e,Y[0]}}(new Float32Array(1)))})();var Er=class{constructor(e,r){this.jitterX=0;this.jitterY=0;this.jitterX=e,this.jitterY=r}begin(e){}transform(e,r,t,a){e.x+=M.randomTriangular(-this.jitterX,this.jitterY),e.y+=M.randomTriangular(-this.jitterX,this.jitterY)}end(){}};var lr=class{constructor(e){this.centerX=0;this.centerY=0;this.radius=0;this.angle=0;this.worldX=0;this.worldY=0;this.radius=e}begin(e){this.worldX=e.x+this.centerX,this.worldY=e.y+this.centerY}transform(e,r,t,a){let i=this.angle*M.degreesToRadians,m=e.x-this.worldX,s=e.y-this.worldY,n=Math.sqrt(m*m+s*s);if(nnew Nt(t),e,r)}};var Tt=class{constructor(e){this.triangleRendering=!1;this.debugRendering=!1;this.vertices=P.newFloatArray(8*1024);this.tempColor=new R;this.ctx=e}draw(e){this.triangleRendering?this.drawTriangles(e):this.drawImages(e)}drawImages(e){let r=this.ctx,t=this.tempColor,a=e.color,i=e.drawOrder;this.debugRendering&&(r.strokeStyle="green");for(let m=0,s=i.length;m\n// \n// Now with modularization and using esbuild for bundling, we need to emulate this old\n// behaviour as to not break old clients.\n//\n// We pass `--global-name=spine` to esbuild. This will create an object containing\n// all exports and assign it to the global variable called `spine`.\n//\n// That solves half the issue. We also need to assign the exports object to \n// `spine.canvas`. esbuild creates a local variable called `scr_exports` pointing\n// to the exports object. We get to it via eval, then assign it to itself, on a new\n// property called `canvas`. The client can then access the APIs through `spine` and\n// `spine.canvas` as before (with the caveat that both spine-core and spine-canvas are\n// now in `spine` and `spine.canvas`).\n//\n// This will break if esbuild renames the variable `src_exports` pointing to\n// the exports object.\ndeclare global {\n\tvar spine: any;\n}\n\nlet exports = eval(\"src_exports\");\nexports.canvas = exports;", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Skeleton } from \"./Skeleton\";\nimport { MixBlend } from \"./Animation\";\n\nexport interface StringMap {\n\t[key: string]: T;\n}\n\nexport class IntSet {\n\tarray = new Array();\n\n\tadd(value: number): boolean {\n\t\tlet contains = this.contains(value);\n\t\tthis.array[value | 0] = value | 0;\n\t\treturn !contains;\n\t}\n\n\tcontains(value: number) {\n\t\treturn this.array[value | 0] != undefined;\n\t}\n\n\tremove(value: number) {\n\t\tthis.array[value | 0] = undefined;\n\t}\n\n\tclear() {\n\t\tthis.array.length = 0;\n\t}\n}\n\nexport class StringSet {\n\tentries: StringMap = {};\n\tsize = 0;\n\n\tadd(value: string): boolean {\n\t\tlet contains = this.entries[value];\n\t\tthis.entries[value] = true;\n\t\tif (!contains) {\n\t\t\tthis.size++;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\taddAll(values: string[]): boolean {\n\t\tlet oldSize = this.size;\n\t\tfor (var i = 0, n = values.length; i < n; i++)\n\t\t\tthis.add(values[i]);\n\t\treturn oldSize != this.size;\n\t}\n\n\tcontains(value: string) {\n\t\treturn this.entries[value];\n\t}\n\n\tclear() {\n\t\tthis.entries = {};\n\t\tthis.size = 0;\n\t}\n}\n\nexport interface NumberArrayLike {\n\treadonly length: number;\n\t[n: number]: number;\n}\n\nexport interface Disposable {\n\tdispose(): void;\n}\n\nexport interface Restorable {\n\trestore(): void;\n}\n\nexport class Color {\n\tpublic static WHITE = new Color(1, 1, 1, 1);\n\tpublic static RED = new Color(1, 0, 0, 1);\n\tpublic static GREEN = new Color(0, 1, 0, 1);\n\tpublic static BLUE = new Color(0, 0, 1, 1);\n\tpublic static MAGENTA = new Color(1, 0, 1, 1);\n\n\tconstructor(public r: number = 0, public g: number = 0, public b: number = 0, public a: number = 0) {\n\t}\n\n\tset(r: number, g: number, b: number, a: number) {\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\t\tthis.a = a;\n\t\treturn this.clamp();\n\t}\n\n\tsetFromColor(c: Color) {\n\t\tthis.r = c.r;\n\t\tthis.g = c.g;\n\t\tthis.b = c.b;\n\t\tthis.a = c.a;\n\t\treturn this;\n\t}\n\n\tsetFromString(hex: string) {\n\t\thex = hex.charAt(0) == '#' ? hex.substr(1) : hex;\n\t\tthis.r = parseInt(hex.substr(0, 2), 16) / 255;\n\t\tthis.g = parseInt(hex.substr(2, 2), 16) / 255;\n\t\tthis.b = parseInt(hex.substr(4, 2), 16) / 255;\n\t\tthis.a = hex.length != 8 ? 1 : parseInt(hex.substr(6, 2), 16) / 255;\n\t\treturn this;\n\t}\n\n\tadd(r: number, g: number, b: number, a: number) {\n\t\tthis.r += r;\n\t\tthis.g += g;\n\t\tthis.b += b;\n\t\tthis.a += a;\n\t\treturn this.clamp();\n\t}\n\n\tclamp() {\n\t\tif (this.r < 0) this.r = 0;\n\t\telse if (this.r > 1) this.r = 1;\n\n\t\tif (this.g < 0) this.g = 0;\n\t\telse if (this.g > 1) this.g = 1;\n\n\t\tif (this.b < 0) this.b = 0;\n\t\telse if (this.b > 1) this.b = 1;\n\n\t\tif (this.a < 0) this.a = 0;\n\t\telse if (this.a > 1) this.a = 1;\n\t\treturn this;\n\t}\n\n\tstatic rgba8888ToColor(color: Color, value: number) {\n\t\tcolor.r = ((value & 0xff000000) >>> 24) / 255;\n\t\tcolor.g = ((value & 0x00ff0000) >>> 16) / 255;\n\t\tcolor.b = ((value & 0x0000ff00) >>> 8) / 255;\n\t\tcolor.a = ((value & 0x000000ff)) / 255;\n\t}\n\n\tstatic rgb888ToColor(color: Color, value: number) {\n\t\tcolor.r = ((value & 0x00ff0000) >>> 16) / 255;\n\t\tcolor.g = ((value & 0x0000ff00) >>> 8) / 255;\n\t\tcolor.b = ((value & 0x000000ff)) / 255;\n\t}\n\n\tstatic fromString(hex: string): Color {\n\t\treturn new Color().setFromString(hex);\n\t}\n}\n\nexport class MathUtils {\n\tstatic PI = 3.1415927;\n\tstatic PI2 = MathUtils.PI * 2;\n\tstatic radiansToDegrees = 180 / MathUtils.PI;\n\tstatic radDeg = MathUtils.radiansToDegrees;\n\tstatic degreesToRadians = MathUtils.PI / 180;\n\tstatic degRad = MathUtils.degreesToRadians;\n\n\tstatic clamp(value: number, min: number, max: number) {\n\t\tif (value < min) return min;\n\t\tif (value > max) return max;\n\t\treturn value;\n\t}\n\n\tstatic cosDeg(degrees: number) {\n\t\treturn Math.cos(degrees * MathUtils.degRad);\n\t}\n\n\tstatic sinDeg(degrees: number) {\n\t\treturn Math.sin(degrees * MathUtils.degRad);\n\t}\n\n\tstatic signum(value: number): number {\n\t\treturn value > 0 ? 1 : value < 0 ? -1 : 0;\n\t}\n\n\tstatic toInt(x: number) {\n\t\treturn x > 0 ? Math.floor(x) : Math.ceil(x);\n\t}\n\n\tstatic cbrt(x: number) {\n\t\tlet y = Math.pow(Math.abs(x), 1 / 3);\n\t\treturn x < 0 ? -y : y;\n\t}\n\n\tstatic randomTriangular(min: number, max: number): number {\n\t\treturn MathUtils.randomTriangularWith(min, max, (min + max) * 0.5);\n\t}\n\n\tstatic randomTriangularWith(min: number, max: number, mode: number): number {\n\t\tlet u = Math.random();\n\t\tlet d = max - min;\n\t\tif (u <= (mode - min) / d) return min + Math.sqrt(u * d * (mode - min));\n\t\treturn max - Math.sqrt((1 - u) * d * (max - mode));\n\t}\n\n\tstatic isPowerOfTwo(value: number) {\n\t\treturn value && (value & (value - 1)) === 0;\n\t}\n}\n\nexport abstract class Interpolation {\n\tprotected abstract applyInternal(a: number): number;\n\tapply(start: number, end: number, a: number): number {\n\t\treturn start + (end - start) * this.applyInternal(a);\n\t}\n}\n\nexport class Pow extends Interpolation {\n\tprotected power = 2;\n\n\tconstructor(power: number) {\n\t\tsuper();\n\t\tthis.power = power;\n\t}\n\n\tapplyInternal(a: number): number {\n\t\tif (a <= 0.5) return Math.pow(a * 2, this.power) / 2;\n\t\treturn Math.pow((a - 1) * 2, this.power) / (this.power % 2 == 0 ? -2 : 2) + 1;\n\t}\n}\n\nexport class PowOut extends Pow {\n\tconstructor(power: number) {\n\t\tsuper(power);\n\t}\n\n\tapplyInternal(a: number): number {\n\t\treturn Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1;\n\t}\n}\n\nexport class Utils {\n\tstatic SUPPORTS_TYPED_ARRAYS = typeof (Float32Array) !== \"undefined\";\n\n\tstatic arrayCopy(source: ArrayLike, sourceStart: number, dest: ArrayLike, destStart: number, numElements: number) {\n\t\tfor (let i = sourceStart, j = destStart; i < sourceStart + numElements; i++, j++) {\n\t\t\tdest[j] = source[i];\n\t\t}\n\t}\n\n\tstatic arrayFill(array: ArrayLike, fromIndex: number, toIndex: number, value: T) {\n\t\tfor (let i = fromIndex; i < toIndex; i++)\n\t\t\tarray[i] = value;\n\t}\n\n\tstatic setArraySize(array: Array, size: number, value: any = 0): Array {\n\t\tlet oldSize = array.length;\n\t\tif (oldSize == size) return array;\n\t\tarray.length = size;\n\t\tif (oldSize < size) {\n\t\t\tfor (let i = oldSize; i < size; i++) array[i] = value;\n\t\t}\n\t\treturn array;\n\t}\n\n\tstatic ensureArrayCapacity(array: Array, size: number, value: any = 0): Array {\n\t\tif (array.length >= size) return array;\n\t\treturn Utils.setArraySize(array, size, value);\n\t}\n\n\tstatic newArray(size: number, defaultValue: T): Array {\n\t\tlet array = new Array(size);\n\t\tfor (let i = 0; i < size; i++) array[i] = defaultValue;\n\t\treturn array;\n\t}\n\n\tstatic newFloatArray(size: number): NumberArrayLike {\n\t\tif (Utils.SUPPORTS_TYPED_ARRAYS)\n\t\t\treturn new Float32Array(size)\n\t\telse {\n\t\t\tlet array = new Array(size);\n\t\t\tfor (let i = 0; i < array.length; i++) array[i] = 0;\n\t\t\treturn array;\n\t\t}\n\t}\n\n\tstatic newShortArray(size: number): NumberArrayLike {\n\t\tif (Utils.SUPPORTS_TYPED_ARRAYS)\n\t\t\treturn new Int16Array(size)\n\t\telse {\n\t\t\tlet array = new Array(size);\n\t\t\tfor (let i = 0; i < array.length; i++) array[i] = 0;\n\t\t\treturn array;\n\t\t}\n\t}\n\n\tstatic toFloatArray(array: Array) {\n\t\treturn Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array;\n\t}\n\n\tstatic toSinglePrecision(value: number) {\n\t\treturn Utils.SUPPORTS_TYPED_ARRAYS ? Math.fround(value) : value;\n\t}\n\n\t// This function is used to fix WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109\n\tstatic webkit602BugfixHelper(alpha: number, blend: MixBlend) {\n\t}\n\n\tstatic contains(array: Array, element: T, identity = true) {\n\t\tfor (var i = 0; i < array.length; i++)\n\t\t\tif (array[i] == element) return true;\n\t\treturn false;\n\t}\n\n\tstatic enumValue(type: any, name: string) {\n\t\treturn type[name[0].toUpperCase() + name.slice(1)];\n\t}\n}\n\nexport class DebugUtils {\n\tstatic logBones(skeleton: Skeleton) {\n\t\tfor (let i = 0; i < skeleton.bones.length; i++) {\n\t\t\tlet bone = skeleton.bones[i];\n\t\t\tconsole.log(bone.data.name + \", \" + bone.a + \", \" + bone.b + \", \" + bone.c + \", \" + bone.d + \", \" + bone.worldX + \", \" + bone.worldY);\n\t\t}\n\t}\n}\n\nexport class Pool {\n\tprivate items = new Array();\n\tprivate instantiator: () => T;\n\n\tconstructor(instantiator: () => T) {\n\t\tthis.instantiator = instantiator;\n\t}\n\n\tobtain() {\n\t\treturn this.items.length > 0 ? this.items.pop() : this.instantiator();\n\t}\n\n\tfree(item: T) {\n\t\tif ((item as any).reset) (item as any).reset();\n\t\tthis.items.push(item);\n\t}\n\n\tfreeAll(items: ArrayLike) {\n\t\tfor (let i = 0; i < items.length; i++)\n\t\t\tthis.free(items[i]);\n\t}\n\n\tclear() {\n\t\tthis.items.length = 0;\n\t}\n}\n\nexport class Vector2 {\n\tconstructor(public x = 0, public y = 0) {\n\t}\n\n\tset(x: number, y: number): Vector2 {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\treturn this;\n\t}\n\n\tlength() {\n\t\tlet x = this.x;\n\t\tlet y = this.y;\n\t\treturn Math.sqrt(x * x + y * y);\n\t}\n\n\tnormalize() {\n\t\tlet len = this.length();\n\t\tif (len != 0) {\n\t\t\tthis.x /= len;\n\t\t\tthis.y /= len;\n\t\t}\n\t\treturn this;\n\t}\n}\n\nexport class TimeKeeper {\n\tmaxDelta = 0.064;\n\tframesPerSecond = 0;\n\tdelta = 0;\n\ttotalTime = 0;\n\n\tprivate lastTime = Date.now() / 1000;\n\tprivate frameCount = 0;\n\tprivate frameTime = 0;\n\n\tupdate() {\n\t\tlet now = Date.now() / 1000;\n\t\tthis.delta = now - this.lastTime;\n\t\tthis.frameTime += this.delta;\n\t\tthis.totalTime += this.delta;\n\t\tif (this.delta > this.maxDelta) this.delta = this.maxDelta;\n\t\tthis.lastTime = now;\n\n\t\tthis.frameCount++;\n\t\tif (this.frameTime > 1) {\n\t\t\tthis.framesPerSecond = this.frameCount / this.frameTime;\n\t\t\tthis.frameTime = 0;\n\t\t\tthis.frameCount = 0;\n\t\t}\n\t}\n}\n\nexport interface ArrayLike {\n\tlength: number;\n\t[n: number]: T;\n}\n\nexport class WindowedMean {\n\tvalues: Array;\n\taddedValues = 0;\n\tlastValue = 0;\n\tmean = 0;\n\tdirty = true;\n\n\tconstructor(windowSize: number = 32) {\n\t\tthis.values = new Array(windowSize);\n\t}\n\n\thasEnoughData() {\n\t\treturn this.addedValues >= this.values.length;\n\t}\n\n\taddValue(value: number) {\n\t\tif (this.addedValues < this.values.length) this.addedValues++;\n\t\tthis.values[this.lastValue++] = value;\n\t\tif (this.lastValue > this.values.length - 1) this.lastValue = 0;\n\t\tthis.dirty = true;\n\t}\n\n\tgetMean() {\n\t\tif (this.hasEnoughData()) {\n\t\t\tif (this.dirty) {\n\t\t\t\tlet mean = 0;\n\t\t\t\tfor (let i = 0; i < this.values.length; i++)\n\t\t\t\t\tmean += this.values[i];\n\t\t\t\tthis.mean = mean / this.values.length;\n\t\t\t\tthis.dirty = false;\n\t\t\t}\n\t\t\treturn this.mean;\n\t\t}\n\t\treturn 0;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Slot } from \"../Slot\";\nimport { NumberArrayLike, Utils } from \"../Utils\";\n\n/** The base class for all attachments. */\nexport abstract class Attachment {\n\tname: string;\n\n\tconstructor(name: string) {\n\t\tif (!name) throw new Error(\"name cannot be null.\");\n\t\tthis.name = name;\n\t}\n\n\tabstract copy(): Attachment;\n}\n\n/** Base class for an attachment with vertices that are transformed by one or more bones and can be deformed by a slot's\n * {@link Slot#deform}. */\nexport abstract class VertexAttachment extends Attachment {\n\tprivate static nextID = 0;\n\n\t/** The unique ID for this attachment. */\n\tid = VertexAttachment.nextID++;\n\n\t/** The bones which affect the {@link #getVertices()}. The array entries are, for each vertex, the number of bones affecting\n\t * the vertex followed by that many bone indices, which is the index of the bone in {@link Skeleton#bones}. Will be null\n\t * if this attachment has no weights. */\n\tbones: Array;\n\n\t/** The vertex positions in the bone's coordinate system. For a non-weighted attachment, the values are `x,y`\n\t * entries for each vertex. For a weighted attachment, the values are `x,y,weight` entries for each bone affecting\n\t * each vertex. */\n\tvertices: NumberArrayLike;\n\n\t/** The maximum number of world vertex values that can be output by\n\t * {@link #computeWorldVertices()} using the `count` parameter. */\n\tworldVerticesLength = 0;\n\n\t/** Deform keys for the deform attachment are also applied to this attachment. May be null if no deform keys should be applied. */\n\tdeformAttachment: VertexAttachment = this;\n\n\tconstructor(name: string) {\n\t\tsuper(name);\n\t}\n\n\t/** Transforms the attachment's local {@link #vertices} to world coordinates. If the slot's {@link Slot#deform} is\n\t * not empty, it is used to deform the vertices.\n\t *\n\t * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine\n\t * Runtimes Guide.\n\t * @param start The index of the first {@link #vertices} value to transform. Each vertex has 2 values, x and y.\n\t * @param count The number of world vertex values to output. Must be <= {@link #worldVerticesLength} - `start`.\n\t * @param worldVertices The output world vertices. Must have a length >= `offset` + `count` *\n\t * `stride` / 2.\n\t * @param offset The `worldVertices` index to begin writing values.\n\t * @param stride The number of `worldVertices` entries between the value pairs written. */\n\tcomputeWorldVertices(slot: Slot, start: number, count: number, worldVertices: NumberArrayLike, offset: number, stride: number) {\n\t\tcount = offset + (count >> 1) * stride;\n\t\tlet skeleton = slot.bone.skeleton;\n\t\tlet deformArray = slot.deform;\n\t\tlet vertices = this.vertices;\n\t\tlet bones = this.bones;\n\t\tif (!bones) {\n\t\t\tif (deformArray.length > 0) vertices = deformArray;\n\t\t\tlet bone = slot.bone;\n\t\t\tlet x = bone.worldX;\n\t\t\tlet y = bone.worldY;\n\t\t\tlet a = bone.a, b = bone.b, c = bone.c, d = bone.d;\n\t\t\tfor (let v = start, w = offset; w < count; v += 2, w += stride) {\n\t\t\t\tlet vx = vertices[v], vy = vertices[v + 1];\n\t\t\t\tworldVertices[w] = vx * a + vy * b + x;\n\t\t\t\tworldVertices[w + 1] = vx * c + vy * d + y;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet v = 0, skip = 0;\n\t\tfor (let i = 0; i < start; i += 2) {\n\t\t\tlet n = bones[v];\n\t\t\tv += n + 1;\n\t\t\tskip += n;\n\t\t}\n\t\tlet skeletonBones = skeleton.bones;\n\t\tif (deformArray.length == 0) {\n\t\t\tfor (let w = offset, b = skip * 3; w < count; w += stride) {\n\t\t\t\tlet wx = 0, wy = 0;\n\t\t\t\tlet n = bones[v++];\n\t\t\t\tn += v;\n\t\t\t\tfor (; v < n; v++, b += 3) {\n\t\t\t\t\tlet bone = skeletonBones[bones[v]];\n\t\t\t\t\tlet vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2];\n\t\t\t\t\twx += (vx * bone.a + vy * bone.b + bone.worldX) * weight;\n\t\t\t\t\twy += (vx * bone.c + vy * bone.d + bone.worldY) * weight;\n\t\t\t\t}\n\t\t\t\tworldVertices[w] = wx;\n\t\t\t\tworldVertices[w + 1] = wy;\n\t\t\t}\n\t\t} else {\n\t\t\tlet deform = deformArray;\n\t\t\tfor (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) {\n\t\t\t\tlet wx = 0, wy = 0;\n\t\t\t\tlet n = bones[v++];\n\t\t\t\tn += v;\n\t\t\t\tfor (; v < n; v++, b += 3, f += 2) {\n\t\t\t\t\tlet bone = skeletonBones[bones[v]];\n\t\t\t\t\tlet vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2];\n\t\t\t\t\twx += (vx * bone.a + vy * bone.b + bone.worldX) * weight;\n\t\t\t\t\twy += (vx * bone.c + vy * bone.d + bone.worldY) * weight;\n\t\t\t\t}\n\t\t\t\tworldVertices[w] = wx;\n\t\t\t\tworldVertices[w + 1] = wy;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Does not copy id (generated) or name (set on construction). **/\n\tcopyTo(attachment: VertexAttachment) {\n\t\tif (this.bones) {\n\t\t\tattachment.bones = new Array(this.bones.length);\n\t\t\tUtils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length);\n\t\t} else\n\t\t\tattachment.bones = null;\n\n\t\tif (this.vertices) {\n\t\t\tattachment.vertices = Utils.newFloatArray(this.vertices.length);\n\t\t\tUtils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length);\n\t\t} else\n\t\t\tattachment.vertices = null;\n\n\t\tattachment.worldVerticesLength = this.worldVerticesLength;\n\t\tattachment.deformAttachment = this.deformAttachment;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { VertexAttachment, Attachment } from \"./attachments/Attachment\";\nimport { IkConstraint } from \"./IkConstraint\";\nimport { PathConstraint } from \"./PathConstraint\";\nimport { Skeleton } from \"./Skeleton\";\nimport { Slot } from \"./Slot\";\nimport { TransformConstraint } from \"./TransformConstraint\";\nimport { StringSet, Utils, MathUtils, NumberArrayLike } from \"./Utils\";\nimport { Event } from \"./Event\";\n\n/** A simple container for a list of timelines and a name. */\nexport class Animation {\n\t/** The animation's name, which is unique across all animations in the skeleton. */\n\tname: string;\n\ttimelines: Array;\n\ttimelineIds: StringSet;\n\n\t/** The duration of the animation in seconds, which is the highest time of all keys in the timeline. */\n\tduration: number;\n\n\tconstructor(name: string, timelines: Array, duration: number) {\n\t\tif (!name) throw new Error(\"name cannot be null.\");\n\t\tthis.name = name;\n\t\tthis.setTimelines(timelines);\n\t\tthis.duration = duration;\n\t}\n\n\tsetTimelines(timelines: Array) {\n\t\tif (!timelines) throw new Error(\"timelines cannot be null.\");\n\t\tthis.timelines = timelines;\n\t\tthis.timelineIds = new StringSet();\n\t\tfor (var i = 0; i < timelines.length; i++)\n\t\t\tthis.timelineIds.addAll(timelines[i].getPropertyIds());\n\t}\n\n\thasTimeline(ids: string[]): boolean {\n\t\tfor (let i = 0; i < ids.length; i++)\n\t\t\tif (this.timelineIds.contains(ids[i])) return true;\n\t\treturn false;\n\t}\n\n\t/** Applies all the animation's timelines to the specified skeleton.\n\t *\n\t * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.\n\t * @param loop If true, the animation repeats after {@link #getDuration()}.\n\t * @param events May be null to ignore fired events. */\n\tapply(skeleton: Skeleton, lastTime: number, time: number, loop: boolean, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tif (!skeleton) throw new Error(\"skeleton cannot be null.\");\n\n\t\tif (loop && this.duration != 0) {\n\t\t\ttime %= this.duration;\n\t\t\tif (lastTime > 0) lastTime %= this.duration;\n\t\t}\n\n\t\tlet timelines = this.timelines;\n\t\tfor (let i = 0, n = timelines.length; i < n; i++)\n\t\t\ttimelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);\n\t}\n}\n\n/** Controls how a timeline value is mixed with the setup pose value or current pose value when a timeline's `alpha`\n * < 1.\n *\n * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */\nexport enum MixBlend {\n\t/** Transitions from the setup value to the timeline value (the current value is not used). Before the first key, the setup\n\t * value is set. */\n\tsetup,\n\t/** Transitions from the current value to the timeline value. Before the first key, transitions from the current value to\n\t * the setup value. Timelines which perform instant transitions, such as {@link DrawOrderTimeline} or\n\t * {@link AttachmentTimeline}, use the setup value before the first key.\n\t *\n\t * `first` is intended for the first animations applied, not for animations layered on top of those. */\n\tfirst,\n\t/** Transitions from the current value to the timeline value. No change is made before the first key (the current value is\n\t * kept until the first key).\n\t *\n\t * `replace` is intended for animations layered on top of others, not for the first animations applied. */\n\treplace,\n\t/** Transitions from the current value to the current value plus the timeline value. No change is made before the first key\n\t * (the current value is kept until the first key).\n\t *\n\t * `add` is intended for animations layered on top of others, not for the first animations applied. Properties\n\t * keyed by additive animations must be set manually or by another animation before applying the additive animations, else\n\t * the property values will increase continually. */\n\tadd\n}\n\n/** Indicates whether a timeline's `alpha` is mixing out over time toward 0 (the setup or current pose value) or\n * mixing in toward 1 (the timeline's value).\n *\n * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */\nexport enum MixDirection {\n\tmixIn, mixOut\n}\n\nconst Property = {\n\trotate: 0,\n\tx: 1,\n\ty: 2,\n\tscaleX: 3,\n\tscaleY: 4,\n\tshearX: 5,\n\tshearY: 6,\n\n\trgb: 7,\n\talpha: 8,\n\trgb2: 9,\n\n\tattachment: 10,\n\tdeform: 11,\n\n\tevent: 12,\n\tdrawOrder: 13,\n\n\tikConstraint: 14,\n\ttransformConstraint: 15,\n\n\tpathConstraintPosition: 16,\n\tpathConstraintSpacing: 17,\n\tpathConstraintMix: 18\n}\n\n/** The interface for all timelines. */\nexport abstract class Timeline {\n\tpropertyIds: string[];\n\tframes: NumberArrayLike;\n\n\tconstructor(frameCount: number, propertyIds: string[]) {\n\t\tthis.propertyIds = propertyIds;\n\t\tthis.frames = Utils.newFloatArray(frameCount * this.getFrameEntries());\n\t}\n\n\tgetPropertyIds() {\n\t\treturn this.propertyIds;\n\t}\n\n\tgetFrameEntries(): number {\n\t\treturn 1;\n\t}\n\n\tgetFrameCount() {\n\t\treturn this.frames.length / this.getFrameEntries();\n\t}\n\n\tgetDuration(): number {\n\t\treturn this.frames[this.frames.length - this.getFrameEntries()];\n\t}\n\n\tabstract apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void;\n\n\tstatic search1(frames: NumberArrayLike, time: number) {\n\t\tlet n = frames.length;\n\t\tfor (let i = 1; i < n; i++)\n\t\t\tif (frames[i] > time) return i - 1;\n\t\treturn n - 1;\n\t}\n\n\tstatic search(frames: NumberArrayLike, time: number, step: number) {\n\t\tlet n = frames.length;\n\t\tfor (let i = step; i < n; i += step)\n\t\t\tif (frames[i] > time) return i - step;\n\t\treturn n - step;\n\t}\n}\n\nexport interface BoneTimeline {\n\t/** The index of the bone in {@link Skeleton#bones} that will be changed. */\n\tboneIndex: number;\n}\n\nexport interface SlotTimeline {\n\t/** The index of the slot in {@link Skeleton#slots} that will be changed. */\n\tslotIndex: number;\n}\n\n/** The base class for timelines that use interpolation between key frame values. */\nexport abstract class CurveTimeline extends Timeline {\n\tprotected curves: NumberArrayLike; // type, x, y, ...\n\n\tconstructor(frameCount: number, bezierCount: number, propertyIds: string[]) {\n\t\tsuper(frameCount, propertyIds);\n\t\tthis.curves = Utils.newFloatArray(frameCount + bezierCount * 18/*BEZIER_SIZE*/);\n\t\tthis.curves[frameCount - 1] = 1/*STEPPED*/;\n\t}\n\n\t/** Sets the specified key frame to linear interpolation. */\n\tsetLinear(frame: number) {\n\t\tthis.curves[frame] = 0/*LINEAR*/;\n\t}\n\n\t/** Sets the specified key frame to stepped interpolation. */\n\tsetStepped(frame: number) {\n\t\tthis.curves[frame] = 1/*STEPPED*/;\n\t}\n\n\t/** Shrinks the storage for Bezier curves, for use when bezierCount (specified in the constructor) was larger\n\t * than the actual number of Bezier curves. */\n\tshrink(bezierCount: number) {\n\t\tlet size = this.getFrameCount() + bezierCount * 18/*BEZIER_SIZE*/;\n\t\tif (this.curves.length > size) {\n\t\t\tlet newCurves = Utils.newFloatArray(size);\n\t\t\tUtils.arrayCopy(this.curves, 0, newCurves, 0, size);\n\t\t\tthis.curves = newCurves;\n\t\t}\n\t}\n\n\t/** Stores the segments for the specified Bezier curve. For timelines that modify multiple values, there may be more than\n\t * one curve per frame.\n\t * @param bezier The ordinal of this Bezier curve for this timeline, between 0 and bezierCount - 1 (specified\n\t * in the constructor), inclusive.\n\t * @param frame Between 0 and frameCount - 1, inclusive.\n\t * @param value The index of the value for this frame that this curve is used for.\n\t * @param time1 The time for the first key.\n\t * @param value1 The value for the first key.\n\t * @param cx1 The time for the first Bezier handle.\n\t * @param cy1 The value for the first Bezier handle.\n\t * @param cx2 The time of the second Bezier handle.\n\t * @param cy2 The value for the second Bezier handle.\n\t * @param time2 The time for the second key.\n\t * @param value2 The value for the second key. */\n\tsetBezier(bezier: number, frame: number, value: number, time1: number, value1: number, cx1: number, cy1: number, cx2: number,\n\t\tcy2: number, time2: number, value2: number) {\n\t\tlet curves = this.curves;\n\t\tlet i = this.getFrameCount() + bezier * 18/*BEZIER_SIZE*/;\n\t\tif (value == 0) curves[frame] = 2/*BEZIER*/ + i;\n\t\tlet tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03;\n\t\tlet dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 0.006;\n\t\tlet ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;\n\t\tlet dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = (cy1 - value1) * 0.3 + tmpy + dddy * 0.16666667;\n\t\tlet x = time1 + dx, y = value1 + dy;\n\t\tfor (let n = i + 18/*BEZIER_SIZE*/; i < n; i += 2) {\n\t\t\tcurves[i] = x;\n\t\t\tcurves[i + 1] = y;\n\t\t\tdx += ddx;\n\t\t\tdy += ddy;\n\t\t\tddx += dddx;\n\t\t\tddy += dddy;\n\t\t\tx += dx;\n\t\t\ty += dy;\n\t\t}\n\t}\n\n\t/** Returns the Bezier interpolated value for the specified time.\n\t * @param frameIndex The index into {@link #getFrames()} for the values of the frame before time.\n\t * @param valueOffset The offset from frameIndex to the value this curve is used for.\n\t * @param i The index of the Bezier segments. See {@link #getCurveType(int)}. */\n\tgetBezierValue(time: number, frameIndex: number, valueOffset: number, i: number) {\n\t\tlet curves = this.curves;\n\t\tif (curves[i] > time) {\n\t\t\tlet x = this.frames[frameIndex], y = this.frames[frameIndex + valueOffset];\n\t\t\treturn y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);\n\t\t}\n\t\tlet n = i + 18/*BEZIER_SIZE*/;\n\t\tfor (i += 2; i < n; i += 2) {\n\t\t\tif (curves[i] >= time) {\n\t\t\t\tlet x = curves[i - 2], y = curves[i - 1];\n\t\t\t\treturn y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);\n\t\t\t}\n\t\t}\n\t\tframeIndex += this.getFrameEntries();\n\t\tlet x = curves[n - 2], y = curves[n - 1];\n\t\treturn y + (time - x) / (this.frames[frameIndex] - x) * (this.frames[frameIndex + valueOffset] - y);\n\t}\n}\n\nexport abstract class CurveTimeline1 extends CurveTimeline {\n\tconstructor(frameCount: number, bezierCount: number, propertyId: string) {\n\t\tsuper(frameCount, bezierCount, [propertyId]);\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 2/*ENTRIES*/;\n\t}\n\n\t/** Sets the time and value for the specified frame.\n\t * @param frame Between 0 and frameCount, inclusive.\n\t * @param time The frame time in seconds. */\n\tsetFrame(frame: number, time: number, value: number) {\n\t\tframe <<= 1;\n\t\tthis.frames[frame] = time;\n\t\tthis.frames[frame + 1/*VALUE*/] = value;\n\t}\n\n\t/** Returns the interpolated value for the specified time. */\n\tgetCurveValue(time: number) {\n\t\tlet frames = this.frames;\n\t\tlet i = frames.length - 2;\n\t\tfor (let ii = 2; ii <= i; ii += 2) {\n\t\t\tif (frames[ii] > time) {\n\t\t\t\ti = ii - 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tlet curveType = this.curves[i >> 1];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i], value = frames[i + 1/*VALUE*/];\n\t\t\t\treturn value + (time - before) / (frames[i + 2/*ENTRIES*/] - before) * (frames[i + 2/*ENTRIES*/ + 1/*VALUE*/] - value);\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\treturn frames[i + 1/*VALUE*/];\n\t\t}\n\t\treturn this.getBezierValue(time, i, 1/*VALUE*/, curveType - 2/*BEZIER*/);\n\t}\n}\n\n/** The base class for a {@link CurveTimeline} which sets two properties. */\nexport abstract class CurveTimeline2 extends CurveTimeline {\n\t/** @param bezierCount The maximum number of Bezier curves. See {@link #shrink(int)}.\n\t * @param propertyIds Unique identifiers for the properties the timeline modifies. */\n\tconstructor(frameCount: number, bezierCount: number, propertyId1: string, propertyId2: string) {\n\t\tsuper(frameCount, bezierCount, [propertyId1, propertyId2]);\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 3/*ENTRIES*/;\n\t}\n\n\t/** Sets the time and values for the specified frame.\n\t * @param frame Between 0 and frameCount, inclusive.\n\t * @param time The frame time in seconds. */\n\tsetFrame(frame: number, time: number, value1: number, value2: number) {\n\t\tframe *= 3/*ENTRIES*/;\n\t\tthis.frames[frame] = time;\n\t\tthis.frames[frame + 1/*VALUE1*/] = value1;\n\t\tthis.frames[frame + 2/*VALUE2*/] = value2;\n\t}\n}\n\n/** Changes a bone's local {@link Bone#rotation}. */\nexport class RotateTimeline extends CurveTimeline1 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.rotate + \"|\" + boneIndex);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.rotation = bone.data.rotation;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.rotation += (bone.data.rotation - bone.rotation) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet r = this.getCurveValue(time);\n\t\tswitch (blend) {\n\t\t\tcase MixBlend.setup:\n\t\t\t\tbone.rotation = bone.data.rotation + r * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.first:\n\t\t\tcase MixBlend.replace:\n\t\t\t\tr += bone.data.rotation - bone.rotation;\n\t\t\tcase MixBlend.add:\n\t\t\t\tbone.rotation += r * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#x} and {@link Bone#y}. */\nexport class TranslateTimeline extends CurveTimeline2 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount,\n\t\t\tProperty.x + \"|\" + boneIndex,\n\t\t\tProperty.y + \"|\" + boneIndex,\n\t\t);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.x = bone.data.x;\n\t\t\t\t\tbone.y = bone.data.y;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.x += (bone.data.x - bone.x) * alpha;\n\t\t\t\t\tbone.y += (bone.data.y - bone.y) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet x = 0, y = 0;\n\t\tlet i = Timeline.search(frames, time, 3/*ENTRIES*/);\n\t\tlet curveType = this.curves[i / 3/*ENTRIES*/];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\tx = frames[i + 1/*VALUE1*/];\n\t\t\t\ty = frames[i + 2/*VALUE2*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 3/*ENTRIES*/] - before);\n\t\t\t\tx += (frames[i + 3/*ENTRIES*/ + 1/*VALUE1*/] - x) * t;\n\t\t\t\ty += (frames[i + 3/*ENTRIES*/ + 2/*VALUE2*/] - y) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\tx = frames[i + 1/*VALUE1*/];\n\t\t\t\ty = frames[i + 2/*VALUE2*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tx = this.getBezierValue(time, i, 1/*VALUE1*/, curveType - 2/*BEZIER*/);\n\t\t\t\ty = this.getBezierValue(time, i, 2/*VALUE2*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t}\n\n\t\tswitch (blend) {\n\t\t\tcase MixBlend.setup:\n\t\t\t\tbone.x = bone.data.x + x * alpha;\n\t\t\t\tbone.y = bone.data.y + y * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.first:\n\t\t\tcase MixBlend.replace:\n\t\t\t\tbone.x += (bone.data.x + x - bone.x) * alpha;\n\t\t\t\tbone.y += (bone.data.y + y - bone.y) * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.add:\n\t\t\t\tbone.x += x * alpha;\n\t\t\t\tbone.y += y * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#x}. */\nexport class TranslateXTimeline extends CurveTimeline1 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.x + \"|\" + boneIndex);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.x = bone.data.x;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.x += (bone.data.x - bone.x) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet x = this.getCurveValue(time);\n\t\tswitch (blend) {\n\t\t\tcase MixBlend.setup:\n\t\t\t\tbone.x = bone.data.x + x * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.first:\n\t\t\tcase MixBlend.replace:\n\t\t\t\tbone.x += (bone.data.x + x - bone.x) * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.add:\n\t\t\t\tbone.x += x * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#x}. */\nexport class TranslateYTimeline extends CurveTimeline1 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.y + \"|\" + boneIndex);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.y = bone.data.y;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.y += (bone.data.y - bone.y) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet y = this.getCurveValue(time);\n\t\tswitch (blend) {\n\t\t\tcase MixBlend.setup:\n\t\t\t\tbone.y = bone.data.y + y * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.first:\n\t\t\tcase MixBlend.replace:\n\t\t\t\tbone.y += (bone.data.y + y - bone.y) * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.add:\n\t\t\t\tbone.y += y * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */\nexport class ScaleTimeline extends CurveTimeline2 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount,\n\t\t\tProperty.scaleX + \"|\" + boneIndex,\n\t\t\tProperty.scaleY + \"|\" + boneIndex\n\t\t);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.scaleX = bone.data.scaleX;\n\t\t\t\t\tbone.scaleY = bone.data.scaleY;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;\n\t\t\t\t\tbone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet x, y;\n\t\tlet i = Timeline.search(frames, time, 3/*ENTRIES*/);\n\t\tlet curveType = this.curves[i / 3/*ENTRIES*/];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\tx = frames[i + 1/*VALUE1*/];\n\t\t\t\ty = frames[i + 2/*VALUE2*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 3/*ENTRIES*/] - before);\n\t\t\t\tx += (frames[i + 3/*ENTRIES*/ + 1/*VALUE1*/] - x) * t;\n\t\t\t\ty += (frames[i + 3/*ENTRIES*/ + 2/*VALUE2*/] - y) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\tx = frames[i + 1/*VALUE1*/];\n\t\t\t\ty = frames[i + 2/*VALUE2*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tx = this.getBezierValue(time, i, 1/*VALUE1*/, curveType - 2/*BEZIER*/);\n\t\t\t\ty = this.getBezierValue(time, i, 2/*VALUE2*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t}\n\t\tx *= bone.data.scaleX;\n\t\ty *= bone.data.scaleY;\n\n\t\tif (alpha == 1) {\n\t\t\tif (blend == MixBlend.add) {\n\t\t\t\tbone.scaleX += x - bone.data.scaleX;\n\t\t\t\tbone.scaleY += y - bone.data.scaleY;\n\t\t\t} else {\n\t\t\t\tbone.scaleX = x;\n\t\t\t\tbone.scaleY = y;\n\t\t\t}\n\t\t} else {\n\t\t\tlet bx = 0, by = 0;\n\t\t\tif (direction == MixDirection.mixOut) {\n\t\t\t\tswitch (blend) {\n\t\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\t\tbx = bone.data.scaleX;\n\t\t\t\t\t\tby = bone.data.scaleY;\n\t\t\t\t\t\tbone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n\t\t\t\t\t\tbone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcase MixBlend.replace:\n\t\t\t\t\t\tbx = bone.scaleX;\n\t\t\t\t\t\tby = bone.scaleY;\n\t\t\t\t\t\tbone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n\t\t\t\t\t\tbone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.add:\n\t\t\t\t\t\tbx = bone.scaleX;\n\t\t\t\t\t\tby = bone.scaleY;\n\t\t\t\t\t\tbone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha;\n\t\t\t\t\t\tbone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (blend) {\n\t\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\t\tbx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);\n\t\t\t\t\t\tby = Math.abs(bone.data.scaleY) * MathUtils.signum(y);\n\t\t\t\t\t\tbone.scaleX = bx + (x - bx) * alpha;\n\t\t\t\t\t\tbone.scaleY = by + (y - by) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcase MixBlend.replace:\n\t\t\t\t\t\tbx = Math.abs(bone.scaleX) * MathUtils.signum(x);\n\t\t\t\t\t\tby = Math.abs(bone.scaleY) * MathUtils.signum(y);\n\t\t\t\t\t\tbone.scaleX = bx + (x - bx) * alpha;\n\t\t\t\t\t\tbone.scaleY = by + (y - by) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.add:\n\t\t\t\t\t\tbx = MathUtils.signum(x);\n\t\t\t\t\t\tby = MathUtils.signum(y);\n\t\t\t\t\t\tbone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha;\n\t\t\t\t\t\tbone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */\nexport class ScaleXTimeline extends CurveTimeline1 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.scaleX + \"|\" + boneIndex);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.scaleX = bone.data.scaleX;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet x = this.getCurveValue(time) * bone.data.scaleX;\n\t\tif (alpha == 1) {\n\t\t\tif (blend == MixBlend.add)\n\t\t\t\tbone.scaleX += x - bone.data.scaleX;\n\t\t\telse\n\t\t\t\tbone.scaleX = x;\n\t\t} else {\n\t\t\t// Mixing out uses sign of setup or current pose, else use sign of key.\n\t\t\tlet bx = 0;\n\t\t\tif (direction == MixDirection.mixOut) {\n\t\t\t\tswitch (blend) {\n\t\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\t\tbx = bone.data.scaleX;\n\t\t\t\t\t\tbone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcase MixBlend.replace:\n\t\t\t\t\t\tbx = bone.scaleX;\n\t\t\t\t\t\tbone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.add:\n\t\t\t\t\t\tbx = bone.scaleX;\n\t\t\t\t\t\tbone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (blend) {\n\t\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\t\tbx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);\n\t\t\t\t\t\tbone.scaleX = bx + (x - bx) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcase MixBlend.replace:\n\t\t\t\t\t\tbx = Math.abs(bone.scaleX) * MathUtils.signum(x);\n\t\t\t\t\t\tbone.scaleX = bx + (x - bx) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.add:\n\t\t\t\t\t\tbx = MathUtils.signum(x);\n\t\t\t\t\t\tbone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */\nexport class ScaleYTimeline extends CurveTimeline1 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.scaleY + \"|\" + boneIndex);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.scaleY = bone.data.scaleY;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet y = this.getCurveValue(time) * bone.data.scaleY;\n\t\tif (alpha == 1) {\n\t\t\tif (blend == MixBlend.add)\n\t\t\t\tbone.scaleY += y - bone.data.scaleY;\n\t\t\telse\n\t\t\t\tbone.scaleY = y;\n\t\t} else {\n\t\t\t// Mixing out uses sign of setup or current pose, else use sign of key.\n\t\t\tlet by = 0;\n\t\t\tif (direction == MixDirection.mixOut) {\n\t\t\t\tswitch (blend) {\n\t\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\t\tby = bone.data.scaleY;\n\t\t\t\t\t\tbone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcase MixBlend.replace:\n\t\t\t\t\t\tby = bone.scaleY;\n\t\t\t\t\t\tbone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.add:\n\t\t\t\t\t\tby = bone.scaleY;\n\t\t\t\t\t\tbone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (blend) {\n\t\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\t\tby = Math.abs(bone.data.scaleY) * MathUtils.signum(y);\n\t\t\t\t\t\tbone.scaleY = by + (y - by) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcase MixBlend.replace:\n\t\t\t\t\t\tby = Math.abs(bone.scaleY) * MathUtils.signum(y);\n\t\t\t\t\t\tbone.scaleY = by + (y - by) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.add:\n\t\t\t\t\t\tby = MathUtils.signum(y);\n\t\t\t\t\t\tbone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */\nexport class ShearTimeline extends CurveTimeline2 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount,\n\t\t\tProperty.shearX + \"|\" + boneIndex,\n\t\t\tProperty.shearY + \"|\" + boneIndex\n\t\t);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.shearX = bone.data.shearX;\n\t\t\t\t\tbone.shearY = bone.data.shearY;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.shearX += (bone.data.shearX - bone.shearX) * alpha;\n\t\t\t\t\tbone.shearY += (bone.data.shearY - bone.shearY) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet x = 0, y = 0;\n\t\tlet i = Timeline.search(frames, time, 3/*ENTRIES*/);\n\t\tlet curveType = this.curves[i / 3/*ENTRIES*/];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\tx = frames[i + 1/*VALUE1*/];\n\t\t\t\ty = frames[i + 2/*VALUE2*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 3/*ENTRIES*/] - before);\n\t\t\t\tx += (frames[i + 3/*ENTRIES*/ + 1/*VALUE1*/] - x) * t;\n\t\t\t\ty += (frames[i + 3/*ENTRIES*/ + 2/*VALUE2*/] - y) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\tx = frames[i + 1/*VALUE1*/];\n\t\t\t\ty = frames[i + 2/*VALUE2*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tx = this.getBezierValue(time, i, 1/*VALUE1*/, curveType - 2/*BEZIER*/);\n\t\t\t\ty = this.getBezierValue(time, i, 2/*VALUE2*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t}\n\n\t\tswitch (blend) {\n\t\t\tcase MixBlend.setup:\n\t\t\t\tbone.shearX = bone.data.shearX + x * alpha;\n\t\t\t\tbone.shearY = bone.data.shearY + y * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.first:\n\t\t\tcase MixBlend.replace:\n\t\t\t\tbone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;\n\t\t\t\tbone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.add:\n\t\t\t\tbone.shearX += x * alpha;\n\t\t\t\tbone.shearY += y * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */\nexport class ShearXTimeline extends CurveTimeline1 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.shearX + \"|\" + boneIndex);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.shearX = bone.data.shearX;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.shearX += (bone.data.shearX - bone.shearX) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet x = this.getCurveValue(time);\n\t\tswitch (blend) {\n\t\t\tcase MixBlend.setup:\n\t\t\t\tbone.shearX = bone.data.shearX + x * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.first:\n\t\t\tcase MixBlend.replace:\n\t\t\t\tbone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.add:\n\t\t\t\tbone.shearX += x * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */\nexport class ShearYTimeline extends CurveTimeline1 implements BoneTimeline {\n\tboneIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, boneIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.shearY + \"|\" + boneIndex);\n\t\tthis.boneIndex = boneIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet bone = skeleton.bones[this.boneIndex];\n\t\tif (!bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.shearY = bone.data.shearY;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tbone.shearY += (bone.data.shearY - bone.shearY) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet y = this.getCurveValue(time);\n\t\tswitch (blend) {\n\t\t\tcase MixBlend.setup:\n\t\t\t\tbone.shearY = bone.data.shearY + y * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.first:\n\t\t\tcase MixBlend.replace:\n\t\t\t\tbone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;\n\t\t\t\tbreak;\n\t\t\tcase MixBlend.add:\n\t\t\t\tbone.shearY += y * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a slot's {@link Slot#color}. */\nexport class RGBATimeline extends CurveTimeline implements SlotTimeline {\n\tslotIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, slotIndex: number) {\n\t\tsuper(frameCount, bezierCount, [\n\t\t\tProperty.rgb + \"|\" + slotIndex,\n\t\t\tProperty.alpha + \"|\" + slotIndex\n\t\t]);\n\t\tthis.slotIndex = slotIndex;\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 5/*ENTRIES*/;\n\t}\n\n\t/** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */\n\tsetFrame(frame: number, time: number, r: number, g: number, b: number, a: number) {\n\t\tframe *= 5/*ENTRIES*/;\n\t\tthis.frames[frame] = time;\n\t\tthis.frames[frame + 1/*R*/] = r;\n\t\tthis.frames[frame + 2/*G*/] = g;\n\t\tthis.frames[frame + 3/*B*/] = b;\n\t\tthis.frames[frame + 4/*A*/] = a;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet slot = skeleton.slots[this.slotIndex];\n\t\tif (!slot.bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tlet color = slot.color;\n\t\tif (time < frames[0]) {\n\t\t\tlet setup = slot.data.color;\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tcolor.setFromColor(setup);\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcolor.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha,\n\t\t\t\t\t\t(setup.a - color.a) * alpha);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet r = 0, g = 0, b = 0, a = 0;\n\t\tlet i = Timeline.search(frames, time, 5/*ENTRIES*/);\n\t\tlet curveType = this.curves[i / 5/*ENTRIES*/];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\tr = frames[i + 1/*R*/];\n\t\t\t\tg = frames[i + 2/*G*/];\n\t\t\t\tb = frames[i + 3/*B*/];\n\t\t\t\ta = frames[i + 4/*A*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 5/*ENTRIES*/] - before);\n\t\t\t\tr += (frames[i + 5/*ENTRIES*/ + 1/*R*/] - r) * t;\n\t\t\t\tg += (frames[i + 5/*ENTRIES*/ + 2/*G*/] - g) * t;\n\t\t\t\tb += (frames[i + 5/*ENTRIES*/ + 3/*B*/] - b) * t;\n\t\t\t\ta += (frames[i + 5/*ENTRIES*/ + 4/*A*/] - a) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\tr = frames[i + 1/*R*/];\n\t\t\t\tg = frames[i + 2/*G*/];\n\t\t\t\tb = frames[i + 3/*B*/];\n\t\t\t\ta = frames[i + 4/*A*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tr = this.getBezierValue(time, i, 1/*R*/, curveType - 2/*BEZIER*/);\n\t\t\t\tg = this.getBezierValue(time, i, 2/*G*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t\t\tb = this.getBezierValue(time, i, 3/*B*/, curveType + 18/*BEZIER_SIZE*/ * 2 - 2/*BEZIER*/);\n\t\t\t\ta = this.getBezierValue(time, i, 4/*A*/, curveType + 18/*BEZIER_SIZE*/ * 3 - 2/*BEZIER*/);\n\t\t}\n\t\tif (alpha == 1)\n\t\t\tcolor.set(r, g, b, a);\n\t\telse {\n\t\t\tif (blend == MixBlend.setup) color.setFromColor(slot.data.color);\n\t\t\tcolor.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);\n\t\t}\n\t}\n}\n\n/** Changes a slot's {@link Slot#color}. */\nexport class RGBTimeline extends CurveTimeline implements SlotTimeline {\n\tslotIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, slotIndex: number) {\n\t\tsuper(frameCount, bezierCount, [\n\t\t\tProperty.rgb + \"|\" + slotIndex\n\t\t]);\n\t\tthis.slotIndex = slotIndex;\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 4/*ENTRIES*/;\n\t}\n\n\t/** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */\n\tsetFrame(frame: number, time: number, r: number, g: number, b: number) {\n\t\tframe <<= 2;\n\t\tthis.frames[frame] = time;\n\t\tthis.frames[frame + 1/*R*/] = r;\n\t\tthis.frames[frame + 2/*G*/] = g;\n\t\tthis.frames[frame + 3/*B*/] = b;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet slot = skeleton.slots[this.slotIndex];\n\t\tif (!slot.bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tlet color = slot.color;\n\t\tif (time < frames[0]) {\n\t\t\tlet setup = slot.data.color;\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tcolor.r = setup.r;\n\t\t\t\t\tcolor.g = setup.g;\n\t\t\t\t\tcolor.b = setup.b;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcolor.r += (setup.r - color.r) * alpha;\n\t\t\t\t\tcolor.g += (setup.g - color.g) * alpha;\n\t\t\t\t\tcolor.b += (setup.b - color.b) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet r = 0, g = 0, b = 0;\n\t\tlet i = Timeline.search(frames, time, 4/*ENTRIES*/);\n\t\tlet curveType = this.curves[i >> 2];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\tr = frames[i + 1/*R*/];\n\t\t\t\tg = frames[i + 2/*G*/];\n\t\t\t\tb = frames[i + 3/*B*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 4/*ENTRIES*/] - before);\n\t\t\t\tr += (frames[i + 4/*ENTRIES*/ + 1/*R*/] - r) * t;\n\t\t\t\tg += (frames[i + 4/*ENTRIES*/ + 2/*G*/] - g) * t;\n\t\t\t\tb += (frames[i + 4/*ENTRIES*/ + 3/*B*/] - b) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\tr = frames[i + 1/*R*/];\n\t\t\t\tg = frames[i + 2/*G*/];\n\t\t\t\tb = frames[i + 3/*B*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tr = this.getBezierValue(time, i, 1/*R*/, curveType - 2/*BEZIER*/);\n\t\t\t\tg = this.getBezierValue(time, i, 2/*G*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t\t\tb = this.getBezierValue(time, i, 3/*B*/, curveType + 18/*BEZIER_SIZE*/ * 2 - 2/*BEZIER*/);\n\t\t}\n\t\tif (alpha == 1) {\n\t\t\tcolor.r = r;\n\t\t\tcolor.g = g;\n\t\t\tcolor.b = b;\n\t\t} else {\n\t\t\tif (blend == MixBlend.setup) {\n\t\t\t\tlet setup = slot.data.color;\n\t\t\t\tcolor.r = setup.r;\n\t\t\t\tcolor.g = setup.g;\n\t\t\t\tcolor.b = setup.b;\n\t\t\t}\n\t\t\tcolor.r += (r - color.r) * alpha;\n\t\t\tcolor.g += (g - color.g) * alpha;\n\t\t\tcolor.b += (b - color.b) * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */\nexport class AlphaTimeline extends CurveTimeline1 implements SlotTimeline {\n\tslotIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, slotIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.alpha + \"|\" + slotIndex);\n\t\tthis.slotIndex = slotIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet slot = skeleton.slots[this.slotIndex];\n\t\tif (!slot.bone.active) return;\n\n\t\tlet color = slot.color;\n\t\tif (time < this.frames[0]) { // Time is before first frame.\n\t\t\tlet setup = slot.data.color;\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tcolor.a = setup.a;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcolor.a += (setup.a - color.a) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet a = this.getCurveValue(time);\n\t\tif (alpha == 1)\n\t\t\tcolor.a = a;\n\t\telse {\n\t\t\tif (blend == MixBlend.setup) color.a = slot.data.color.a;\n\t\t\tcolor.a += (a - color.a) * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */\nexport class RGBA2Timeline extends CurveTimeline implements SlotTimeline {\n\tslotIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, slotIndex: number) {\n\t\tsuper(frameCount, bezierCount, [\n\t\t\tProperty.rgb + \"|\" + slotIndex,\n\t\t\tProperty.alpha + \"|\" + slotIndex,\n\t\t\tProperty.rgb2 + \"|\" + slotIndex\n\t\t]);\n\t\tthis.slotIndex = slotIndex;\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 8/*ENTRIES*/;\n\t}\n\n\t/** Sets the time in seconds, light, and dark colors for the specified key frame. */\n\tsetFrame(frame: number, time: number, r: number, g: number, b: number, a: number, r2: number, g2: number, b2: number) {\n\t\tframe <<= 3;\n\t\tthis.frames[frame] = time;\n\t\tthis.frames[frame + 1/*R*/] = r;\n\t\tthis.frames[frame + 2/*G*/] = g;\n\t\tthis.frames[frame + 3/*B*/] = b;\n\t\tthis.frames[frame + 4/*A*/] = a;\n\t\tthis.frames[frame + 5/*R2*/] = r2;\n\t\tthis.frames[frame + 6/*G2*/] = g2;\n\t\tthis.frames[frame + 7/*B2*/] = b2;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet slot = skeleton.slots[this.slotIndex];\n\t\tif (!slot.bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tlet light = slot.color, dark = slot.darkColor;\n\t\tif (time < frames[0]) {\n\t\t\tlet setupLight = slot.data.color, setupDark = slot.data.darkColor;\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tlight.setFromColor(setupLight);\n\t\t\t\t\tdark.r = setupDark.r;\n\t\t\t\t\tdark.g = setupDark.g;\n\t\t\t\t\tdark.b = setupDark.b;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tlight.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha,\n\t\t\t\t\t\t(setupLight.a - light.a) * alpha);\n\t\t\t\t\tdark.r += (setupDark.r - dark.r) * alpha;\n\t\t\t\t\tdark.g += (setupDark.g - dark.g) * alpha;\n\t\t\t\t\tdark.b += (setupDark.b - dark.b) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;\n\t\tlet i = Timeline.search(frames, time, 8/*ENTRIES*/);\n\t\tlet curveType = this.curves[i >> 3];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\tr = frames[i + 1/*R*/];\n\t\t\t\tg = frames[i + 2/*G*/];\n\t\t\t\tb = frames[i + 3/*B*/];\n\t\t\t\ta = frames[i + 4/*A*/];\n\t\t\t\tr2 = frames[i + 5/*R2*/];\n\t\t\t\tg2 = frames[i + 6/*G2*/];\n\t\t\t\tb2 = frames[i + 7/*B2*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 8/*ENTRIES*/] - before);\n\t\t\t\tr += (frames[i + 8/*ENTRIES*/ + 1/*R*/] - r) * t;\n\t\t\t\tg += (frames[i + 8/*ENTRIES*/ + 2/*G*/] - g) * t;\n\t\t\t\tb += (frames[i + 8/*ENTRIES*/ + 3/*B*/] - b) * t;\n\t\t\t\ta += (frames[i + 8/*ENTRIES*/ + 4/*A*/] - a) * t;\n\t\t\t\tr2 += (frames[i + 8/*ENTRIES*/ + 5/*R2*/] - r2) * t;\n\t\t\t\tg2 += (frames[i + 8/*ENTRIES*/ + 6/*G2*/] - g2) * t;\n\t\t\t\tb2 += (frames[i + 8/*ENTRIES*/ + 7/*B2*/] - b2) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\tr = frames[i + 1/*R*/];\n\t\t\t\tg = frames[i + 2/*G*/];\n\t\t\t\tb = frames[i + 3/*B*/];\n\t\t\t\ta = frames[i + 4/*A*/];\n\t\t\t\tr2 = frames[i + 5/*R2*/];\n\t\t\t\tg2 = frames[i + 6/*G2*/];\n\t\t\t\tb2 = frames[i + 7/*B2*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tr = this.getBezierValue(time, i, 1/*R*/, curveType - 2/*BEZIER*/);\n\t\t\t\tg = this.getBezierValue(time, i, 2/*G*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t\t\tb = this.getBezierValue(time, i, 3/*B*/, curveType + 18/*BEZIER_SIZE*/ * 2 - 2/*BEZIER*/);\n\t\t\t\ta = this.getBezierValue(time, i, 4/*A*/, curveType + 18/*BEZIER_SIZE*/ * 3 - 2/*BEZIER*/);\n\t\t\t\tr2 = this.getBezierValue(time, i, 5/*R2*/, curveType + 18/*BEZIER_SIZE*/ * 4 - 2/*BEZIER*/);\n\t\t\t\tg2 = this.getBezierValue(time, i, 6/*G2*/, curveType + 18/*BEZIER_SIZE*/ * 5 - 2/*BEZIER*/);\n\t\t\t\tb2 = this.getBezierValue(time, i, 7/*B2*/, curveType + 18/*BEZIER_SIZE*/ * 6 - 2/*BEZIER*/);\n\t\t}\n\n\t\tif (alpha == 1) {\n\t\t\tlight.set(r, g, b, a);\n\t\t\tdark.r = r2;\n\t\t\tdark.g = g2;\n\t\t\tdark.b = b2;\n\t\t} else {\n\t\t\tif (blend == MixBlend.setup) {\n\t\t\t\tlight.setFromColor(slot.data.color);\n\t\t\t\tlet setupDark = slot.data.darkColor;\n\t\t\t\tdark.r = setupDark.r;\n\t\t\t\tdark.g = setupDark.g;\n\t\t\t\tdark.b = setupDark.b;\n\t\t\t}\n\t\t\tlight.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);\n\t\t\tdark.r += (r2 - dark.r) * alpha;\n\t\t\tdark.g += (g2 - dark.g) * alpha;\n\t\t\tdark.b += (b2 - dark.b) * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */\nexport class RGB2Timeline extends CurveTimeline implements SlotTimeline {\n\tslotIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, slotIndex: number) {\n\t\tsuper(frameCount, bezierCount, [\n\t\t\tProperty.rgb + \"|\" + slotIndex,\n\t\t\tProperty.rgb2 + \"|\" + slotIndex\n\t\t]);\n\t\tthis.slotIndex = slotIndex;\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 7/*ENTRIES*/;\n\t}\n\n\t/** Sets the time in seconds, light, and dark colors for the specified key frame. */\n\tsetFrame(frame: number, time: number, r: number, g: number, b: number, r2: number, g2: number, b2: number) {\n\t\tframe *= 7/*ENTRIES*/;\n\t\tthis.frames[frame] = time;\n\t\tthis.frames[frame + 1/*R*/] = r;\n\t\tthis.frames[frame + 2/*G*/] = g;\n\t\tthis.frames[frame + 3/*B*/] = b;\n\t\tthis.frames[frame + 4/*R2*/] = r2;\n\t\tthis.frames[frame + 5/*G2*/] = g2;\n\t\tthis.frames[frame + 6/*B2*/] = b2;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet slot = skeleton.slots[this.slotIndex];\n\t\tif (!slot.bone.active) return;\n\n\t\tlet frames = this.frames;\n\t\tlet light = slot.color, dark = slot.darkColor;\n\t\tif (time < frames[0]) {\n\t\t\tlet setupLight = slot.data.color, setupDark = slot.data.darkColor;\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tlight.r = setupLight.r;\n\t\t\t\t\tlight.g = setupLight.g;\n\t\t\t\t\tlight.b = setupLight.b;\n\t\t\t\t\tdark.r = setupDark.r;\n\t\t\t\t\tdark.g = setupDark.g;\n\t\t\t\t\tdark.b = setupDark.b;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tlight.r += (setupLight.r - light.r) * alpha;\n\t\t\t\t\tlight.g += (setupLight.g - light.g) * alpha;\n\t\t\t\t\tlight.b += (setupLight.b - light.b) * alpha;\n\t\t\t\t\tdark.r += (setupDark.r - dark.r) * alpha;\n\t\t\t\t\tdark.g += (setupDark.g - dark.g) * alpha;\n\t\t\t\t\tdark.b += (setupDark.b - dark.b) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;\n\t\tlet i = Timeline.search(frames, time, 7/*ENTRIES*/);\n\t\tlet curveType = this.curves[i / 7/*ENTRIES*/];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\tr = frames[i + 1/*R*/];\n\t\t\t\tg = frames[i + 2/*G*/];\n\t\t\t\tb = frames[i + 3/*B*/];\n\t\t\t\tr2 = frames[i + 4/*R2*/];\n\t\t\t\tg2 = frames[i + 5/*G2*/];\n\t\t\t\tb2 = frames[i + 6/*B2*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 7/*ENTRIES*/] - before);\n\t\t\t\tr += (frames[i + 7/*ENTRIES*/ + 1/*R*/] - r) * t;\n\t\t\t\tg += (frames[i + 7/*ENTRIES*/ + 2/*G*/] - g) * t;\n\t\t\t\tb += (frames[i + 7/*ENTRIES*/ + 3/*B*/] - b) * t;\n\t\t\t\tr2 += (frames[i + 7/*ENTRIES*/ + 4/*R2*/] - r2) * t;\n\t\t\t\tg2 += (frames[i + 7/*ENTRIES*/ + 5/*G2*/] - g2) * t;\n\t\t\t\tb2 += (frames[i + 7/*ENTRIES*/ + 6/*B2*/] - b2) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\tr = frames[i + 1/*R*/];\n\t\t\t\tg = frames[i + 2/*G*/];\n\t\t\t\tb = frames[i + 3/*B*/];\n\t\t\t\tr2 = frames[i + 4/*R2*/];\n\t\t\t\tg2 = frames[i + 5/*G2*/];\n\t\t\t\tb2 = frames[i + 6/*B2*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tr = this.getBezierValue(time, i, 1/*R*/, curveType - 2/*BEZIER*/);\n\t\t\t\tg = this.getBezierValue(time, i, 2/*G*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t\t\tb = this.getBezierValue(time, i, 3/*B*/, curveType + 18/*BEZIER_SIZE*/ * 2 - 2/*BEZIER*/);\n\t\t\t\tr2 = this.getBezierValue(time, i, 4/*R2*/, curveType + 18/*BEZIER_SIZE*/ * 3 - 2/*BEZIER*/);\n\t\t\t\tg2 = this.getBezierValue(time, i, 5/*G2*/, curveType + 18/*BEZIER_SIZE*/ * 4 - 2/*BEZIER*/);\n\t\t\t\tb2 = this.getBezierValue(time, i, 6/*B2*/, curveType + 18/*BEZIER_SIZE*/ * 5 - 2/*BEZIER*/);\n\t\t}\n\n\t\tif (alpha == 1) {\n\t\t\tlight.r = r;\n\t\t\tlight.g = g;\n\t\t\tlight.b = b;\n\t\t\tdark.r = r2;\n\t\t\tdark.g = g2;\n\t\t\tdark.b = b2;\n\t\t} else {\n\t\t\tif (blend == MixBlend.setup) {\n\t\t\t\tlet setupLight = slot.data.color, setupDark = slot.data.darkColor;\n\t\t\t\tlight.r = setupLight.r;\n\t\t\t\tlight.g = setupLight.g;\n\t\t\t\tlight.b = setupLight.b;\n\t\t\t\tdark.r = setupDark.r;\n\t\t\t\tdark.g = setupDark.g;\n\t\t\t\tdark.b = setupDark.b;\n\t\t\t}\n\t\t\tlight.r += (r - light.r) * alpha;\n\t\t\tlight.g += (g - light.g) * alpha;\n\t\t\tlight.b += (b - light.b) * alpha;\n\t\t\tdark.r += (r2 - dark.r) * alpha;\n\t\t\tdark.g += (g2 - dark.g) * alpha;\n\t\t\tdark.b += (b2 - dark.b) * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a slot's {@link Slot#attachment}. */\nexport class AttachmentTimeline extends Timeline implements SlotTimeline {\n\tslotIndex = 0;\n\n\t/** The attachment name for each key frame. May contain null values to clear the attachment. */\n\tattachmentNames: Array;\n\n\tconstructor(frameCount: number, slotIndex: number) {\n\t\tsuper(frameCount, [\n\t\t\tProperty.attachment + \"|\" + slotIndex\n\t\t]);\n\t\tthis.slotIndex = slotIndex;\n\t\tthis.attachmentNames = new Array(frameCount);\n\t}\n\n\tgetFrameCount() {\n\t\treturn this.frames.length;\n\t}\n\n\t/** Sets the time in seconds and the attachment name for the specified key frame. */\n\tsetFrame(frame: number, time: number, attachmentName: string) {\n\t\tthis.frames[frame] = time;\n\t\tthis.attachmentNames[frame] = attachmentName;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet slot = skeleton.slots[this.slotIndex];\n\t\tif (!slot.bone.active) return;\n\n\t\tif (direction == MixDirection.mixOut) {\n\t\t\tif (blend == MixBlend.setup) this.setAttachment(skeleton, slot, slot.data.attachmentName);\n\t\t\treturn;\n\t\t}\n\n\t\tif (time < this.frames[0]) {\n\t\t\tif (blend == MixBlend.setup || blend == MixBlend.first) this.setAttachment(skeleton, slot, slot.data.attachmentName);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setAttachment(skeleton, slot, this.attachmentNames[Timeline.search1(this.frames, time)]);\n\t}\n\n\tsetAttachment(skeleton: Skeleton, slot: Slot, attachmentName: string) {\n\t\tslot.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName));\n\t}\n}\n\n/** Changes a slot's {@link Slot#deform} to deform a {@link VertexAttachment}. */\nexport class DeformTimeline extends CurveTimeline implements SlotTimeline {\n\tslotIndex = 0;\n\n\t/** The attachment that will be deformed. */\n\tattachment: VertexAttachment;\n\n\t/** The vertices for each key frame. */\n\tvertices: Array;\n\n\tconstructor(frameCount: number, bezierCount: number, slotIndex: number, attachment: VertexAttachment) {\n\t\tsuper(frameCount, bezierCount, [\n\t\t\tProperty.deform + \"|\" + slotIndex + \"|\" + attachment.id\n\t\t]);\n\t\tthis.slotIndex = slotIndex;\n\t\tthis.attachment = attachment;\n\t\tthis.vertices = new Array(frameCount);\n\t}\n\n\tgetFrameCount() {\n\t\treturn this.frames.length;\n\t}\n\n\t/** Sets the time in seconds and the vertices for the specified key frame.\n\t * @param vertices Vertex positions for an unweighted VertexAttachment, or deform offsets if it has weights. */\n\tsetFrame(frame: number, time: number, vertices: NumberArrayLike) {\n\t\tthis.frames[frame] = time;\n\t\tthis.vertices[frame] = vertices;\n\t}\n\n\t/** @param value1 Ignored (0 is used for a deform timeline).\n\t * @param value2 Ignored (1 is used for a deform timeline). */\n\tsetBezier(bezier: number, frame: number, value: number, time1: number, value1: number, cx1: number, cy1: number, cx2: number,\n\t\tcy2: number, time2: number, value2: number) {\n\t\tlet curves = this.curves;\n\t\tlet i = this.getFrameCount() + bezier * 18/*BEZIER_SIZE*/;\n\t\tif (value == 0) curves[frame] = 2/*BEZIER*/ + i;\n\t\tlet tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06;\n\t\tlet dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = (cy1 - cy2 + 0.33333333) * 0.018;\n\t\tlet ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;\n\t\tlet dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = cy1 * 0.3 + tmpy + dddy * 0.16666667;\n\t\tlet x = time1 + dx, y = dy;\n\t\tfor (let n = i + 18/*BEZIER_SIZE*/; i < n; i += 2) {\n\t\t\tcurves[i] = x;\n\t\t\tcurves[i + 1] = y;\n\t\t\tdx += ddx;\n\t\t\tdy += ddy;\n\t\t\tddx += dddx;\n\t\t\tddy += dddy;\n\t\t\tx += dx;\n\t\t\ty += dy;\n\t\t}\n\t}\n\n\tgetCurvePercent(time: number, frame: number) {\n\t\tlet curves = this.curves;\n\t\tlet i = curves[frame];\n\t\tswitch (i) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet x = this.frames[frame];\n\t\t\t\treturn (time - x) / (this.frames[frame + this.getFrameEntries()] - x);\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\treturn 0;\n\t\t}\n\t\ti -= 2/*BEZIER*/;\n\t\tif (curves[i] > time) {\n\t\t\tlet x = this.frames[frame];\n\t\t\treturn curves[i + 1] * (time - x) / (curves[i] - x);\n\t\t}\n\t\tlet n = i + 18/*BEZIER_SIZE*/;\n\t\tfor (i += 2; i < n; i += 2) {\n\t\t\tif (curves[i] >= time) {\n\t\t\t\tlet x = curves[i - 2], y = curves[i - 1];\n\t\t\t\treturn y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);\n\t\t\t}\n\t\t}\n\t\tlet x = curves[n - 2], y = curves[n - 1];\n\t\treturn y + (1 - y) * (time - x) / (this.frames[frame + this.getFrameEntries()] - x);\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet slot: Slot = skeleton.slots[this.slotIndex];\n\t\tif (!slot.bone.active) return;\n\t\tlet slotAttachment: Attachment = slot.getAttachment();\n\t\tif (!(slotAttachment instanceof VertexAttachment) || (slotAttachment).deformAttachment != this.attachment) return;\n\n\t\tlet deform: Array = slot.deform;\n\t\tif (deform.length == 0) blend = MixBlend.setup;\n\n\t\tlet vertices = this.vertices;\n\t\tlet vertexCount = vertices[0].length;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tlet vertexAttachment = slotAttachment;\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tdeform.length = 0;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tif (alpha == 1) {\n\t\t\t\t\t\tdeform.length = 0;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tdeform.length = vertexCount;\n\t\t\t\t\tif (!vertexAttachment.bones) {\n\t\t\t\t\t\t// Unweighted vertex positions.\n\t\t\t\t\t\tlet setupVertices = vertexAttachment.vertices;\n\t\t\t\t\t\tfor (var i = 0; i < vertexCount; i++)\n\t\t\t\t\t\t\tdeform[i] += (setupVertices[i] - deform[i]) * alpha;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Weighted deform offsets.\n\t\t\t\t\t\talpha = 1 - alpha;\n\t\t\t\t\t\tfor (var i = 0; i < vertexCount; i++)\n\t\t\t\t\t\t\tdeform[i] *= alpha;\n\t\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tdeform.length = vertexCount;\n\t\tif (time >= frames[frames.length - 1]) { // Time is after last frame.\n\t\t\tlet lastVertices = vertices[frames.length - 1];\n\t\t\tif (alpha == 1) {\n\t\t\t\tif (blend == MixBlend.add) {\n\t\t\t\t\tlet vertexAttachment = slotAttachment as VertexAttachment;\n\t\t\t\t\tif (!vertexAttachment.bones) {\n\t\t\t\t\t\t// Unweighted vertex positions, with alpha.\n\t\t\t\t\t\tlet setupVertices = vertexAttachment.vertices;\n\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++)\n\t\t\t\t\t\t\tdeform[i] += lastVertices[i] - setupVertices[i];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Weighted deform offsets, with alpha.\n\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++)\n\t\t\t\t\t\t\tdeform[i] += lastVertices[i];\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tUtils.arrayCopy(lastVertices, 0, deform, 0, vertexCount);\n\t\t\t} else {\n\t\t\t\tswitch (blend) {\n\t\t\t\t\tcase MixBlend.setup: {\n\t\t\t\t\t\tlet vertexAttachment = slotAttachment as VertexAttachment;\n\t\t\t\t\t\tif (!vertexAttachment.bones) {\n\t\t\t\t\t\t\t// Unweighted vertex positions, with alpha.\n\t\t\t\t\t\t\tlet setupVertices = vertexAttachment.vertices;\n\t\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\t\t\t\tlet setup = setupVertices[i];\n\t\t\t\t\t\t\t\tdeform[i] = setup + (lastVertices[i] - setup) * alpha;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Weighted deform offsets, with alpha.\n\t\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++)\n\t\t\t\t\t\t\t\tdeform[i] = lastVertices[i] * alpha;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tcase MixBlend.replace:\n\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++)\n\t\t\t\t\t\t\tdeform[i] += (lastVertices[i] - deform[i]) * alpha;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MixBlend.add:\n\t\t\t\t\t\tlet vertexAttachment = slotAttachment as VertexAttachment;\n\t\t\t\t\t\tif (!vertexAttachment.bones) {\n\t\t\t\t\t\t\t// Unweighted vertex positions, with alpha.\n\t\t\t\t\t\t\tlet setupVertices = vertexAttachment.vertices;\n\t\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++)\n\t\t\t\t\t\t\t\tdeform[i] += (lastVertices[i] - setupVertices[i]) * alpha;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Weighted deform offsets, with alpha.\n\t\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++)\n\t\t\t\t\t\t\t\tdeform[i] += lastVertices[i] * alpha;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Interpolate between the previous frame and the current frame.\n\t\tlet frame = Timeline.search1(frames, time);\n\t\tlet percent = this.getCurvePercent(time, frame);\n\t\tlet prevVertices = vertices[frame];\n\t\tlet nextVertices = vertices[frame + 1];\n\n\t\tif (alpha == 1) {\n\t\t\tif (blend == MixBlend.add) {\n\t\t\t\tlet vertexAttachment = slotAttachment as VertexAttachment;\n\t\t\t\tif (!vertexAttachment.bones) {\n\t\t\t\t\t// Unweighted vertex positions, with alpha.\n\t\t\t\t\tlet setupVertices = vertexAttachment.vertices;\n\t\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\t\tlet prev = prevVertices[i];\n\t\t\t\t\t\tdeform[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Weighted deform offsets, with alpha.\n\t\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\t\tlet prev = prevVertices[i];\n\t\t\t\t\t\tdeform[i] += prev + (nextVertices[i] - prev) * percent;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\tlet prev = prevVertices[i];\n\t\t\t\t\tdeform[i] = prev + (nextVertices[i] - prev) * percent;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup: {\n\t\t\t\t\tlet vertexAttachment = slotAttachment as VertexAttachment;\n\t\t\t\t\tif (!vertexAttachment.bones) {\n\t\t\t\t\t\t// Unweighted vertex positions, with alpha.\n\t\t\t\t\t\tlet setupVertices = vertexAttachment.vertices;\n\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\t\t\tlet prev = prevVertices[i], setup = setupVertices[i];\n\t\t\t\t\t\t\tdeform[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Weighted deform offsets, with alpha.\n\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\t\t\tlet prev = prevVertices[i];\n\t\t\t\t\t\t\tdeform[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MixBlend.first:\n\t\t\t\tcase MixBlend.replace:\n\t\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\t\tlet prev = prevVertices[i];\n\t\t\t\t\t\tdeform[i] += (prev + (nextVertices[i] - prev) * percent - deform[i]) * alpha;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase MixBlend.add:\n\t\t\t\t\tlet vertexAttachment = slotAttachment as VertexAttachment;\n\t\t\t\t\tif (!vertexAttachment.bones) {\n\t\t\t\t\t\t// Unweighted vertex positions, with alpha.\n\t\t\t\t\t\tlet setupVertices = vertexAttachment.vertices;\n\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\t\t\tlet prev = prevVertices[i];\n\t\t\t\t\t\t\tdeform[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Weighted deform offsets, with alpha.\n\t\t\t\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\t\t\t\tlet prev = prevVertices[i];\n\t\t\t\t\t\t\tdeform[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Fires an {@link Event} when specific animation times are reached. */\nexport class EventTimeline extends Timeline {\n\tstatic propertyIds = [\"\" + Property.event];\n\n\t/** The event for each key frame. */\n\tevents: Array;\n\n\tconstructor(frameCount: number) {\n\t\tsuper(frameCount, EventTimeline.propertyIds);\n\n\t\tthis.events = new Array(frameCount);\n\t}\n\n\tgetFrameCount() {\n\t\treturn this.frames.length;\n\t}\n\n\t/** Sets the time in seconds and the event for the specified key frame. */\n\tsetFrame(frame: number, event: Event) {\n\t\tthis.frames[frame] = event.time;\n\t\tthis.events[frame] = event;\n\t}\n\n\t/** Fires events for frames > `lastTime` and <= `time`. */\n\tapply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tif (!firedEvents) return;\n\n\t\tlet frames = this.frames;\n\t\tlet frameCount = this.frames.length;\n\n\t\tif (lastTime > time) { // Fire events after last time for looped animations.\n\t\t\tthis.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);\n\t\t\tlastTime = -1;\n\t\t} else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame.\n\t\t\treturn;\n\t\tif (time < frames[0]) return; // Time is before first frame.\n\n\t\tlet i = 0;\n\t\tif (lastTime < frames[0])\n\t\t\ti = 0;\n\t\telse {\n\t\t\ti = Timeline.search1(frames, lastTime) + 1;\n\t\t\tlet frameTime = frames[i];\n\t\t\twhile (i > 0) { // Fire multiple events with the same frame.\n\t\t\t\tif (frames[i - 1] != frameTime) break;\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\t\tfor (; i < frameCount && time >= frames[i]; i++)\n\t\t\tfiredEvents.push(this.events[i]);\n\t}\n}\n\n/** Changes a skeleton's {@link Skeleton#drawOrder}. */\nexport class DrawOrderTimeline extends Timeline {\n\tstatic propertyIds = [\"\" + Property.drawOrder];\n\n\t/** The draw order for each key frame. See {@link #setFrame(int, float, int[])}. */\n\tdrawOrders: Array>;\n\n\tconstructor(frameCount: number) {\n\t\tsuper(frameCount, DrawOrderTimeline.propertyIds);\n\t\tthis.drawOrders = new Array>(frameCount);\n\t}\n\n\tgetFrameCount() {\n\t\treturn this.frames.length;\n\t}\n\n\t/** Sets the time in seconds and the draw order for the specified key frame.\n\t * @param drawOrder For each slot in {@link Skeleton#slots}, the index of the new draw order. May be null to use setup pose\n\t * draw order. */\n\tsetFrame(frame: number, time: number, drawOrder: Array) {\n\t\tthis.frames[frame] = time;\n\t\tthis.drawOrders[frame] = drawOrder;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tif (direction == MixDirection.mixOut) {\n\t\t\tif (blend == MixBlend.setup) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);\n\t\t\treturn;\n\t\t}\n\n\t\tif (time < this.frames[0]) {\n\t\t\tif (blend == MixBlend.setup || blend == MixBlend.first) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);\n\t\t\treturn;\n\t\t}\n\n\t\tlet drawOrderToSetupIndex = this.drawOrders[Timeline.search1(this.frames, time)];\n\t\tif (!drawOrderToSetupIndex)\n\t\t\tUtils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);\n\t\telse {\n\t\t\tlet drawOrder: Array = skeleton.drawOrder;\n\t\t\tlet slots: Array = skeleton.slots;\n\t\t\tfor (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++)\n\t\t\t\tdrawOrder[i] = slots[drawOrderToSetupIndex[i]];\n\t\t}\n\t}\n}\n\n/** Changes an IK constraint's {@link IkConstraint#mix}, {@link IkConstraint#softness},\n * {@link IkConstraint#bendDirection}, {@link IkConstraint#stretch}, and {@link IkConstraint#compress}. */\nexport class IkConstraintTimeline extends CurveTimeline {\n\t/** The index of the IK constraint slot in {@link Skeleton#ikConstraints} that will be changed. */\n\tikConstraintIndex: number;\n\n\tconstructor(frameCount: number, bezierCount: number, ikConstraintIndex: number) {\n\t\tsuper(frameCount, bezierCount, [\n\t\t\tProperty.ikConstraint + \"|\" + ikConstraintIndex\n\t\t]);\n\t\tthis.ikConstraintIndex = ikConstraintIndex;\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 6/*ENTRIES*/;\n\t}\n\n\t/** Sets the time in seconds, mix, softness, bend direction, compress, and stretch for the specified key frame. */\n\tsetFrame(frame: number, time: number, mix: number, softness: number, bendDirection: number, compress: boolean, stretch: boolean) {\n\t\tframe *= 6/*ENTRIES*/;\n\t\tthis.frames[frame] = time;\n\t\tthis.frames[frame + 1/*MIX*/] = mix;\n\t\tthis.frames[frame + 2/*SOFTNESS*/] = softness;\n\t\tthis.frames[frame + 3/*BEND_DIRECTION*/] = bendDirection;\n\t\tthis.frames[frame + 4/*COMPRESS*/] = compress ? 1 : 0;\n\t\tthis.frames[frame + 5/*STRETCH*/] = stretch ? 1 : 0;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet constraint: IkConstraint = skeleton.ikConstraints[this.ikConstraintIndex];\n\t\tif (!constraint.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tconstraint.mix = constraint.data.mix;\n\t\t\t\t\tconstraint.softness = constraint.data.softness;\n\t\t\t\t\tconstraint.bendDirection = constraint.data.bendDirection;\n\t\t\t\t\tconstraint.compress = constraint.data.compress;\n\t\t\t\t\tconstraint.stretch = constraint.data.stretch;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tconstraint.mix += (constraint.data.mix - constraint.mix) * alpha;\n\t\t\t\t\tconstraint.softness += (constraint.data.softness - constraint.softness) * alpha;\n\t\t\t\t\tconstraint.bendDirection = constraint.data.bendDirection;\n\t\t\t\t\tconstraint.compress = constraint.data.compress;\n\t\t\t\t\tconstraint.stretch = constraint.data.stretch;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet mix = 0, softness = 0;\n\t\tlet i = Timeline.search(frames, time, 6/*ENTRIES*/)\n\t\tlet curveType = this.curves[i / 6/*ENTRIES*/];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\tmix = frames[i + 1/*MIX*/];\n\t\t\t\tsoftness = frames[i + 2/*SOFTNESS*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 6/*ENTRIES*/] - before);\n\t\t\t\tmix += (frames[i + 6/*ENTRIES*/ + 1/*MIX*/] - mix) * t;\n\t\t\t\tsoftness += (frames[i + 6/*ENTRIES*/ + 2/*SOFTNESS*/] - softness) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\tmix = frames[i + 1/*MIX*/];\n\t\t\t\tsoftness = frames[i + 2/*SOFTNESS*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tmix = this.getBezierValue(time, i, 1/*MIX*/, curveType - 2/*BEZIER*/);\n\t\t\t\tsoftness = this.getBezierValue(time, i, 2/*SOFTNESS*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t}\n\n\t\tif (blend == MixBlend.setup) {\n\t\t\tconstraint.mix = constraint.data.mix + (mix - constraint.data.mix) * alpha;\n\t\t\tconstraint.softness = constraint.data.softness + (softness - constraint.data.softness) * alpha;\n\n\t\t\tif (direction == MixDirection.mixOut) {\n\t\t\t\tconstraint.bendDirection = constraint.data.bendDirection;\n\t\t\t\tconstraint.compress = constraint.data.compress;\n\t\t\t\tconstraint.stretch = constraint.data.stretch;\n\t\t\t} else {\n\t\t\t\tconstraint.bendDirection = frames[i + 3/*BEND_DIRECTION*/];\n\t\t\t\tconstraint.compress = frames[i + 4/*COMPRESS*/] != 0;\n\t\t\t\tconstraint.stretch = frames[i + 5/*STRETCH*/] != 0;\n\t\t\t}\n\t\t} else {\n\t\t\tconstraint.mix += (mix - constraint.mix) * alpha;\n\t\t\tconstraint.softness += (softness - constraint.softness) * alpha;\n\t\t\tif (direction == MixDirection.mixIn) {\n\t\t\t\tconstraint.bendDirection = frames[i + 3/*BEND_DIRECTION*/];\n\t\t\t\tconstraint.compress = frames[i + 4/*COMPRESS*/] != 0;\n\t\t\t\tconstraint.stretch = frames[i + 5/*STRETCH*/] != 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Changes a transform constraint's {@link TransformConstraint#rotateMix}, {@link TransformConstraint#translateMix},\n * {@link TransformConstraint#scaleMix}, and {@link TransformConstraint#shearMix}. */\nexport class TransformConstraintTimeline extends CurveTimeline {\n\t/** The index of the transform constraint slot in {@link Skeleton#transformConstraints} that will be changed. */\n\ttransformConstraintIndex: number;\n\n\tconstructor(frameCount: number, bezierCount: number, transformConstraintIndex: number) {\n\t\tsuper(frameCount, bezierCount, [\n\t\t\tProperty.transformConstraint + \"|\" + transformConstraintIndex\n\t\t]);\n\t\tthis.transformConstraintIndex = transformConstraintIndex;\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 7/*ENTRIES*/;\n\t}\n\n\t/** The time in seconds, rotate mix, translate mix, scale mix, and shear mix for the specified key frame. */\n\tsetFrame(frame: number, time: number, mixRotate: number, mixX: number, mixY: number, mixScaleX: number, mixScaleY: number,\n\t\tmixShearY: number) {\n\t\tlet frames = this.frames;\n\t\tframe *= 7/*ENTRIES*/;\n\t\tframes[frame] = time;\n\t\tframes[frame + 1/*ROTATE*/] = mixRotate;\n\t\tframes[frame + 2/*X*/] = mixX;\n\t\tframes[frame + 3/*Y*/] = mixY;\n\t\tframes[frame + 4/*SCALEX*/] = mixScaleX;\n\t\tframes[frame + 5/*SCALEY*/] = mixScaleY;\n\t\tframes[frame + 6/*SHEARY*/] = mixShearY;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet constraint: TransformConstraint = skeleton.transformConstraints[this.transformConstraintIndex];\n\t\tif (!constraint.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tlet data = constraint.data;\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tconstraint.mixRotate = data.mixRotate;\n\t\t\t\t\tconstraint.mixX = data.mixX;\n\t\t\t\t\tconstraint.mixY = data.mixY;\n\t\t\t\t\tconstraint.mixScaleX = data.mixScaleX;\n\t\t\t\t\tconstraint.mixScaleY = data.mixScaleY;\n\t\t\t\t\tconstraint.mixShearY = data.mixShearY;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tconstraint.mixRotate += (data.mixRotate - constraint.mixRotate) * alpha;\n\t\t\t\t\tconstraint.mixX += (data.mixX - constraint.mixX) * alpha;\n\t\t\t\t\tconstraint.mixY += (data.mixY - constraint.mixY) * alpha;\n\t\t\t\t\tconstraint.mixScaleX += (data.mixScaleX - constraint.mixScaleX) * alpha;\n\t\t\t\t\tconstraint.mixScaleY += (data.mixScaleY - constraint.mixScaleY) * alpha;\n\t\t\t\t\tconstraint.mixShearY += (data.mixShearY - constraint.mixShearY) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet rotate, x, y, scaleX, scaleY, shearY;\n\t\tlet i = Timeline.search(frames, time, 7/*ENTRIES*/);\n\t\tlet curveType = this.curves[i / 7/*ENTRIES*/];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\trotate = frames[i + 1/*ROTATE*/];\n\t\t\t\tx = frames[i + 2/*X*/];\n\t\t\t\ty = frames[i + 3/*Y*/];\n\t\t\t\tscaleX = frames[i + 4/*SCALEX*/];\n\t\t\t\tscaleY = frames[i + 5/*SCALEY*/];\n\t\t\t\tshearY = frames[i + 6/*SHEARY*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 7/*ENTRIES*/] - before);\n\t\t\t\trotate += (frames[i + 7/*ENTRIES*/ + 1/*ROTATE*/] - rotate) * t;\n\t\t\t\tx += (frames[i + 7/*ENTRIES*/ + 2/*X*/] - x) * t;\n\t\t\t\ty += (frames[i + 7/*ENTRIES*/ + 3/*Y*/] - y) * t;\n\t\t\t\tscaleX += (frames[i + 7/*ENTRIES*/ + 4/*SCALEX*/] - scaleX) * t;\n\t\t\t\tscaleY += (frames[i + 7/*ENTRIES*/ + 5/*SCALEY*/] - scaleY) * t;\n\t\t\t\tshearY += (frames[i + 7/*ENTRIES*/ + 6/*SHEARY*/] - shearY) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\trotate = frames[i + 1/*ROTATE*/];\n\t\t\t\tx = frames[i + 2/*X*/];\n\t\t\t\ty = frames[i + 3/*Y*/];\n\t\t\t\tscaleX = frames[i + 4/*SCALEX*/];\n\t\t\t\tscaleY = frames[i + 5/*SCALEY*/];\n\t\t\t\tshearY = frames[i + 6/*SHEARY*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\trotate = this.getBezierValue(time, i, 1/*ROTATE*/, curveType - 2/*BEZIER*/);\n\t\t\t\tx = this.getBezierValue(time, i, 2/*X*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t\t\ty = this.getBezierValue(time, i, 3/*Y*/, curveType + 18/*BEZIER_SIZE*/ * 2 - 2/*BEZIER*/);\n\t\t\t\tscaleX = this.getBezierValue(time, i, 4/*SCALEX*/, curveType + 18/*BEZIER_SIZE*/ * 3 - 2/*BEZIER*/);\n\t\t\t\tscaleY = this.getBezierValue(time, i, 5/*SCALEY*/, curveType + 18/*BEZIER_SIZE*/ * 4 - 2/*BEZIER*/);\n\t\t\t\tshearY = this.getBezierValue(time, i, 6/*SHEARY*/, curveType + 18/*BEZIER_SIZE*/ * 5 - 2/*BEZIER*/);\n\t\t}\n\n\t\tif (blend == MixBlend.setup) {\n\t\t\tlet data = constraint.data;\n\t\t\tconstraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;\n\t\t\tconstraint.mixX = data.mixX + (x - data.mixX) * alpha;\n\t\t\tconstraint.mixY = data.mixY + (y - data.mixY) * alpha;\n\t\t\tconstraint.mixScaleX = data.mixScaleX + (scaleX - data.mixScaleX) * alpha;\n\t\t\tconstraint.mixScaleY = data.mixScaleY + (scaleY - data.mixScaleY) * alpha;\n\t\t\tconstraint.mixShearY = data.mixShearY + (shearY - data.mixShearY) * alpha;\n\t\t} else {\n\t\t\tconstraint.mixRotate += (rotate - constraint.mixRotate) * alpha;\n\t\t\tconstraint.mixX += (x - constraint.mixX) * alpha;\n\t\t\tconstraint.mixY += (y - constraint.mixY) * alpha;\n\t\t\tconstraint.mixScaleX += (scaleX - constraint.mixScaleX) * alpha;\n\t\t\tconstraint.mixScaleY += (scaleY - constraint.mixScaleY) * alpha;\n\t\t\tconstraint.mixShearY += (shearY - constraint.mixShearY) * alpha;\n\t\t}\n\t}\n}\n\n/** Changes a path constraint's {@link PathConstraint#position}. */\nexport class PathConstraintPositionTimeline extends CurveTimeline1 {\n\t/** The index of the path constraint slot in {@link Skeleton#pathConstraints} that will be changed. */\n\tpathConstraintIndex: number;\n\n\tconstructor(frameCount: number, bezierCount: number, pathConstraintIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.pathConstraintPosition + \"|\" + pathConstraintIndex);\n\t\tthis.pathConstraintIndex = pathConstraintIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\t\tif (!constraint.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tconstraint.position = constraint.data.position;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tconstraint.position += (constraint.data.position - constraint.position) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet position = this.getCurveValue(time);\n\n\t\tif (blend == MixBlend.setup)\n\t\t\tconstraint.position = constraint.data.position + (position - constraint.data.position) * alpha;\n\t\telse\n\t\t\tconstraint.position += (position - constraint.position) * alpha;\n\t}\n}\n\n/** Changes a path constraint's {@link PathConstraint#spacing}. */\nexport class PathConstraintSpacingTimeline extends CurveTimeline1 {\n\t/** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */\n\tpathConstraintIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, pathConstraintIndex: number) {\n\t\tsuper(frameCount, bezierCount, Property.pathConstraintSpacing + \"|\" + pathConstraintIndex);\n\t\tthis.pathConstraintIndex = pathConstraintIndex;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\t\tif (!constraint.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tconstraint.spacing = constraint.data.spacing;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tconstraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet spacing = this.getCurveValue(time);\n\n\t\tif (blend == MixBlend.setup)\n\t\t\tconstraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha;\n\t\telse\n\t\t\tconstraint.spacing += (spacing - constraint.spacing) * alpha;\n\t}\n}\n\n/** Changes a transform constraint's {@link PathConstraint#getMixRotate()}, {@link PathConstraint#getMixX()}, and\n * {@link PathConstraint#getMixY()}. */\nexport class PathConstraintMixTimeline extends CurveTimeline {\n\t/** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */\n\tpathConstraintIndex = 0;\n\n\tconstructor(frameCount: number, bezierCount: number, pathConstraintIndex: number) {\n\t\tsuper(frameCount, bezierCount, [\n\t\t\tProperty.pathConstraintMix + \"|\" + pathConstraintIndex\n\t\t]);\n\t\tthis.pathConstraintIndex = pathConstraintIndex;\n\t}\n\n\tgetFrameEntries() {\n\t\treturn 4/*ENTRIES*/;\n\t}\n\n\tsetFrame(frame: number, time: number, mixRotate: number, mixX: number, mixY: number) {\n\t\tlet frames = this.frames;\n\t\tframe <<= 2;\n\t\tframes[frame] = time;\n\t\tframes[frame + 1/*ROTATE*/] = mixRotate;\n\t\tframes[frame + 2/*X*/] = mixX;\n\t\tframes[frame + 3/*Y*/] = mixY;\n\t}\n\n\tapply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection) {\n\t\tlet constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\t\tif (!constraint.active) return;\n\n\t\tlet frames = this.frames;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tconstraint.mixRotate = constraint.data.mixRotate;\n\t\t\t\t\tconstraint.mixX = constraint.data.mixX;\n\t\t\t\t\tconstraint.mixY = constraint.data.mixY;\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tconstraint.mixRotate += (constraint.data.mixRotate - constraint.mixRotate) * alpha;\n\t\t\t\t\tconstraint.mixX += (constraint.data.mixX - constraint.mixX) * alpha;\n\t\t\t\t\tconstraint.mixY += (constraint.data.mixY - constraint.mixY) * alpha;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet rotate, x, y;\n\t\tlet i = Timeline.search(frames, time, 4/*ENTRIES*/);\n\t\tlet curveType = this.curves[i >> 2];\n\t\tswitch (curveType) {\n\t\t\tcase 0/*LINEAR*/:\n\t\t\t\tlet before = frames[i];\n\t\t\t\trotate = frames[i + 1/*ROTATE*/];\n\t\t\t\tx = frames[i + 2/*X*/];\n\t\t\t\ty = frames[i + 3/*Y*/];\n\t\t\t\tlet t = (time - before) / (frames[i + 4/*ENTRIES*/] - before);\n\t\t\t\trotate += (frames[i + 4/*ENTRIES*/ + 1/*ROTATE*/] - rotate) * t;\n\t\t\t\tx += (frames[i + 4/*ENTRIES*/ + 2/*X*/] - x) * t;\n\t\t\t\ty += (frames[i + 4/*ENTRIES*/ + 3/*Y*/] - y) * t;\n\t\t\t\tbreak;\n\t\t\tcase 1/*STEPPED*/:\n\t\t\t\trotate = frames[i + 1/*ROTATE*/];\n\t\t\t\tx = frames[i + 2/*X*/];\n\t\t\t\ty = frames[i + 3/*Y*/];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\trotate = this.getBezierValue(time, i, 1/*ROTATE*/, curveType - 2/*BEZIER*/);\n\t\t\t\tx = this.getBezierValue(time, i, 2/*X*/, curveType + 18/*BEZIER_SIZE*/ - 2/*BEZIER*/);\n\t\t\t\ty = this.getBezierValue(time, i, 3/*Y*/, curveType + 18/*BEZIER_SIZE*/ * 2 - 2/*BEZIER*/);\n\t\t}\n\n\t\tif (blend == MixBlend.setup) {\n\t\t\tlet data = constraint.data;\n\t\t\tconstraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;\n\t\t\tconstraint.mixX = data.mixX + (x - data.mixX) * alpha;\n\t\t\tconstraint.mixY = data.mixY + (y - data.mixY) * alpha;\n\t\t} else {\n\t\t\tconstraint.mixRotate += (rotate - constraint.mixRotate) * alpha;\n\t\t\tconstraint.mixX += (x - constraint.mixX) * alpha;\n\t\t\tconstraint.mixY += (y - constraint.mixY) * alpha;\n\t\t}\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Animation, MixBlend, AttachmentTimeline, MixDirection, RotateTimeline, DrawOrderTimeline, Timeline, EventTimeline } from \"./Animation\";\nimport { AnimationStateData } from \"./AnimationStateData\";\nimport { Skeleton } from \"./Skeleton\";\nimport { Slot } from \"./Slot\";\nimport { StringSet, Pool, Utils, MathUtils } from \"./Utils\";\nimport { Event } from \"./Event\";\n\n\n/** Applies animations over time, queues animations for later playback, mixes (crossfading) between animations, and applies\n * multiple animations on top of each other (layering).\n *\n * See [Applying Animations](http://esotericsoftware.com/spine-applying-animations/) in the Spine Runtimes Guide. */\nexport class AnimationState {\n\tprivate static emptyAnimation(): Animation {\n\t\tif (!_emptyAnimation) _emptyAnimation = new Animation(\"\", [], 0);\n\t\treturn _emptyAnimation;\n\t}\n\n\t/** The AnimationStateData to look up mix durations. */\n\tdata: AnimationStateData;\n\n\t/** The list of tracks that currently have animations, which may contain null entries. */\n\ttracks = new Array();\n\n\t/** Multiplier for the delta time when the animation state is updated, causing time for all animations and mixes to play slower\n\t * or faster. Defaults to 1.\n\t *\n\t * See TrackEntry {@link TrackEntry#timeScale} for affecting a single animation. */\n\ttimeScale = 1;\n\tunkeyedState = 0;\n\n\tevents = new Array();\n\tlisteners = new Array();\n\tqueue = new EventQueue(this);\n\tpropertyIDs = new StringSet();\n\tanimationsChanged = false;\n\n\ttrackEntryPool = new Pool(() => new TrackEntry());\n\n\tconstructor(data: AnimationStateData) {\n\t\tthis.data = data;\n\t}\n\n\t/** Increments each track entry {@link TrackEntry#trackTime()}, setting queued animations as current if needed. */\n\tupdate(delta: number) {\n\t\tdelta *= this.timeScale;\n\t\tlet tracks = this.tracks;\n\t\tfor (let i = 0, n = tracks.length; i < n; i++) {\n\t\t\tlet current = tracks[i];\n\t\t\tif (!current) continue;\n\n\t\t\tcurrent.animationLast = current.nextAnimationLast;\n\t\t\tcurrent.trackLast = current.nextTrackLast;\n\n\t\t\tlet currentDelta = delta * current.timeScale;\n\n\t\t\tif (current.delay > 0) {\n\t\t\t\tcurrent.delay -= currentDelta;\n\t\t\t\tif (current.delay > 0) continue;\n\t\t\t\tcurrentDelta = -current.delay;\n\t\t\t\tcurrent.delay = 0;\n\t\t\t}\n\n\t\t\tlet next = current.next;\n\t\t\tif (next) {\n\t\t\t\t// When the next entry's delay is passed, change to the next entry, preserving leftover time.\n\t\t\t\tlet nextTime = current.trackLast - next.delay;\n\t\t\t\tif (nextTime >= 0) {\n\t\t\t\t\tnext.delay = 0;\n\t\t\t\t\tnext.trackTime += current.timeScale == 0 ? 0 : (nextTime / current.timeScale + delta) * next.timeScale;\n\t\t\t\t\tcurrent.trackTime += currentDelta;\n\t\t\t\t\tthis.setCurrent(i, next, true);\n\t\t\t\t\twhile (next.mixingFrom) {\n\t\t\t\t\t\tnext.mixTime += delta;\n\t\t\t\t\t\tnext = next.mixingFrom;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else if (current.trackLast >= current.trackEnd && !current.mixingFrom) {\n\t\t\t\ttracks[i] = null;\n\t\t\t\tthis.queue.end(current);\n\t\t\t\tthis.clearNext(current);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (current.mixingFrom && this.updateMixingFrom(current, delta)) {\n\t\t\t\t// End mixing from entries once all have completed.\n\t\t\t\tlet from = current.mixingFrom;\n\t\t\t\tcurrent.mixingFrom = null;\n\t\t\t\tif (from) from.mixingTo = null;\n\t\t\t\twhile (from) {\n\t\t\t\t\tthis.queue.end(from);\n\t\t\t\t\tfrom = from.mixingFrom;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent.trackTime += currentDelta;\n\t\t}\n\n\t\tthis.queue.drain();\n\t}\n\n\t/** Returns true when all mixing from entries are complete. */\n\tupdateMixingFrom(to: TrackEntry, delta: number): boolean {\n\t\tlet from = to.mixingFrom;\n\t\tif (!from) return true;\n\n\t\tlet finished = this.updateMixingFrom(from, delta);\n\n\t\tfrom.animationLast = from.nextAnimationLast;\n\t\tfrom.trackLast = from.nextTrackLast;\n\n\t\t// Require mixTime > 0 to ensure the mixing from entry was applied at least once.\n\t\tif (to.mixTime > 0 && to.mixTime >= to.mixDuration) {\n\t\t\t// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).\n\t\t\tif (from.totalAlpha == 0 || to.mixDuration == 0) {\n\t\t\t\tto.mixingFrom = from.mixingFrom;\n\t\t\t\tif (from.mixingFrom) from.mixingFrom.mixingTo = to;\n\t\t\t\tto.interruptAlpha = from.interruptAlpha;\n\t\t\t\tthis.queue.end(from);\n\t\t\t}\n\t\t\treturn finished;\n\t\t}\n\n\t\tfrom.trackTime += delta * from.timeScale;\n\t\tto.mixTime += delta;\n\t\treturn false;\n\t}\n\n\t/** Poses the skeleton using the track entry animations. There are no side effects other than invoking listeners, so the\n\t * animation state can be applied to multiple skeletons to pose them identically.\n\t * @returns True if any animations were applied. */\n\tapply(skeleton: Skeleton): boolean {\n\t\tif (!skeleton) throw new Error(\"skeleton cannot be null.\");\n\t\tif (this.animationsChanged) this._animationsChanged();\n\n\t\tlet events = this.events;\n\t\tlet tracks = this.tracks;\n\t\tlet applied = false;\n\n\t\tfor (let i = 0, n = tracks.length; i < n; i++) {\n\t\t\tlet current = tracks[i];\n\t\t\tif (!current || current.delay > 0) continue;\n\t\t\tapplied = true;\n\t\t\tlet blend: MixBlend = i == 0 ? MixBlend.first : current.mixBlend;\n\n\t\t\t// Apply mixing from entries first.\n\t\t\tlet mix = current.alpha;\n\t\t\tif (current.mixingFrom)\n\t\t\t\tmix *= this.applyMixingFrom(current, skeleton, blend);\n\t\t\telse if (current.trackTime >= current.trackEnd && !current.next)\n\t\t\t\tmix = 0;\n\n\t\t\t// Apply current entry.\n\t\t\tlet animationLast = current.animationLast, animationTime = current.getAnimationTime(), applyTime = animationTime;\n\t\t\tlet applyEvents = events;\n\t\t\tif (current.reverse) {\n\t\t\t\tapplyTime = current.animation.duration - applyTime;\n\t\t\t\tapplyEvents = null;\n\t\t\t}\n\t\t\tlet timelines = current.animation.timelines;\n\t\t\tlet timelineCount = timelines.length;\n\t\t\tif ((i == 0 && mix == 1) || blend == MixBlend.add) {\n\t\t\t\tfor (let ii = 0; ii < timelineCount; ii++) {\n\t\t\t\t\t// Fixes issue #302 on IOS9 where mix, blend sometimes became undefined and caused assets\n\t\t\t\t\t// to sometimes stop rendering when using color correction, as their RGBA values become NaN.\n\t\t\t\t\t// (https://github.com/pixijs/pixi-spine/issues/302)\n\t\t\t\t\tUtils.webkit602BugfixHelper(mix, blend);\n\t\t\t\t\tvar timeline = timelines[ii];\n\t\t\t\t\tif (timeline instanceof AttachmentTimeline)\n\t\t\t\t\t\tthis.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true);\n\t\t\t\t\telse\n\t\t\t\t\t\ttimeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, blend, MixDirection.mixIn);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlet timelineMode = current.timelineMode;\n\n\t\t\t\tlet firstFrame = current.timelinesRotation.length != timelineCount << 1;\n\t\t\t\tif (firstFrame) current.timelinesRotation.length = timelineCount << 1;\n\n\t\t\t\tfor (let ii = 0; ii < timelineCount; ii++) {\n\t\t\t\t\tlet timeline = timelines[ii];\n\t\t\t\t\tlet timelineBlend = timelineMode[ii] == SUBSEQUENT ? blend : MixBlend.setup;\n\t\t\t\t\tif (timeline instanceof RotateTimeline) {\n\t\t\t\t\t\tthis.applyRotateTimeline(timeline, skeleton, applyTime, mix, timelineBlend, current.timelinesRotation, ii << 1, firstFrame);\n\t\t\t\t\t} else if (timeline instanceof AttachmentTimeline) {\n\t\t\t\t\t\tthis.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109\n\t\t\t\t\t\tUtils.webkit602BugfixHelper(mix, blend);\n\t\t\t\t\t\ttimeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, timelineBlend, MixDirection.mixIn);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.queueEvents(current, animationTime);\n\t\t\tevents.length = 0;\n\t\t\tcurrent.nextAnimationLast = animationTime;\n\t\t\tcurrent.nextTrackLast = current.trackTime;\n\t\t}\n\n\t\t// Set slots attachments to the setup pose, if needed. This occurs if an animation that is mixing out sets attachments so\n\t\t// subsequent timelines see any deform, but the subsequent timelines don't set an attachment (eg they are also mixing out or\n\t\t// the time is before the first key).\n\t\tvar setupState = this.unkeyedState + SETUP;\n\t\tvar slots = skeleton.slots;\n\t\tfor (var i = 0, n = skeleton.slots.length; i < n; i++) {\n\t\t\tvar slot = slots[i];\n\t\t\tif (slot.attachmentState == setupState) {\n\t\t\t\tvar attachmentName = slot.data.attachmentName;\n\t\t\t\tslot.setAttachment(!attachmentName ? null : skeleton.getAttachment(slot.data.index, attachmentName));\n\t\t\t}\n\t\t}\n\t\tthis.unkeyedState += 2; // Increasing after each use avoids the need to reset attachmentState for every slot.\n\n\t\tthis.queue.drain();\n\t\treturn applied;\n\t}\n\n\tapplyMixingFrom(to: TrackEntry, skeleton: Skeleton, blend: MixBlend) {\n\t\tlet from = to.mixingFrom;\n\t\tif (from.mixingFrom) this.applyMixingFrom(from, skeleton, blend);\n\n\t\tlet mix = 0;\n\t\tif (to.mixDuration == 0) { // Single frame mix to undo mixingFrom changes.\n\t\t\tmix = 1;\n\t\t\tif (blend == MixBlend.first) blend = MixBlend.setup;\n\t\t} else {\n\t\t\tmix = to.mixTime / to.mixDuration;\n\t\t\tif (mix > 1) mix = 1;\n\t\t\tif (blend != MixBlend.first) blend = from.mixBlend;\n\t\t}\n\n\t\tlet attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold;\n\t\tlet timelines = from.animation.timelines;\n\t\tlet timelineCount = timelines.length;\n\t\tlet alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);\n\t\tlet animationLast = from.animationLast, animationTime = from.getAnimationTime(), applyTime = animationTime;\n\t\tlet events = null;\n\t\tif (from.reverse)\n\t\t\tapplyTime = from.animation.duration - applyTime;\n\t\telse if (mix < from.eventThreshold)\n\t\t\tevents = this.events;\n\n\t\tif (blend == MixBlend.add) {\n\t\t\tfor (let i = 0; i < timelineCount; i++)\n\t\t\t\ttimelines[i].apply(skeleton, animationLast, applyTime, events, alphaMix, blend, MixDirection.mixOut);\n\t\t} else {\n\t\t\tlet timelineMode = from.timelineMode;\n\t\t\tlet timelineHoldMix = from.timelineHoldMix;\n\n\t\t\tlet firstFrame = from.timelinesRotation.length != timelineCount << 1;\n\t\t\tif (firstFrame) from.timelinesRotation.length = timelineCount << 1;\n\n\t\t\tfrom.totalAlpha = 0;\n\t\t\tfor (let i = 0; i < timelineCount; i++) {\n\t\t\t\tlet timeline = timelines[i];\n\t\t\t\tlet direction = MixDirection.mixOut;\n\t\t\t\tlet timelineBlend: MixBlend;\n\t\t\t\tlet alpha = 0;\n\t\t\t\tswitch (timelineMode[i]) {\n\t\t\t\t\tcase SUBSEQUENT:\n\t\t\t\t\t\tif (!drawOrder && timeline instanceof DrawOrderTimeline) continue;\n\t\t\t\t\t\ttimelineBlend = blend;\n\t\t\t\t\t\talpha = alphaMix;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase FIRST:\n\t\t\t\t\t\ttimelineBlend = MixBlend.setup;\n\t\t\t\t\t\talpha = alphaMix;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase HOLD_SUBSEQUENT:\n\t\t\t\t\t\ttimelineBlend = blend;\n\t\t\t\t\t\talpha = alphaHold;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase HOLD_FIRST:\n\t\t\t\t\t\ttimelineBlend = MixBlend.setup;\n\t\t\t\t\t\talpha = alphaHold;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ttimelineBlend = MixBlend.setup;\n\t\t\t\t\t\tlet holdMix = timelineHoldMix[i];\n\t\t\t\t\t\talpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tfrom.totalAlpha += alpha;\n\n\t\t\t\tif (timeline instanceof RotateTimeline)\n\t\t\t\t\tthis.applyRotateTimeline(timeline, skeleton, applyTime, alpha, timelineBlend, from.timelinesRotation, i << 1, firstFrame);\n\t\t\t\telse if (timeline instanceof AttachmentTimeline)\n\t\t\t\t\tthis.applyAttachmentTimeline(timeline, skeleton, applyTime, timelineBlend, attachments);\n\t\t\t\telse {\n\t\t\t\t\t// This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109\n\t\t\t\t\tUtils.webkit602BugfixHelper(alpha, blend);\n\t\t\t\t\tif (drawOrder && timeline instanceof DrawOrderTimeline && timelineBlend == MixBlend.setup)\n\t\t\t\t\t\tdirection = MixDirection.mixIn;\n\t\t\t\t\ttimeline.apply(skeleton, animationLast, applyTime, events, alpha, timelineBlend, direction);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (to.mixDuration > 0) this.queueEvents(from, animationTime);\n\t\tthis.events.length = 0;\n\t\tfrom.nextAnimationLast = animationTime;\n\t\tfrom.nextTrackLast = from.trackTime;\n\n\t\treturn mix;\n\t}\n\n\tapplyAttachmentTimeline(timeline: AttachmentTimeline, skeleton: Skeleton, time: number, blend: MixBlend, attachments: boolean) {\n\t\tvar slot = skeleton.slots[timeline.slotIndex];\n\t\tif (!slot.bone.active) return;\n\n\t\tif (time < timeline.frames[0]) { // Time is before first frame.\n\t\t\tif (blend == MixBlend.setup || blend == MixBlend.first)\n\t\t\t\tthis.setAttachment(skeleton, slot, slot.data.attachmentName, attachments);\n\t\t} else\n\t\t\tthis.setAttachment(skeleton, slot, timeline.attachmentNames[Timeline.search1(timeline.frames, time)], attachments);\n\n\t\t// If an attachment wasn't set (ie before the first frame or attachments is false), set the setup attachment later.\n\t\tif (slot.attachmentState <= this.unkeyedState) slot.attachmentState = this.unkeyedState + SETUP;\n\t}\n\n\tsetAttachment(skeleton: Skeleton, slot: Slot, attachmentName: string, attachments: boolean) {\n\t\tslot.setAttachment(!attachmentName ? null : skeleton.getAttachment(slot.data.index, attachmentName));\n\t\tif (attachments) slot.attachmentState = this.unkeyedState + CURRENT;\n\t}\n\n\tapplyRotateTimeline(timeline: RotateTimeline, skeleton: Skeleton, time: number, alpha: number, blend: MixBlend,\n\t\ttimelinesRotation: Array, i: number, firstFrame: boolean) {\n\n\t\tif (firstFrame) timelinesRotation[i] = 0;\n\n\t\tif (alpha == 1) {\n\t\t\ttimeline.apply(skeleton, 0, time, null, 1, blend, MixDirection.mixIn);\n\t\t\treturn;\n\t\t}\n\n\t\tlet bone = skeleton.bones[timeline.boneIndex];\n\t\tif (!bone.active) return;\n\t\tlet frames = timeline.frames;\n\t\tlet r1 = 0, r2 = 0;\n\t\tif (time < frames[0]) {\n\t\t\tswitch (blend) {\n\t\t\t\tcase MixBlend.setup:\n\t\t\t\t\tbone.rotation = bone.data.rotation;\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t\tcase MixBlend.first:\n\t\t\t\t\tr1 = bone.rotation;\n\t\t\t\t\tr2 = bone.data.rotation;\n\t\t\t}\n\t\t} else {\n\t\t\tr1 = blend == MixBlend.setup ? bone.data.rotation : bone.rotation;\n\t\t\tr2 = bone.data.rotation + timeline.getCurveValue(time);\n\t\t}\n\n\t\t// Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.\n\t\tlet total = 0, diff = r2 - r1;\n\t\tdiff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360;\n\t\tif (diff == 0) {\n\t\t\ttotal = timelinesRotation[i];\n\t\t} else {\n\t\t\tlet lastTotal = 0, lastDiff = 0;\n\t\t\tif (firstFrame) {\n\t\t\t\tlastTotal = 0;\n\t\t\t\tlastDiff = diff;\n\t\t\t} else {\n\t\t\t\tlastTotal = timelinesRotation[i]; // Angle and direction of mix, including loops.\n\t\t\t\tlastDiff = timelinesRotation[i + 1]; // Difference between bones.\n\t\t\t}\n\t\t\tlet current = diff > 0, dir = lastTotal >= 0;\n\t\t\t// Detect cross at 0 (not 180).\n\t\t\tif (MathUtils.signum(lastDiff) != MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) {\n\t\t\t\t// A cross after a 360 rotation is a loop.\n\t\t\t\tif (Math.abs(lastTotal) > 180) lastTotal += 360 * MathUtils.signum(lastTotal);\n\t\t\t\tdir = current;\n\t\t\t}\n\t\t\ttotal = diff + lastTotal - lastTotal % 360; // Store loops as part of lastTotal.\n\t\t\tif (dir != current) total += 360 * MathUtils.signum(lastTotal);\n\t\t\ttimelinesRotation[i] = total;\n\t\t}\n\t\ttimelinesRotation[i + 1] = diff;\n\t\tbone.rotation = r1 + total * alpha;\n\t}\n\n\tqueueEvents(entry: TrackEntry, animationTime: number) {\n\t\tlet animationStart = entry.animationStart, animationEnd = entry.animationEnd;\n\t\tlet duration = animationEnd - animationStart;\n\t\tlet trackLastWrapped = entry.trackLast % duration;\n\n\t\t// Queue events before complete.\n\t\tlet events = this.events;\n\t\tlet i = 0, n = events.length;\n\t\tfor (; i < n; i++) {\n\t\t\tlet event = events[i];\n\t\t\tif (event.time < trackLastWrapped) break;\n\t\t\tif (event.time > animationEnd) continue; // Discard events outside animation start/end.\n\t\t\tthis.queue.event(entry, event);\n\t\t}\n\n\t\t// Queue complete if completed a loop iteration or the animation.\n\t\tlet complete = false;\n\t\tif (entry.loop)\n\t\t\tcomplete = duration == 0 || trackLastWrapped > entry.trackTime % duration;\n\t\telse\n\t\t\tcomplete = animationTime >= animationEnd && entry.animationLast < animationEnd;\n\t\tif (complete) this.queue.complete(entry);\n\n\t\t// Queue events after complete.\n\t\tfor (; i < n; i++) {\n\t\t\tlet event = events[i];\n\t\t\tif (event.time < animationStart) continue; // Discard events outside animation start/end.\n\t\t\tthis.queue.event(entry, event);\n\t\t}\n\t}\n\n\t/** Removes all animations from all tracks, leaving skeletons in their current pose.\n\t *\n\t * It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,\n\t * rather than leaving them in their current pose. */\n\tclearTracks() {\n\t\tlet oldDrainDisabled = this.queue.drainDisabled;\n\t\tthis.queue.drainDisabled = true;\n\t\tfor (let i = 0, n = this.tracks.length; i < n; i++)\n\t\t\tthis.clearTrack(i);\n\t\tthis.tracks.length = 0;\n\t\tthis.queue.drainDisabled = oldDrainDisabled;\n\t\tthis.queue.drain();\n\t}\n\n\t/** Removes all animations from the track, leaving skeletons in their current pose.\n\t *\n\t * It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,\n\t * rather than leaving them in their current pose. */\n\tclearTrack(trackIndex: number) {\n\t\tif (trackIndex >= this.tracks.length) return;\n\t\tlet current = this.tracks[trackIndex];\n\t\tif (!current) return;\n\n\t\tthis.queue.end(current);\n\n\t\tthis.clearNext(current);\n\n\t\tlet entry = current;\n\t\twhile (true) {\n\t\t\tlet from = entry.mixingFrom;\n\t\t\tif (!from) break;\n\t\t\tthis.queue.end(from);\n\t\t\tentry.mixingFrom = null;\n\t\t\tentry.mixingTo = null;\n\t\t\tentry = from;\n\t\t}\n\n\t\tthis.tracks[current.trackIndex] = null;\n\n\t\tthis.queue.drain();\n\t}\n\n\tsetCurrent(index: number, current: TrackEntry, interrupt: boolean) {\n\t\tlet from = this.expandToIndex(index);\n\t\tthis.tracks[index] = current;\n\t\tcurrent.previous = null;\n\n\t\tif (from) {\n\t\t\tif (interrupt) this.queue.interrupt(from);\n\t\t\tcurrent.mixingFrom = from;\n\t\t\tfrom.mixingTo = current;\n\t\t\tcurrent.mixTime = 0;\n\n\t\t\t// Store the interrupted mix percentage.\n\t\t\tif (from.mixingFrom && from.mixDuration > 0)\n\t\t\t\tcurrent.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);\n\n\t\t\tfrom.timelinesRotation.length = 0; // Reset rotation for mixing out, in case entry was mixed in.\n\t\t}\n\n\t\tthis.queue.start(current);\n\t}\n\n\t/** Sets an animation by name.\n\t *\n\t * See {@link #setAnimationWith()}. */\n\tsetAnimation(trackIndex: number, animationName: string, loop: boolean = false) {\n\t\tlet animation = this.data.skeletonData.findAnimation(animationName);\n\t\tif (!animation) throw new Error(\"Animation not found: \" + animationName);\n\t\treturn this.setAnimationWith(trackIndex, animation, loop);\n\t}\n\n\t/** Sets the current animation for a track, discarding any queued animations. If the formerly current track entry was never\n\t * applied to a skeleton, it is replaced (not mixed from).\n\t * @param loop If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its\n\t * duration. In either case {@link TrackEntry#trackEnd} determines when the track is cleared.\n\t * @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept\n\t * after the {@link AnimationStateListener#dispose()} event occurs. */\n\tsetAnimationWith(trackIndex: number, animation: Animation, loop: boolean = false) {\n\t\tif (!animation) throw new Error(\"animation cannot be null.\");\n\t\tlet interrupt = true;\n\t\tlet current = this.expandToIndex(trackIndex);\n\t\tif (current) {\n\t\t\tif (current.nextTrackLast == -1) {\n\t\t\t\t// Don't mix from an entry that was never applied.\n\t\t\t\tthis.tracks[trackIndex] = current.mixingFrom;\n\t\t\t\tthis.queue.interrupt(current);\n\t\t\t\tthis.queue.end(current);\n\t\t\t\tthis.clearNext(current);\n\t\t\t\tcurrent = current.mixingFrom;\n\t\t\t\tinterrupt = false;\n\t\t\t} else\n\t\t\t\tthis.clearNext(current);\n\t\t}\n\t\tlet entry = this.trackEntry(trackIndex, animation, loop, current);\n\t\tthis.setCurrent(trackIndex, entry, interrupt);\n\t\tthis.queue.drain();\n\t\treturn entry;\n\t}\n\n\t/** Queues an animation by name.\n\t *\n\t * See {@link #addAnimationWith()}. */\n\taddAnimation(trackIndex: number, animationName: string, loop: boolean = false, delay: number = 0) {\n\t\tlet animation = this.data.skeletonData.findAnimation(animationName);\n\t\tif (!animation) throw new Error(\"Animation not found: \" + animationName);\n\t\treturn this.addAnimationWith(trackIndex, animation, loop, delay);\n\t}\n\n\t/** Adds an animation to be played after the current or last queued animation for a track. If the track is empty, it is\n\t * equivalent to calling {@link #setAnimationWith()}.\n\t * @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry\n\t * minus any mix duration (from the {@link AnimationStateData}) plus the specified `delay` (ie the mix\n\t * ends at (`delay` = 0) or before (`delay` < 0) the previous track entry duration). If the\n\t * previous entry is looping, its next loop completion is used instead of its duration.\n\t * @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept\n\t * after the {@link AnimationStateListener#dispose()} event occurs. */\n\taddAnimationWith(trackIndex: number, animation: Animation, loop: boolean = false, delay: number = 0) {\n\t\tif (!animation) throw new Error(\"animation cannot be null.\");\n\n\t\tlet last = this.expandToIndex(trackIndex);\n\t\tif (last) {\n\t\t\twhile (last.next)\n\t\t\t\tlast = last.next;\n\t\t}\n\n\t\tlet entry = this.trackEntry(trackIndex, animation, loop, last);\n\n\t\tif (!last) {\n\t\t\tthis.setCurrent(trackIndex, entry, true);\n\t\t\tthis.queue.drain();\n\t\t} else {\n\t\t\tlast.next = entry;\n\t\t\tentry.previous = last;\n\t\t\tif (delay <= 0) delay += last.getTrackComplete() - entry.mixDuration;\n\t\t}\n\n\t\tentry.delay = delay;\n\t\treturn entry;\n\t}\n\n\t/** Sets an empty animation for a track, discarding any queued animations, and sets the track entry's\n\t * {@link TrackEntry#mixduration}. An empty animation has no timelines and serves as a placeholder for mixing in or out.\n\t *\n\t * Mixing out is done by setting an empty animation with a mix duration using either {@link #setEmptyAnimation()},\n\t * {@link #setEmptyAnimations()}, or {@link #addEmptyAnimation()}. Mixing to an empty animation causes\n\t * the previous animation to be applied less and less over the mix duration. Properties keyed in the previous animation\n\t * transition to the value from lower tracks or to the setup pose value if no lower tracks key the property. A mix duration of\n\t * 0 still mixes out over one frame.\n\t *\n\t * Mixing in is done by first setting an empty animation, then adding an animation using\n\t * {@link #addAnimation()} and on the returned track entry, set the\n\t * {@link TrackEntry#setMixDuration()}. Mixing from an empty animation causes the new animation to be applied more and\n\t * more over the mix duration. Properties keyed in the new animation transition from the value from lower tracks or from the\n\t * setup pose value if no lower tracks key the property to the value keyed in the new animation. */\n\tsetEmptyAnimation(trackIndex: number, mixDuration: number = 0) {\n\t\tlet entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation(), false);\n\t\tentry.mixDuration = mixDuration;\n\t\tentry.trackEnd = mixDuration;\n\t\treturn entry;\n\t}\n\n\t/** Adds an empty animation to be played after the current or last queued animation for a track, and sets the track entry's\n\t * {@link TrackEntry#mixDuration}. If the track is empty, it is equivalent to calling\n\t * {@link #setEmptyAnimation()}.\n\t *\n\t * See {@link #setEmptyAnimation()}.\n\t * @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry\n\t * minus any mix duration plus the specified `delay` (ie the mix ends at (`delay` = 0) or\n\t * before (`delay` < 0) the previous track entry duration). If the previous entry is looping, its next\n\t * loop completion is used instead of its duration.\n\t * @return A track entry to allow further customization of animation playback. References to the track entry must not be kept\n\t * after the {@link AnimationStateListener#dispose()} event occurs. */\n\taddEmptyAnimation(trackIndex: number, mixDuration: number = 0, delay: number = 0) {\n\t\tlet entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation(), false, delay);\n\t\tif (delay <= 0) entry.delay += entry.mixDuration - mixDuration;\n\t\tentry.mixDuration = mixDuration;\n\t\tentry.trackEnd = mixDuration;\n\t\treturn entry;\n\t}\n\n\t/** Sets an empty animation for every track, discarding any queued animations, and mixes to it over the specified mix\n\t * duration. */\n\tsetEmptyAnimations(mixDuration: number = 0) {\n\t\tlet oldDrainDisabled = this.queue.drainDisabled;\n\t\tthis.queue.drainDisabled = true;\n\t\tfor (let i = 0, n = this.tracks.length; i < n; i++) {\n\t\t\tlet current = this.tracks[i];\n\t\t\tif (current) this.setEmptyAnimation(current.trackIndex, mixDuration);\n\t\t}\n\t\tthis.queue.drainDisabled = oldDrainDisabled;\n\t\tthis.queue.drain();\n\t}\n\n\texpandToIndex(index: number) {\n\t\tif (index < this.tracks.length) return this.tracks[index];\n\t\tUtils.ensureArrayCapacity(this.tracks, index + 1, null);\n\t\tthis.tracks.length = index + 1;\n\t\treturn null;\n\t}\n\n\t/** @param last May be null. */\n\ttrackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry) {\n\t\tlet entry = this.trackEntryPool.obtain();\n\t\tentry.trackIndex = trackIndex;\n\t\tentry.animation = animation;\n\t\tentry.loop = loop;\n\t\tentry.holdPrevious = false;\n\n\t\tentry.eventThreshold = 0;\n\t\tentry.attachmentThreshold = 0;\n\t\tentry.drawOrderThreshold = 0;\n\n\t\tentry.animationStart = 0;\n\t\tentry.animationEnd = animation.duration;\n\t\tentry.animationLast = -1;\n\t\tentry.nextAnimationLast = -1;\n\n\t\tentry.delay = 0;\n\t\tentry.trackTime = 0;\n\t\tentry.trackLast = -1;\n\t\tentry.nextTrackLast = -1;\n\t\tentry.trackEnd = Number.MAX_VALUE;\n\t\tentry.timeScale = 1;\n\n\t\tentry.alpha = 1;\n\t\tentry.interruptAlpha = 1;\n\t\tentry.mixTime = 0;\n\t\tentry.mixDuration = !last ? 0 : this.data.getMix(last.animation, animation);\n\t\tentry.mixBlend = MixBlend.replace;\n\t\treturn entry;\n\t}\n\n\t/** Removes the {@link TrackEntry#getNext() next entry} and all entries after it for the specified entry. */\n\tclearNext(entry: TrackEntry) {\n\t\tlet next = entry.next;\n\t\twhile (next) {\n\t\t\tthis.queue.dispose(next);\n\t\t\tnext = next.next;\n\t\t}\n\t\tentry.next = null;\n\t}\n\n\t_animationsChanged() {\n\t\tthis.animationsChanged = false;\n\n\t\tthis.propertyIDs.clear();\n\t\tlet tracks = this.tracks;\n\t\tfor (let i = 0, n = tracks.length; i < n; i++) {\n\t\t\tlet entry = tracks[i];\n\t\t\tif (!entry) continue;\n\t\t\twhile (entry.mixingFrom)\n\t\t\t\tentry = entry.mixingFrom;\n\t\t\tdo {\n\t\t\t\tif (!entry.mixingTo || entry.mixBlend != MixBlend.add) this.computeHold(entry);\n\t\t\t\tentry = entry.mixingTo;\n\t\t\t} while (entry);\n\t\t}\n\t}\n\n\tcomputeHold(entry: TrackEntry) {\n\t\tlet to = entry.mixingTo;\n\t\tlet timelines = entry.animation.timelines;\n\t\tlet timelinesCount = entry.animation.timelines.length;\n\t\tlet timelineMode = entry.timelineMode;\n\t\ttimelineMode.length = timelinesCount;\n\t\tlet timelineHoldMix = entry.timelineHoldMix;\n\t\ttimelineHoldMix.length = 0;\n\t\tlet propertyIDs = this.propertyIDs;\n\n\t\tif (to && to.holdPrevious) {\n\t\t\tfor (let i = 0; i < timelinesCount; i++)\n\t\t\t\ttimelineMode[i] = propertyIDs.addAll(timelines[i].getPropertyIds()) ? HOLD_FIRST : HOLD_SUBSEQUENT;\n\t\t\treturn;\n\t\t}\n\n\t\touter:\n\t\tfor (let i = 0; i < timelinesCount; i++) {\n\t\t\tlet timeline = timelines[i];\n\t\t\tlet ids = timeline.getPropertyIds();\n\t\t\tif (!propertyIDs.addAll(ids))\n\t\t\t\ttimelineMode[i] = SUBSEQUENT;\n\t\t\telse if (!to || timeline instanceof AttachmentTimeline || timeline instanceof DrawOrderTimeline\n\t\t\t\t|| timeline instanceof EventTimeline || !to.animation.hasTimeline(ids)) {\n\t\t\t\ttimelineMode[i] = FIRST;\n\t\t\t} else {\n\t\t\t\tfor (let next = to.mixingTo; next; next = next.mixingTo) {\n\t\t\t\t\tif (next.animation.hasTimeline(ids)) continue;\n\t\t\t\t\tif (entry.mixDuration > 0) {\n\t\t\t\t\t\ttimelineMode[i] = HOLD_MIX;\n\t\t\t\t\t\ttimelineHoldMix[i] = next;\n\t\t\t\t\t\tcontinue outer;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ttimelineMode[i] = HOLD_FIRST;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Returns the track entry for the animation currently playing on the track, or null if no animation is currently playing. */\n\tgetCurrent(trackIndex: number) {\n\t\tif (trackIndex >= this.tracks.length) return null;\n\t\treturn this.tracks[trackIndex];\n\t}\n\n\t/** Adds a listener to receive events for all track entries. */\n\taddListener(listener: AnimationStateListener) {\n\t\tif (!listener) throw new Error(\"listener cannot be null.\");\n\t\tthis.listeners.push(listener);\n\t}\n\n\t/** Removes the listener added with {@link #addListener()}. */\n\tremoveListener(listener: AnimationStateListener) {\n\t\tlet index = this.listeners.indexOf(listener);\n\t\tif (index >= 0) this.listeners.splice(index, 1);\n\t}\n\n\t/** Removes all listeners added with {@link #addListener()}. */\n\tclearListeners() {\n\t\tthis.listeners.length = 0;\n\t}\n\n\t/** Discards all listener notifications that have not yet been delivered. This can be useful to call from an\n\t * {@link AnimationStateListener} when it is known that further notifications that may have been already queued for delivery\n\t * are not wanted because new animations are being set. */\n\tclearListenerNotifications() {\n\t\tthis.queue.clear();\n\t}\n}\n\n/** Stores settings and other state for the playback of an animation on an {@link AnimationState} track.\n *\n * References to a track entry must not be kept after the {@link AnimationStateListener#dispose()} event occurs. */\nexport class TrackEntry {\n\t/** The animation to apply for this track entry. */\n\tanimation: Animation;\n\n\tprevious: TrackEntry;\n\n\t/** The animation queued to start after this animation, or null. `next` makes up a linked list. */\n\tnext: TrackEntry;\n\n\t/** The track entry for the previous animation when mixing from the previous animation to this animation, or null if no\n\t * mixing is currently occuring. When mixing from multiple animations, `mixingFrom` makes up a linked list. */\n\tmixingFrom: TrackEntry;\n\n\t/** The track entry for the next animation when mixing from this animation to the next animation, or null if no mixing is\n\t * currently occuring. When mixing to multiple animations, `mixingTo` makes up a linked list. */\n\tmixingTo: TrackEntry;\n\n\t/** The listener for events generated by this track entry, or null.\n\t *\n\t * A track entry returned from {@link AnimationState#setAnimation()} is already the current animation\n\t * for the track, so the track entry listener {@link AnimationStateListener#start()} will not be called. */\n\tlistener: AnimationStateListener;\n\n\t/** The index of the track where this track entry is either current or queued.\n\t *\n\t * See {@link AnimationState#getCurrent()}. */\n\ttrackIndex: number;\n\n\t/** If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its\n\t * duration. */\n\tloop: boolean;\n\n\t/** If true, when mixing from the previous animation to this animation, the previous animation is applied as normal instead\n\t * of being mixed out.\n\t *\n\t * When mixing between animations that key the same property, if a lower track also keys that property then the value will\n\t * briefly dip toward the lower track value during the mix. This happens because the first animation mixes from 100% to 0%\n\t * while the second animation mixes from 0% to 100%. Setting `holdPrevious` to true applies the first animation\n\t * at 100% during the mix so the lower track value is overwritten. Such dipping does not occur on the lowest track which\n\t * keys the property, only when a higher track also keys the property.\n\t *\n\t * Snapping will occur if `holdPrevious` is true and this animation does not key all the same properties as the\n\t * previous animation. */\n\tholdPrevious: boolean;\n\n\treverse: boolean;\n\n\t/** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the\n\t * `eventThreshold`, event timelines are applied while this animation is being mixed out. Defaults to 0, so event\n\t * timelines are not applied while this animation is being mixed out. */\n\teventThreshold: number;\n\n\t/** When the mix percentage ({@link #mixtime} / {@link #mixDuration}) is less than the\n\t * `attachmentThreshold`, attachment timelines are applied while this animation is being mixed out. Defaults to\n\t * 0, so attachment timelines are not applied while this animation is being mixed out. */\n\tattachmentThreshold: number;\n\n\t/** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the\n\t * `drawOrderThreshold`, draw order timelines are applied while this animation is being mixed out. Defaults to 0,\n\t * so draw order timelines are not applied while this animation is being mixed out. */\n\tdrawOrderThreshold: number;\n\n\t/** Seconds when this animation starts, both initially and after looping. Defaults to 0.\n\t *\n\t * When changing the `animationStart` time, it often makes sense to set {@link #animationLast} to the same\n\t * value to prevent timeline keys before the start time from triggering. */\n\tanimationStart: number;\n\n\t/** Seconds for the last frame of this animation. Non-looping animations won't play past this time. Looping animations will\n\t * loop back to {@link #animationStart} at this time. Defaults to the animation {@link Animation#duration}. */\n\tanimationEnd: number;\n\n\n\t/** The time in seconds this animation was last applied. Some timelines use this for one-time triggers. Eg, when this\n\t * animation is applied, event timelines will fire all events between the `animationLast` time (exclusive) and\n\t * `animationTime` (inclusive). Defaults to -1 to ensure triggers on frame 0 happen the first time this animation\n\t * is applied. */\n\tanimationLast: number;\n\n\tnextAnimationLast: number;\n\n\t/** Seconds to postpone playing the animation. When this track entry is the current track entry, `delay`\n\t * postpones incrementing the {@link #trackTime}. When this track entry is queued, `delay` is the time from\n\t * the start of the previous animation to when this track entry will become the current track entry (ie when the previous\n\t * track entry {@link TrackEntry#trackTime} >= this track entry's `delay`).\n\t *\n\t * {@link #timeScale} affects the delay. */\n\tdelay: number;\n\n\t/** Current time in seconds this track entry has been the current track entry. The track time determines\n\t * {@link #animationTime}. The track time can be set to start the animation at a time other than 0, without affecting\n\t * looping. */\n\ttrackTime: number;\n\n\ttrackLast: number; nextTrackLast: number;\n\n\t/** The track time in seconds when this animation will be removed from the track. Defaults to the highest possible float\n\t * value, meaning the animation will be applied until a new animation is set or the track is cleared. If the track end time\n\t * is reached, no other animations are queued for playback, and mixing from any previous animations is complete, then the\n\t * properties keyed by the animation are set to the setup pose and the track is cleared.\n\t *\n\t * It may be desired to use {@link AnimationState#addEmptyAnimation()} rather than have the animation\n\t * abruptly cease being applied. */\n\ttrackEnd: number;\n\n\t/** Multiplier for the delta time when this track entry is updated, causing time for this animation to pass slower or\n\t * faster. Defaults to 1.\n\t *\n\t * {@link #mixTime} is not affected by track entry time scale, so {@link #mixDuration} may need to be adjusted to\n\t * match the animation speed.\n\t *\n\t * When using {@link AnimationState#addAnimation()} with a `delay` <= 0, note the\n\t * {@link #delay} is set using the mix duration from the {@link AnimationStateData}, assuming time scale to be 1. If\n\t * the time scale is not 1, the delay may need to be adjusted.\n\t *\n\t * See AnimationState {@link AnimationState#timeScale} for affecting all animations. */\n\ttimeScale: number;\n\n\t/** Values < 1 mix this animation with the skeleton's current pose (usually the pose resulting from lower tracks). Defaults\n\t * to 1, which overwrites the skeleton's current pose with this animation.\n\t *\n\t * Typically track 0 is used to completely pose the skeleton, then alpha is used on higher tracks. It doesn't make sense to\n\t * use alpha on track 0 if the skeleton pose is from the last frame render. */\n\talpha: number;\n\n\t/** Seconds from 0 to the {@link #getMixDuration()} when mixing from the previous animation to this animation. May be\n\t * slightly more than `mixDuration` when the mix is complete. */\n\tmixTime: number;\n\n\t/** Seconds for mixing from the previous animation to this animation. Defaults to the value provided by AnimationStateData\n\t * {@link AnimationStateData#getMix()} based on the animation before this animation (if any).\n\t *\n\t * A mix duration of 0 still mixes out over one frame to provide the track entry being mixed out a chance to revert the\n\t * properties it was animating.\n\t *\n\t * The `mixDuration` can be set manually rather than use the value from\n\t * {@link AnimationStateData#getMix()}. In that case, the `mixDuration` can be set for a new\n\t * track entry only before {@link AnimationState#update(float)} is first called.\n\t *\n\t * When using {@link AnimationState#addAnimation()} with a `delay` <= 0, note the\n\t * {@link #delay} is set using the mix duration from the {@link AnimationStateData}, not a mix duration set\n\t * afterward. */\n\tmixDuration: number; interruptAlpha: number; totalAlpha: number;\n\n\t/** Controls how properties keyed in the animation are mixed with lower tracks. Defaults to {@link MixBlend#replace}, which\n\t * replaces the values from the lower tracks with the animation values. {@link MixBlend#add} adds the animation values to\n\t * the values from the lower tracks.\n\t *\n\t * The `mixBlend` can be set for a new track entry only before {@link AnimationState#apply()} is first\n\t * called. */\n\tmixBlend = MixBlend.replace;\n\ttimelineMode = new Array();\n\ttimelineHoldMix = new Array();\n\ttimelinesRotation = new Array();\n\n\treset() {\n\t\tthis.next = null;\n\t\tthis.previous = null;\n\t\tthis.mixingFrom = null;\n\t\tthis.mixingTo = null;\n\t\tthis.animation = null;\n\t\tthis.listener = null;\n\t\tthis.timelineMode.length = 0;\n\t\tthis.timelineHoldMix.length = 0;\n\t\tthis.timelinesRotation.length = 0;\n\t}\n\n\t/** Uses {@link #trackTime} to compute the `animationTime`, which is between {@link #animationStart}\n\t * and {@link #animationEnd}. When the `trackTime` is 0, the `animationTime` is equal to the\n\t * `animationStart` time. */\n\tgetAnimationTime() {\n\t\tif (this.loop) {\n\t\t\tlet duration = this.animationEnd - this.animationStart;\n\t\t\tif (duration == 0) return this.animationStart;\n\t\t\treturn (this.trackTime % duration) + this.animationStart;\n\t\t}\n\t\treturn Math.min(this.trackTime + this.animationStart, this.animationEnd);\n\t}\n\n\tsetAnimationLast(animationLast: number) {\n\t\tthis.animationLast = animationLast;\n\t\tthis.nextAnimationLast = animationLast;\n\t}\n\n\t/** Returns true if at least one loop has been completed.\n\t *\n\t * See {@link AnimationStateListener#complete()}. */\n\tisComplete() {\n\t\treturn this.trackTime >= this.animationEnd - this.animationStart;\n\t}\n\n\t/** Resets the rotation directions for mixing this entry's rotate timelines. This can be useful to avoid bones rotating the\n\t * long way around when using {@link #alpha} and starting animations on other tracks.\n\t *\n\t * Mixing with {@link MixBlend#replace} involves finding a rotation between two others, which has two possible solutions:\n\t * the short way or the long way around. The two rotations likely change over time, so which direction is the short or long\n\t * way also changes. If the short way was always chosen, bones would flip to the other side when that direction became the\n\t * long way. TrackEntry chooses the short way the first time it is applied and remembers that direction. */\n\tresetRotationDirections() {\n\t\tthis.timelinesRotation.length = 0;\n\t}\n\n\tgetTrackComplete() {\n\t\tlet duration = this.animationEnd - this.animationStart;\n\t\tif (duration != 0) {\n\t\t\tif (this.loop) return duration * (1 + ((this.trackTime / duration) | 0)); // Completion of next loop.\n\t\t\tif (this.trackTime < duration) return duration; // Before duration.\n\t\t}\n\t\treturn this.trackTime; // Next update.\n\t}\n}\n\nexport class EventQueue {\n\tobjects: Array = [];\n\tdrainDisabled = false;\n\tanimState: AnimationState;\n\n\tconstructor(animState: AnimationState) {\n\t\tthis.animState = animState;\n\t}\n\n\tstart(entry: TrackEntry) {\n\t\tthis.objects.push(EventType.start);\n\t\tthis.objects.push(entry);\n\t\tthis.animState.animationsChanged = true;\n\t}\n\n\tinterrupt(entry: TrackEntry) {\n\t\tthis.objects.push(EventType.interrupt);\n\t\tthis.objects.push(entry);\n\t}\n\n\tend(entry: TrackEntry) {\n\t\tthis.objects.push(EventType.end);\n\t\tthis.objects.push(entry);\n\t\tthis.animState.animationsChanged = true;\n\t}\n\n\tdispose(entry: TrackEntry) {\n\t\tthis.objects.push(EventType.dispose);\n\t\tthis.objects.push(entry);\n\t}\n\n\tcomplete(entry: TrackEntry) {\n\t\tthis.objects.push(EventType.complete);\n\t\tthis.objects.push(entry);\n\t}\n\n\tevent(entry: TrackEntry, event: Event) {\n\t\tthis.objects.push(EventType.event);\n\t\tthis.objects.push(entry);\n\t\tthis.objects.push(event);\n\t}\n\n\tdrain() {\n\t\tif (this.drainDisabled) return;\n\t\tthis.drainDisabled = true;\n\n\t\tlet objects = this.objects;\n\t\tlet listeners = this.animState.listeners;\n\n\t\tfor (let i = 0; i < objects.length; i += 2) {\n\t\t\tlet type = objects[i] as EventType;\n\t\t\tlet entry = objects[i + 1] as TrackEntry;\n\t\t\tswitch (type) {\n\t\t\t\tcase EventType.start:\n\t\t\t\t\tif (entry.listener && entry.listener.start) entry.listener.start(entry);\n\t\t\t\t\tfor (let ii = 0; ii < listeners.length; ii++)\n\t\t\t\t\t\tif (listeners[ii].start) listeners[ii].start(entry);\n\t\t\t\t\tbreak;\n\t\t\t\tcase EventType.interrupt:\n\t\t\t\t\tif (entry.listener && entry.listener.interrupt) entry.listener.interrupt(entry);\n\t\t\t\t\tfor (let ii = 0; ii < listeners.length; ii++)\n\t\t\t\t\t\tif (listeners[ii].interrupt) listeners[ii].interrupt(entry);\n\t\t\t\t\tbreak;\n\t\t\t\tcase EventType.end:\n\t\t\t\t\tif (entry.listener && entry.listener.end) entry.listener.end(entry);\n\t\t\t\t\tfor (let ii = 0; ii < listeners.length; ii++)\n\t\t\t\t\t\tif (listeners[ii].end) listeners[ii].end(entry);\n\t\t\t\t// Fall through.\n\t\t\t\tcase EventType.dispose:\n\t\t\t\t\tif (entry.listener && entry.listener.dispose) entry.listener.dispose(entry);\n\t\t\t\t\tfor (let ii = 0; ii < listeners.length; ii++)\n\t\t\t\t\t\tif (listeners[ii].dispose) listeners[ii].dispose(entry);\n\t\t\t\t\tthis.animState.trackEntryPool.free(entry);\n\t\t\t\t\tbreak;\n\t\t\t\tcase EventType.complete:\n\t\t\t\t\tif (entry.listener && entry.listener.complete) entry.listener.complete(entry);\n\t\t\t\t\tfor (let ii = 0; ii < listeners.length; ii++)\n\t\t\t\t\t\tif (listeners[ii].complete) listeners[ii].complete(entry);\n\t\t\t\t\tbreak;\n\t\t\t\tcase EventType.event:\n\t\t\t\t\tlet event = objects[i++ + 2] as Event;\n\t\t\t\t\tif (entry.listener && entry.listener.event) entry.listener.event(entry, event);\n\t\t\t\t\tfor (let ii = 0; ii < listeners.length; ii++)\n\t\t\t\t\t\tif (listeners[ii].event) listeners[ii].event(entry, event);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.clear();\n\n\t\tthis.drainDisabled = false;\n\t}\n\n\tclear() {\n\t\tthis.objects.length = 0;\n\t}\n}\n\nexport enum EventType {\n\tstart, interrupt, end, dispose, complete, event\n}\n\n/** The interface to implement for receiving TrackEntry events. It is always safe to call AnimationState methods when receiving\n * events.\n *\n * See TrackEntry {@link TrackEntry#listener} and AnimationState\n * {@link AnimationState#addListener()}. */\nexport interface AnimationStateListener {\n\t/** Invoked when this entry has been set as the current entry. */\n\tstart(entry: TrackEntry): void;\n\n\t/** Invoked when another entry has replaced this entry as the current entry. This entry may continue being applied for\n\t * mixing. */\n\tinterrupt(entry: TrackEntry): void;\n\n\t/** Invoked when this entry is no longer the current entry and will never be applied again. */\n\tend(entry: TrackEntry): void;\n\n\t/** Invoked when this entry will be disposed. This may occur without the entry ever being set as the current entry.\n\t * References to the entry should not be kept after dispose is called, as it may be destroyed or reused. */\n\tdispose(entry: TrackEntry): void;\n\n\t/** Invoked every time this entry's animation completes a loop. */\n\tcomplete(entry: TrackEntry): void;\n\n\t/** Invoked when this entry's animation triggers an event. */\n\tevent(entry: TrackEntry, event: Event): void;\n}\n\nexport abstract class AnimationStateAdapter implements AnimationStateListener {\n\tstart(entry: TrackEntry) {\n\t}\n\n\tinterrupt(entry: TrackEntry) {\n\t}\n\n\tend(entry: TrackEntry) {\n\t}\n\n\tdispose(entry: TrackEntry) {\n\t}\n\n\tcomplete(entry: TrackEntry) {\n\t}\n\n\tevent(entry: TrackEntry, event: Event) {\n\t}\n}\n\n/** 1. A previously applied timeline has set this property.\n *\n * Result: Mix from the current pose to the timeline pose. */\nexport const SUBSEQUENT = 0;\n/** 1. This is the first timeline to set this property.\n * 2. The next track entry applied after this one does not have a timeline to set this property.\n *\n * Result: Mix from the setup pose to the timeline pose. */\nexport const FIRST = 1;\n/** 1) A previously applied timeline has set this property.
\n * 2) The next track entry to be applied does have a timeline to set this property.
\n * 3) The next track entry after that one does not have a timeline to set this property.
\n * Result: Mix from the current pose to the timeline pose, but do not mix out. This avoids \"dipping\" when crossfading\n * animations that key the same property. A subsequent timeline will set this property using a mix. */\nexport const HOLD_SUBSEQUENT = 2;\n/** 1) This is the first timeline to set this property.
\n * 2) The next track entry to be applied does have a timeline to set this property.
\n * 3) The next track entry after that one does not have a timeline to set this property.
\n * Result: Mix from the setup pose to the timeline pose, but do not mix out. This avoids \"dipping\" when crossfading animations\n * that key the same property. A subsequent timeline will set this property using a mix. */\nexport const HOLD_FIRST = 3;\n/** 1. This is the first timeline to set this property.\n * 2. The next track entry to be applied does have a timeline to set this property.\n * 3. The next track entry after that one does have a timeline to set this property.\n * 4. timelineHoldMix stores the first subsequent track entry that does not have a timeline to set this property.\n *\n * Result: The same as HOLD except the mix percentage from the timelineHoldMix track entry is used. This handles when more than\n * 2 track entries in a row have a timeline that sets the same property.\n *\n * Eg, A -> B -> C -> D where A, B, and C have a timeline setting same property, but D does not. When A is applied, to avoid\n * \"dipping\" A is not mixed out, however D (the first entry that doesn't set the property) mixing in is used to mix out A\n * (which affects B and C). Without using D to mix out, A would be applied fully until mixing completes, then snap into\n * place. */\nexport const HOLD_MIX = 4;\n\nexport const SETUP = 1;\nexport const CURRENT = 2;\n\nlet _emptyAnimation: Animation = null;\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Animation } from \"./Animation\";\nimport { SkeletonData } from \"./SkeletonData\";\nimport { StringMap } from \"./Utils\";\n\n\n/** Stores mix (crossfade) durations to be applied when {@link AnimationState} animations are changed. */\nexport class AnimationStateData {\n\t/** The SkeletonData to look up animations when they are specified by name. */\n\tskeletonData: SkeletonData;\n\n\tanimationToMixTime: StringMap = {};\n\n\t/** The mix duration to use when no mix duration has been defined between two animations. */\n\tdefaultMix = 0;\n\n\tconstructor(skeletonData: SkeletonData) {\n\t\tif (!skeletonData) throw new Error(\"skeletonData cannot be null.\");\n\t\tthis.skeletonData = skeletonData;\n\t}\n\n\t/** Sets a mix duration by animation name.\n\t *\n\t * See {@link #setMixWith()}. */\n\tsetMix(fromName: string, toName: string, duration: number) {\n\t\tlet from = this.skeletonData.findAnimation(fromName);\n\t\tif (!from) throw new Error(\"Animation not found: \" + fromName);\n\t\tlet to = this.skeletonData.findAnimation(toName);\n\t\tif (!to) throw new Error(\"Animation not found: \" + toName);\n\t\tthis.setMixWith(from, to, duration);\n\t}\n\n\t/** Sets the mix duration when changing from the specified animation to the other.\n\t *\n\t * See {@link TrackEntry#mixDuration}. */\n\tsetMixWith(from: Animation, to: Animation, duration: number) {\n\t\tif (!from) throw new Error(\"from cannot be null.\");\n\t\tif (!to) throw new Error(\"to cannot be null.\");\n\t\tlet key = from.name + \".\" + to.name;\n\t\tthis.animationToMixTime[key] = duration;\n\t}\n\n\t/** Returns the mix duration to use when changing from the specified animation to the other, or the {@link #defaultMix} if\n\t * no mix duration has been set. */\n\tgetMix(from: Animation, to: Animation) {\n\t\tlet key = from.name + \".\" + to.name;\n\t\tlet value = this.animationToMixTime[key];\n\t\treturn value === undefined ? this.defaultMix : value;\n\t}\n}", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Color } from \"../Utils\";\nimport { VertexAttachment, Attachment } from \"./Attachment\";\n\n/** An attachment with vertices that make up a polygon. Can be used for hit detection, creating physics bodies, spawning particle\n * effects, and more.\n *\n * See {@link SkeletonBounds} and [Bounding Boxes](http://esotericsoftware.com/spine-bounding-boxes) in the Spine User\n * Guide. */\nexport class BoundingBoxAttachment extends VertexAttachment {\n\tcolor = new Color(1, 1, 1, 1);\n\n\tconstructor(name: string) {\n\t\tsuper(name);\n\t}\n\n\tcopy(): Attachment {\n\t\tlet copy = new BoundingBoxAttachment(this.name);\n\t\tthis.copyTo(copy);\n\t\tcopy.color.setFromColor(this.color);\n\t\treturn copy;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { SlotData } from \"../SlotData\";\nimport { Color } from \"../Utils\";\nimport { VertexAttachment, Attachment } from \"./Attachment\";\n\n/** An attachment with vertices that make up a polygon used for clipping the rendering of other attachments. */\nexport class ClippingAttachment extends VertexAttachment {\n\t/** Clipping is performed between the clipping polygon's slot and the end slot. Returns null if clipping is done until the end of\n\t * the skeleton's rendering. */\n\tendSlot: SlotData;\n\n\t// Nonessential.\n\t/** The color of the clipping polygon as it was in Spine. Available only when nonessential data was exported. Clipping polygons\n\t * are not usually rendered at runtime. */\n\tcolor = new Color(0.2275, 0.2275, 0.8078, 1); // ce3a3aff\n\n\tconstructor(name: string) {\n\t\tsuper(name);\n\t}\n\n\tcopy(): Attachment {\n\t\tlet copy = new ClippingAttachment(this.name);\n\t\tthis.copyTo(copy);\n\t\tcopy.endSlot = this.endSlot;\n\t\tcopy.color.setFromColor(this.color);\n\t\treturn copy;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nexport abstract class Texture {\n\tprotected _image: HTMLImageElement | ImageBitmap;\n\n\tconstructor(image: HTMLImageElement | ImageBitmap) {\n\t\tthis._image = image;\n\t}\n\n\tgetImage(): HTMLImageElement | ImageBitmap {\n\t\treturn this._image;\n\t}\n\n\tabstract setFilters(minFilter: TextureFilter, magFilter: TextureFilter): void;\n\tabstract setWraps(uWrap: TextureWrap, vWrap: TextureWrap): void;\n\tabstract dispose(): void;\n}\n\nexport enum TextureFilter {\n\tNearest = 9728, // WebGLRenderingContext.NEAREST\n\tLinear = 9729, // WebGLRenderingContext.LINEAR\n\tMipMap = 9987, // WebGLRenderingContext.LINEAR_MIPMAP_LINEAR\n\tMipMapNearestNearest = 9984, // WebGLRenderingContext.NEAREST_MIPMAP_NEAREST\n\tMipMapLinearNearest = 9985, // WebGLRenderingContext.LINEAR_MIPMAP_NEAREST\n\tMipMapNearestLinear = 9986, // WebGLRenderingContext.NEAREST_MIPMAP_LINEAR\n\tMipMapLinearLinear = 9987 // WebGLRenderingContext.LINEAR_MIPMAP_LINEAR\n}\n\nexport enum TextureWrap {\n\tMirroredRepeat = 33648, // WebGLRenderingContext.MIRRORED_REPEAT\n\tClampToEdge = 33071, // WebGLRenderingContext.CLAMP_TO_EDGE\n\tRepeat = 10497 // WebGLRenderingContext.REPEAT\n}\n\nexport class TextureRegion {\n\trenderObject: any;\n\tu = 0; v = 0;\n\tu2 = 0; v2 = 0;\n\twidth = 0; height = 0;\n\tdegrees = 0;\n\toffsetX = 0; offsetY = 0;\n\toriginalWidth = 0; originalHeight = 0;\n}\n\nexport class FakeTexture extends Texture {\n\tsetFilters(minFilter: TextureFilter, magFilter: TextureFilter) { }\n\tsetWraps(uWrap: TextureWrap, vWrap: TextureWrap) { }\n\tdispose() { }\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { AssetManagerBase } from \"./AssetManagerBase\";\nimport { TextureFilter, TextureWrap, Texture, TextureRegion } from \"./Texture\";\nimport { Disposable, Utils, StringMap } from \"./Utils\";\n\nexport class TextureAtlas implements Disposable {\n\tpages = new Array();\n\tregions = new Array();\n\n\tconstructor(atlasText: string) {\n\t\tlet reader = new TextureAtlasReader(atlasText);\n\t\tlet entry = new Array(4);\n\t\tlet page: TextureAtlasPage = null;\n\t\tlet region: TextureAtlasRegion = null;\n\n\t\tlet pageFields: StringMap = {};\n\t\tpageFields[\"size\"] = () => {\n\t\t\tpage.width = parseInt(entry[1]);\n\t\t\tpage.height = parseInt(entry[2]);\n\t\t};\n\t\tpageFields[\"format\"] = () => {\n\t\t\t// page.format = Format[tuple[0]]; we don't need format in WebGL\n\t\t};\n\t\tpageFields[\"filter\"] = () => {\n\t\t\tpage.minFilter = Utils.enumValue(TextureFilter, entry[1]);\n\t\t\tpage.magFilter = Utils.enumValue(TextureFilter, entry[2]);\n\t\t};\n\t\tpageFields[\"repeat\"] = () => {\n\t\t\tif (entry[1].indexOf('x') != -1) page.uWrap = TextureWrap.Repeat;\n\t\t\tif (entry[1].indexOf('y') != -1) page.vWrap = TextureWrap.Repeat;\n\t\t};\n\t\tpageFields[\"pma\"] = () => {\n\t\t\tpage.pma = entry[1] == \"true\";\n\t\t};\n\n\t\tvar regionFields: StringMap = {};\n\t\tregionFields[\"xy\"] = () => { // Deprecated, use bounds.\n\t\t\tregion.x = parseInt(entry[1]);\n\t\t\tregion.y = parseInt(entry[2]);\n\t\t};\n\t\tregionFields[\"size\"] = () => { // Deprecated, use bounds.\n\t\t\tregion.width = parseInt(entry[1]);\n\t\t\tregion.height = parseInt(entry[2]);\n\t\t};\n\t\tregionFields[\"bounds\"] = () => {\n\t\t\tregion.x = parseInt(entry[1]);\n\t\t\tregion.y = parseInt(entry[2]);\n\t\t\tregion.width = parseInt(entry[3]);\n\t\t\tregion.height = parseInt(entry[4]);\n\t\t};\n\t\tregionFields[\"offset\"] = () => { // Deprecated, use offsets.\n\t\t\tregion.offsetX = parseInt(entry[1]);\n\t\t\tregion.offsetY = parseInt(entry[2]);\n\t\t};\n\t\tregionFields[\"orig\"] = () => { // Deprecated, use offsets.\n\t\t\tregion.originalWidth = parseInt(entry[1]);\n\t\t\tregion.originalHeight = parseInt(entry[2]);\n\t\t};\n\t\tregionFields[\"offsets\"] = () => {\n\t\t\tregion.offsetX = parseInt(entry[1]);\n\t\t\tregion.offsetY = parseInt(entry[2]);\n\t\t\tregion.originalWidth = parseInt(entry[3]);\n\t\t\tregion.originalHeight = parseInt(entry[4]);\n\t\t};\n\t\tregionFields[\"rotate\"] = () => {\n\t\t\tlet value = entry[1];\n\t\t\tif (value == \"true\")\n\t\t\t\tregion.degrees = 90;\n\t\t\telse if (value != \"false\")\n\t\t\t\tregion.degrees = parseInt(value);\n\t\t};\n\t\tregionFields[\"index\"] = () => {\n\t\t\tregion.index = parseInt(entry[1]);\n\t\t};\n\n\t\tlet line = reader.readLine();\n\t\t// Ignore empty lines before first entry.\n\t\twhile (line && line.trim().length == 0)\n\t\t\tline = reader.readLine();\n\t\t// Header entries.\n\t\twhile (true) {\n\t\t\tif (!line || line.trim().length == 0) break;\n\t\t\tif (reader.readEntry(entry, line) == 0) break; // Silently ignore all header fields.\n\t\t\tline = reader.readLine();\n\t\t}\n\n\t\t// Page and region entries.\n\t\tlet names: string[] = null;\n\t\tlet values: number[][] = null;\n\t\twhile (true) {\n\t\t\tif (line === null) break;\n\t\t\tif (line.trim().length == 0) {\n\t\t\t\tpage = null;\n\t\t\t\tline = reader.readLine();\n\t\t\t} else if (!page) {\n\t\t\t\tpage = new TextureAtlasPage();\n\t\t\t\tpage.name = line.trim();\n\t\t\t\twhile (true) {\n\t\t\t\t\tif (reader.readEntry(entry, line = reader.readLine()) == 0) break;\n\t\t\t\t\tlet field: Function = pageFields[entry[0]];\n\t\t\t\t\tif (field) field();\n\t\t\t\t}\n\t\t\t\tthis.pages.push(page);\n\t\t\t} else {\n\t\t\t\tregion = new TextureAtlasRegion();\n\n\t\t\t\tregion.page = page;\n\t\t\t\tregion.name = line;\n\t\t\t\twhile (true) {\n\t\t\t\t\tlet count = reader.readEntry(entry, line = reader.readLine());\n\t\t\t\t\tif (count == 0) break;\n\t\t\t\t\tlet field: Function = regionFields[entry[0]];\n\t\t\t\t\tif (field)\n\t\t\t\t\t\tfield();\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!names) {\n\t\t\t\t\t\t\tnames = [];\n\t\t\t\t\t\t\tvalues = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnames.push(entry[0]);\n\t\t\t\t\t\tlet entryValues: number[] = [];\n\t\t\t\t\t\tfor (let i = 0; i < count; i++)\n\t\t\t\t\t\t\tentryValues.push(parseInt(entry[i + 1]));\n\t\t\t\t\t\tvalues.push(entryValues);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (region.originalWidth == 0 && region.originalHeight == 0) {\n\t\t\t\t\tregion.originalWidth = region.width;\n\t\t\t\t\tregion.originalHeight = region.height;\n\t\t\t\t}\n\t\t\t\tif (names && names.length > 0) {\n\t\t\t\t\tregion.names = names;\n\t\t\t\t\tregion.values = values;\n\t\t\t\t\tnames = null;\n\t\t\t\t\tvalues = null;\n\t\t\t\t}\n\t\t\t\tregion.u = region.x / page.width;\n\t\t\t\tregion.v = region.y / page.height;\n\t\t\t\tif (region.degrees == 90) {\n\t\t\t\t\tregion.u2 = (region.x + region.height) / page.width;\n\t\t\t\t\tregion.v2 = (region.y + region.width) / page.height;\n\t\t\t\t} else {\n\t\t\t\t\tregion.u2 = (region.x + region.width) / page.width;\n\t\t\t\t\tregion.v2 = (region.y + region.height) / page.height;\n\t\t\t\t}\n\t\t\t\tthis.regions.push(region);\n\t\t\t}\n\t\t}\n\t}\n\n\tfindRegion(name: string): TextureAtlasRegion {\n\t\tfor (let i = 0; i < this.regions.length; i++) {\n\t\t\tif (this.regions[i].name == name) {\n\t\t\t\treturn this.regions[i];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tsetTextures(assetManager: AssetManagerBase, pathPrefix: string = \"\") {\n\t\tfor (let page of this.pages)\n\t\t\tpage.setTexture(assetManager.get(pathPrefix + page.name));\n\t}\n\n\tdispose() {\n\t\tfor (let i = 0; i < this.pages.length; i++) {\n\t\t\tthis.pages[i].texture.dispose();\n\t\t}\n\t}\n}\n\nclass TextureAtlasReader {\n\tlines: Array;\n\tindex: number = 0;\n\n\tconstructor(text: string) {\n\t\tthis.lines = text.split(/\\r\\n|\\r|\\n/);\n\t}\n\n\treadLine(): string {\n\t\tif (this.index >= this.lines.length)\n\t\t\treturn null;\n\t\treturn this.lines[this.index++];\n\t}\n\n\treadEntry(entry: string[], line: string): number {\n\t\tif (!line) return 0;\n\t\tline = line.trim();\n\t\tif (line.length == 0) return 0;\n\n\t\tlet colon = line.indexOf(':');\n\t\tif (colon == -1) return 0;\n\t\tentry[0] = line.substr(0, colon).trim();\n\t\tfor (let i = 1, lastMatch = colon + 1; ; i++) {\n\t\t\tlet comma = line.indexOf(',', lastMatch);\n\t\t\tif (comma == -1) {\n\t\t\t\tentry[i] = line.substr(lastMatch).trim();\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\tentry[i] = line.substr(lastMatch, comma - lastMatch).trim();\n\t\t\tlastMatch = comma + 1;\n\t\t\tif (i == 4) return 4;\n\t\t}\n\t}\n}\n\nexport class TextureAtlasPage {\n\tname: string;\n\tminFilter: TextureFilter = TextureFilter.Nearest;\n\tmagFilter: TextureFilter = TextureFilter.Nearest;\n\tuWrap: TextureWrap = TextureWrap.ClampToEdge;\n\tvWrap: TextureWrap = TextureWrap.ClampToEdge;\n\ttexture: Texture;\n\twidth: number;\n\theight: number;\n\tpma: boolean;\n\n\tsetTexture(texture: Texture) {\n\t\tthis.texture = texture;\n\t\ttexture.setFilters(this.minFilter, this.magFilter);\n\t\ttexture.setWraps(this.uWrap, this.vWrap);\n\t}\n}\n\nexport class TextureAtlasRegion extends TextureRegion {\n\tpage: TextureAtlasPage;\n\tname: string;\n\tx: number;\n\ty: number;\n\toffsetX: number;\n\toffsetY: number;\n\toriginalWidth: number;\n\toriginalHeight: number;\n\tindex: number;\n\tdegrees: number;\n\tnames: string[];\n\tvalues: number[][];\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { TextureRegion } from \"../Texture\";\nimport { TextureAtlasRegion } from \"../TextureAtlas\";\nimport { Color, NumberArrayLike, Utils } from \"../Utils\";\nimport { VertexAttachment, Attachment } from \"./Attachment\";\n\n/** An attachment that displays a textured mesh. A mesh has hull vertices and internal vertices within the hull. Holes are not\n * supported. Each vertex has UVs (texture coordinates) and triangles are used to map an image on to the mesh.\n *\n * See [Mesh attachments](http://esotericsoftware.com/spine-meshes) in the Spine User Guide. */\nexport class MeshAttachment extends VertexAttachment {\n\tregion: TextureRegion;\n\n\t/** The name of the texture region for this attachment. */\n\tpath: string;\n\n\t/** The UV pair for each vertex, normalized within the texture region. */\n\tregionUVs: NumberArrayLike;\n\n\t/** The UV pair for each vertex, normalized within the entire texture.\n\t *\n\t * See {@link #updateUVs}. */\n\tuvs: NumberArrayLike;\n\n\t/** Triplets of vertex indices which describe the mesh's triangulation. */\n\ttriangles: Array;\n\n\t/** The color to tint the mesh. */\n\tcolor = new Color(1, 1, 1, 1);\n\n\t/** The width of the mesh's image. Available only when nonessential data was exported. */\n\twidth: number;\n\n\t/** The height of the mesh's image. Available only when nonessential data was exported. */\n\theight: number;\n\n\t/** The number of entries at the beginning of {@link #vertices} that make up the mesh hull. */\n\thullLength: number;\n\n\t/** Vertex index pairs describing edges for controling triangulation. Mesh triangles will never cross edges. Only available if\n\t * nonessential data was exported. Triangulation is not performed at runtime. */\n\tedges: Array;\n\n\tprivate parentMesh: MeshAttachment;\n\ttempColor = new Color(0, 0, 0, 0);\n\n\tconstructor(name: string) {\n\t\tsuper(name);\n\t}\n\n\t/** Calculates {@link #uvs} using {@link #regionUVs} and the {@link #region}. Must be called after changing the region UVs or\n\t * region. */\n\tupdateUVs() {\n\t\tlet regionUVs = this.regionUVs;\n\t\tif (!this.uvs || this.uvs.length != regionUVs.length) this.uvs = Utils.newFloatArray(regionUVs.length);\n\t\tlet uvs = this.uvs;\n\t\tlet n = this.uvs.length;\n\t\tlet u = this.region.u, v = this.region.v, width = 0, height = 0;\n\t\tif (this.region instanceof TextureAtlasRegion) {\n\t\t\tlet region = this.region, image = region.page.texture.getImage();\n\t\t\tlet textureWidth = image.width, textureHeight = image.height;\n\t\t\tswitch (region.degrees) {\n\t\t\t\tcase 90:\n\t\t\t\t\tu -= (region.originalHeight - region.offsetY - region.height) / textureWidth;\n\t\t\t\t\tv -= (region.originalWidth - region.offsetX - region.width) / textureHeight;\n\t\t\t\t\twidth = region.originalHeight / textureWidth;\n\t\t\t\t\theight = region.originalWidth / textureHeight;\n\t\t\t\t\tfor (let i = 0; i < n; i += 2) {\n\t\t\t\t\t\tuvs[i] = u + regionUVs[i + 1] * width;\n\t\t\t\t\t\tuvs[i + 1] = v + (1 - regionUVs[i]) * height;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase 180:\n\t\t\t\t\tu -= (region.originalWidth - region.offsetX - region.width) / textureWidth;\n\t\t\t\t\tv -= region.offsetY / textureHeight;\n\t\t\t\t\twidth = region.originalWidth / textureWidth;\n\t\t\t\t\theight = region.originalHeight / textureHeight;\n\t\t\t\t\tfor (let i = 0; i < n; i += 2) {\n\t\t\t\t\t\tuvs[i] = u + (1 - regionUVs[i]) * width;\n\t\t\t\t\t\tuvs[i + 1] = v + (1 - regionUVs[i + 1]) * height;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase 270:\n\t\t\t\t\tu -= region.offsetY / textureWidth;\n\t\t\t\t\tv -= region.offsetX / textureHeight;\n\t\t\t\t\twidth = region.originalHeight / textureWidth;\n\t\t\t\t\theight = region.originalWidth / textureHeight;\n\t\t\t\t\tfor (let i = 0; i < n; i += 2) {\n\t\t\t\t\t\tuvs[i] = u + (1 - regionUVs[i + 1]) * width;\n\t\t\t\t\t\tuvs[i + 1] = v + regionUVs[i] * height;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tu -= region.offsetX / textureWidth;\n\t\t\tv -= (region.originalHeight - region.offsetY - region.height) / textureHeight;\n\t\t\twidth = region.originalWidth / textureWidth;\n\t\t\theight = region.originalHeight / textureHeight;\n\t\t} else if (!this.region) {\n\t\t\tu = v = 0;\n\t\t\twidth = height = 1;\n\t\t} else {\n\t\t\twidth = this.region.u2 - u;\n\t\t\theight = this.region.v2 - v;\n\t\t}\n\n\t\tfor (let i = 0; i < n; i += 2) {\n\t\t\tuvs[i] = u + regionUVs[i] * width;\n\t\t\tuvs[i + 1] = v + regionUVs[i + 1] * height;\n\t\t}\n\t}\n\n\t/** The parent mesh if this is a linked mesh, else null. A linked mesh shares the {@link #bones}, {@link #vertices},\n\t * {@link #regionUVs}, {@link #triangles}, {@link #hullLength}, {@link #edges}, {@link #width}, and {@link #height} with the\n\t * parent mesh, but may have a different {@link #name} or {@link #path} (and therefore a different texture). */\n\tgetParentMesh() {\n\t\treturn this.parentMesh;\n\t}\n\n\t/** @param parentMesh May be null. */\n\tsetParentMesh(parentMesh: MeshAttachment) {\n\t\tthis.parentMesh = parentMesh;\n\t\tif (parentMesh) {\n\t\t\tthis.bones = parentMesh.bones;\n\t\t\tthis.vertices = parentMesh.vertices;\n\t\t\tthis.worldVerticesLength = parentMesh.worldVerticesLength;\n\t\t\tthis.regionUVs = parentMesh.regionUVs;\n\t\t\tthis.triangles = parentMesh.triangles;\n\t\t\tthis.hullLength = parentMesh.hullLength;\n\t\t\tthis.worldVerticesLength = parentMesh.worldVerticesLength\n\t\t}\n\t}\n\n\tcopy(): Attachment {\n\t\tif (this.parentMesh) return this.newLinkedMesh();\n\n\t\tlet copy = new MeshAttachment(this.name);\n\t\tcopy.region = this.region;\n\t\tcopy.path = this.path;\n\t\tcopy.color.setFromColor(this.color);\n\n\t\tthis.copyTo(copy);\n\t\tcopy.regionUVs = new Array(this.regionUVs.length);\n\t\tUtils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length);\n\t\tcopy.uvs = new Array(this.uvs.length);\n\t\tUtils.arrayCopy(this.uvs, 0, copy.uvs, 0, this.uvs.length);\n\t\tcopy.triangles = new Array(this.triangles.length);\n\t\tUtils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length);\n\t\tcopy.hullLength = this.hullLength;\n\n\t\t// Nonessential.\n\t\tif (this.edges) {\n\t\t\tcopy.edges = new Array(this.edges.length);\n\t\t\tUtils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length);\n\t\t}\n\t\tcopy.width = this.width;\n\t\tcopy.height = this.height;\n\n\t\treturn copy;\n\t}\n\n\t/** Returns a new mesh with the {@link #parentMesh} set to this mesh's parent mesh, if any, else to this mesh. **/\n\tnewLinkedMesh(): MeshAttachment {\n\t\tlet copy = new MeshAttachment(this.name);\n\t\tcopy.region = this.region;\n\t\tcopy.path = this.path;\n\t\tcopy.color.setFromColor(this.color);\n\t\tcopy.deformAttachment = this.deformAttachment;\n\t\tcopy.setParentMesh(this.parentMesh ? this.parentMesh : this);\n\t\tcopy.updateUVs();\n\t\treturn copy;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Color, Utils } from \"../Utils\";\nimport { VertexAttachment, Attachment } from \"./Attachment\";\n\n/** An attachment whose vertices make up a composite Bezier curve.\n *\n * See {@link PathConstraint} and [Paths](http://esotericsoftware.com/spine-paths) in the Spine User Guide. */\nexport class PathAttachment extends VertexAttachment {\n\n\t/** The lengths along the path in the setup pose from the start of the path to the end of each Bezier curve. */\n\tlengths: Array;\n\n\t/** If true, the start and end knots are connected. */\n\tclosed = false;\n\n\t/** If true, additional calculations are performed to make calculating positions along the path more accurate. If false, fewer\n\t * calculations are performed but calculating positions along the path is less accurate. */\n\tconstantSpeed = false;\n\n\t/** The color of the path as it was in Spine. Available only when nonessential data was exported. Paths are not usually\n\t * rendered at runtime. */\n\tcolor = new Color(1, 1, 1, 1);\n\n\tconstructor(name: string) {\n\t\tsuper(name);\n\t}\n\n\tcopy(): Attachment {\n\t\tlet copy = new PathAttachment(this.name);\n\t\tthis.copyTo(copy);\n\t\tcopy.lengths = new Array(this.lengths.length);\n\t\tUtils.arrayCopy(this.lengths, 0, copy.lengths, 0, this.lengths.length);\n\t\tcopy.closed = closed;\n\t\tcopy.constantSpeed = this.constantSpeed;\n\t\tcopy.color.setFromColor(this.color);\n\t\treturn copy;\n\t}\n}", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Bone } from \"../Bone\";\nimport { Color, Vector2, MathUtils } from \"../Utils\";\nimport { VertexAttachment, Attachment } from \"./Attachment\";\n\n/** An attachment which is a single point and a rotation. This can be used to spawn projectiles, particles, etc. A bone can be\n * used in similar ways, but a PointAttachment is slightly less expensive to compute and can be hidden, shown, and placed in a\n * skin.\n *\n * See [Point Attachments](http://esotericsoftware.com/spine-point-attachments) in the Spine User Guide. */\nexport class PointAttachment extends VertexAttachment {\n\tx: number; y: number; rotation: number;\n\n\t/** The color of the point attachment as it was in Spine. Available only when nonessential data was exported. Point attachments\n\t * are not usually rendered at runtime. */\n\tcolor = new Color(0.38, 0.94, 0, 1);\n\n\tconstructor(name: string) {\n\t\tsuper(name);\n\t}\n\n\tcomputeWorldPosition(bone: Bone, point: Vector2) {\n\t\tpoint.x = this.x * bone.a + this.y * bone.b + bone.worldX;\n\t\tpoint.y = this.x * bone.c + this.y * bone.d + bone.worldY;\n\t\treturn point;\n\t}\n\n\tcomputeWorldRotation(bone: Bone) {\n\t\tlet cos = MathUtils.cosDeg(this.rotation), sin = MathUtils.sinDeg(this.rotation);\n\t\tlet x = cos * bone.a + sin * bone.b;\n\t\tlet y = cos * bone.c + sin * bone.d;\n\t\treturn Math.atan2(y, x) * MathUtils.radDeg;\n\t}\n\n\tcopy(): Attachment {\n\t\tlet copy = new PointAttachment(this.name);\n\t\tcopy.x = this.x;\n\t\tcopy.y = this.y;\n\t\tcopy.rotation = this.rotation;\n\t\tcopy.color.setFromColor(this.color);\n\t\treturn copy;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Bone } from \"../Bone\";\nimport { TextureRegion } from \"../Texture\";\nimport { Color, NumberArrayLike, Utils } from \"../Utils\";\nimport { Attachment } from \"./Attachment\";\n\n/** An attachment that displays a textured quadrilateral.\n *\n * See [Region attachments](http://esotericsoftware.com/spine-regions) in the Spine User Guide. */\nexport class RegionAttachment extends Attachment {\n\t/** The local x translation. */\n\tx = 0;\n\n\t/** The local y translation. */\n\ty = 0;\n\n\t/** The local scaleX. */\n\tscaleX = 1;\n\n\t/** The local scaleY. */\n\tscaleY = 1;\n\n\t/** The local rotation. */\n\trotation = 0;\n\n\t/** The width of the region attachment in Spine. */\n\twidth = 0;\n\n\t/** The height of the region attachment in Spine. */\n\theight = 0;\n\n\t/** The color to tint the region attachment. */\n\tcolor = new Color(1, 1, 1, 1);\n\n\t/** The name of the texture region for this attachment. */\n\tpath: string;\n\n\trendererObject: any;\n\tregion: TextureRegion;\n\n\t/** For each of the 4 vertices, a pair of x,y values that is the local position of the vertex.\n\t *\n\t * See {@link #updateOffset()}. */\n\toffset = Utils.newFloatArray(8);\n\n\tuvs = Utils.newFloatArray(8);\n\n\ttempColor = new Color(1, 1, 1, 1);\n\n\tconstructor(name: string) {\n\t\tsuper(name);\n\t}\n\n\t/** Calculates the {@link #offset} using the region settings. Must be called after changing region settings. */\n\tupdateOffset(): void {\n\t\tlet region = this.region;\n\t\tlet regionScaleX = this.width / this.region.originalWidth * this.scaleX;\n\t\tlet regionScaleY = this.height / this.region.originalHeight * this.scaleY;\n\t\tlet localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX;\n\t\tlet localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY;\n\t\tlet localX2 = localX + this.region.width * regionScaleX;\n\t\tlet localY2 = localY + this.region.height * regionScaleY;\n\t\tlet radians = this.rotation * Math.PI / 180;\n\t\tlet cos = Math.cos(radians);\n\t\tlet sin = Math.sin(radians);\n\t\tlet x = this.x, y = this.y;\n\t\tlet localXCos = localX * cos + x;\n\t\tlet localXSin = localX * sin;\n\t\tlet localYCos = localY * cos + y;\n\t\tlet localYSin = localY * sin;\n\t\tlet localX2Cos = localX2 * cos + x;\n\t\tlet localX2Sin = localX2 * sin;\n\t\tlet localY2Cos = localY2 * cos + y;\n\t\tlet localY2Sin = localY2 * sin;\n\t\tlet offset = this.offset;\n\t\toffset[0] = localXCos - localYSin;\n\t\toffset[1] = localYCos + localXSin;\n\t\toffset[2] = localXCos - localY2Sin;\n\t\toffset[3] = localY2Cos + localXSin;\n\t\toffset[4] = localX2Cos - localY2Sin;\n\t\toffset[5] = localY2Cos + localX2Sin;\n\t\toffset[6] = localX2Cos - localYSin;\n\t\toffset[7] = localYCos + localX2Sin;\n\t}\n\n\tsetRegion(region: TextureRegion): void {\n\t\tthis.region = region;\n\t\tlet uvs = this.uvs;\n\t\tif (region.degrees == 90) {\n\t\t\tuvs[2] = region.u;\n\t\t\tuvs[3] = region.v2;\n\t\t\tuvs[4] = region.u;\n\t\t\tuvs[5] = region.v;\n\t\t\tuvs[6] = region.u2;\n\t\t\tuvs[7] = region.v;\n\t\t\tuvs[0] = region.u2;\n\t\t\tuvs[1] = region.v2;\n\t\t} else {\n\t\t\tuvs[0] = region.u;\n\t\t\tuvs[1] = region.v2;\n\t\t\tuvs[2] = region.u;\n\t\t\tuvs[3] = region.v;\n\t\t\tuvs[4] = region.u2;\n\t\t\tuvs[5] = region.v;\n\t\t\tuvs[6] = region.u2;\n\t\t\tuvs[7] = region.v2;\n\t\t}\n\t}\n\n\t/** Transforms the attachment's four vertices to world coordinates.\n\t *\n\t * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine\n\t * Runtimes Guide.\n\t * @param worldVertices The output world vertices. Must have a length >= `offset` + 8.\n\t * @param offset The `worldVertices` index to begin writing values.\n\t * @param stride The number of `worldVertices` entries between the value pairs written. */\n\tcomputeWorldVertices(bone: Bone, worldVertices: NumberArrayLike, offset: number, stride: number) {\n\t\tlet vertexOffset = this.offset;\n\t\tlet x = bone.worldX, y = bone.worldY;\n\t\tlet a = bone.a, b = bone.b, c = bone.c, d = bone.d;\n\t\tlet offsetX = 0, offsetY = 0;\n\n\t\toffsetX = vertexOffset[0];\n\t\toffsetY = vertexOffset[1];\n\t\tworldVertices[offset] = offsetX * a + offsetY * b + x; // br\n\t\tworldVertices[offset + 1] = offsetX * c + offsetY * d + y;\n\t\toffset += stride;\n\n\t\toffsetX = vertexOffset[2];\n\t\toffsetY = vertexOffset[3];\n\t\tworldVertices[offset] = offsetX * a + offsetY * b + x; // bl\n\t\tworldVertices[offset + 1] = offsetX * c + offsetY * d + y;\n\t\toffset += stride;\n\n\t\toffsetX = vertexOffset[4];\n\t\toffsetY = vertexOffset[5];\n\t\tworldVertices[offset] = offsetX * a + offsetY * b + x; // ul\n\t\tworldVertices[offset + 1] = offsetX * c + offsetY * d + y;\n\t\toffset += stride;\n\n\t\toffsetX = vertexOffset[6];\n\t\toffsetY = vertexOffset[7];\n\t\tworldVertices[offset] = offsetX * a + offsetY * b + x; // ur\n\t\tworldVertices[offset + 1] = offsetX * c + offsetY * d + y;\n\t}\n\n\tcopy(): Attachment {\n\t\tlet copy = new RegionAttachment(this.name);\n\t\tcopy.region = this.region;\n\t\tcopy.rendererObject = this.rendererObject;\n\t\tcopy.path = this.path;\n\t\tcopy.x = this.x;\n\t\tcopy.y = this.y;\n\t\tcopy.scaleX = this.scaleX;\n\t\tcopy.scaleY = this.scaleY;\n\t\tcopy.rotation = this.rotation;\n\t\tcopy.width = this.width;\n\t\tcopy.height = this.height;\n\t\tUtils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8);\n\t\tUtils.arrayCopy(this.offset, 0, copy.offset, 0, 8);\n\t\tcopy.color.setFromColor(this.color);\n\t\treturn copy;\n\t}\n\n\tstatic X1 = 0;\n\tstatic Y1 = 1;\n\tstatic C1R = 2;\n\tstatic C1G = 3;\n\tstatic C1B = 4;\n\tstatic C1A = 5;\n\tstatic U1 = 6;\n\tstatic V1 = 7;\n\n\tstatic X2 = 8;\n\tstatic Y2 = 9;\n\tstatic C2R = 10;\n\tstatic C2G = 11;\n\tstatic C2B = 12;\n\tstatic C2A = 13;\n\tstatic U2 = 14;\n\tstatic V2 = 15;\n\n\tstatic X3 = 16;\n\tstatic Y3 = 17;\n\tstatic C3R = 18;\n\tstatic C3G = 19;\n\tstatic C3B = 20;\n\tstatic C3A = 21;\n\tstatic U3 = 22;\n\tstatic V3 = 23;\n\n\tstatic X4 = 24;\n\tstatic Y4 = 25;\n\tstatic C4R = 26;\n\tstatic C4G = 27;\n\tstatic C4B = 28;\n\tstatic C4A = 29;\n\tstatic U4 = 30;\n\tstatic V4 = 31;\n}", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { AttachmentLoader } from \"./attachments/AttachmentLoader\";\nimport { BoundingBoxAttachment } from \"./attachments/BoundingBoxAttachment\";\nimport { ClippingAttachment } from \"./attachments/ClippingAttachment\";\nimport { MeshAttachment } from \"./attachments/MeshAttachment\";\nimport { PathAttachment } from \"./attachments/PathAttachment\";\nimport { PointAttachment } from \"./attachments/PointAttachment\";\nimport { RegionAttachment } from \"./attachments/RegionAttachment\";\nimport { Skin } from \"./Skin\";\nimport { TextureAtlas } from \"./TextureAtlas\";\n\n/** An {@link AttachmentLoader} that configures attachments using texture regions from an {@link TextureAtlas}.\n *\n * See [Loading skeleton data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the\n * Spine Runtimes Guide. */\nexport class AtlasAttachmentLoader implements AttachmentLoader {\n\tatlas: TextureAtlas;\n\n\tconstructor(atlas: TextureAtlas) {\n\t\tthis.atlas = atlas;\n\t}\n\n\tnewRegionAttachment(skin: Skin, name: string, path: string): RegionAttachment {\n\t\tlet region = this.atlas.findRegion(path);\n\t\tif (!region) throw new Error(\"Region not found in atlas: \" + path + \" (region attachment: \" + name + \")\");\n\t\tregion.renderObject = region;\n\t\tlet attachment = new RegionAttachment(name);\n\t\tattachment.setRegion(region);\n\t\treturn attachment;\n\t}\n\n\tnewMeshAttachment(skin: Skin, name: string, path: string): MeshAttachment {\n\t\tlet region = this.atlas.findRegion(path);\n\t\tif (!region) throw new Error(\"Region not found in atlas: \" + path + \" (mesh attachment: \" + name + \")\");\n\t\tregion.renderObject = region;\n\t\tlet attachment = new MeshAttachment(name);\n\t\tattachment.region = region;\n\t\treturn attachment;\n\t}\n\n\tnewBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment {\n\t\treturn new BoundingBoxAttachment(name);\n\t}\n\n\tnewPathAttachment(skin: Skin, name: string): PathAttachment {\n\t\treturn new PathAttachment(name);\n\t}\n\n\tnewPointAttachment(skin: Skin, name: string): PointAttachment {\n\t\treturn new PointAttachment(name);\n\t}\n\n\tnewClippingAttachment(skin: Skin, name: string): ClippingAttachment {\n\t\treturn new ClippingAttachment(name);\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Color } from \"./Utils\";\n\n/** Stores the setup pose for a {@link Bone}. */\nexport class BoneData {\n\t/** The index of the bone in {@link Skeleton#getBones()}. */\n\tindex: number;\n\n\t/** The name of the bone, which is unique across all bones in the skeleton. */\n\tname: string;\n\n\t/** @returns May be null. */\n\tparent: BoneData;\n\n\t/** The bone's length. */\n\tlength: number;\n\n\t/** The local x translation. */\n\tx = 0;\n\n\t/** The local y translation. */\n\ty = 0;\n\n\t/** The local rotation. */\n\trotation = 0;\n\n\t/** The local scaleX. */\n\tscaleX = 1;\n\n\t/** The local scaleY. */\n\tscaleY = 1;\n\n\t/** The local shearX. */\n\tshearX = 0;\n\n\t/** The local shearX. */\n\tshearY = 0;\n\n\t/** The transform mode for how parent world transforms affect this bone. */\n\ttransformMode = TransformMode.Normal;\n\n\t/** When true, {@link Skeleton#updateWorldTransform()} only updates this bone if the {@link Skeleton#skin} contains this\n\t * bone.\n\t * @see Skin#bones */\n\tskinRequired = false;\n\n\t/** The color of the bone as it was in Spine. Available only when nonessential data was exported. Bones are not usually\n\t * rendered at runtime. */\n\tcolor = new Color();\n\n\tconstructor(index: number, name: string, parent: BoneData) {\n\t\tif (index < 0) throw new Error(\"index must be >= 0.\");\n\t\tif (!name) throw new Error(\"name cannot be null.\");\n\t\tthis.index = index;\n\t\tthis.name = name;\n\t\tthis.parent = parent;\n\t}\n}\n\n/** Determines how a bone inherits world transforms from parent bones. */\nexport enum TransformMode { Normal, OnlyTranslation, NoRotationOrReflection, NoScale, NoScaleOrReflection }\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { BoneData, TransformMode } from \"./BoneData\";\nimport { Skeleton } from \"./Skeleton\";\nimport { Updatable } from \"./Updatable\";\nimport { MathUtils, Vector2 } from \"./Utils\";\n\n/** Stores a bone's current pose.\n *\n * A bone has a local transform which is used to compute its world transform. A bone also has an applied transform, which is a\n * local transform that can be applied to compute the world transform. The local transform and applied transform may differ if a\n * constraint or application code modifies the world transform after it was computed from the local transform. */\nexport class Bone implements Updatable {\n\t/** The bone's setup pose data. */\n\tdata: BoneData;\n\n\t/** The skeleton this bone belongs to. */\n\tskeleton: Skeleton;\n\n\t/** The parent bone, or null if this is the root bone. */\n\tparent: Bone;\n\n\t/** The immediate children of this bone. */\n\tchildren = new Array();\n\n\t/** The local x translation. */\n\tx = 0;\n\n\t/** The local y translation. */\n\ty = 0;\n\n\t/** The local rotation in degrees, counter clockwise. */\n\trotation = 0;\n\n\t/** The local scaleX. */\n\tscaleX = 0;\n\n\t/** The local scaleY. */\n\tscaleY = 0;\n\n\t/** The local shearX. */\n\tshearX = 0;\n\n\t/** The local shearY. */\n\tshearY = 0;\n\n\t/** The applied local x translation. */\n\tax = 0;\n\n\t/** The applied local y translation. */\n\tay = 0;\n\n\t/** The applied local rotation in degrees, counter clockwise. */\n\tarotation = 0;\n\n\t/** The applied local scaleX. */\n\tascaleX = 0;\n\n\t/** The applied local scaleY. */\n\tascaleY = 0;\n\n\t/** The applied local shearX. */\n\tashearX = 0;\n\n\t/** The applied local shearY. */\n\tashearY = 0;\n\n\t/** Part of the world transform matrix for the X axis. If changed, {@link #updateAppliedTransform()} should be called. */\n\ta = 0;\n\n\t/** Part of the world transform matrix for the Y axis. If changed, {@link #updateAppliedTransform()} should be called. */\n\tb = 0;\n\n\t/** Part of the world transform matrix for the X axis. If changed, {@link #updateAppliedTransform()} should be called. */\n\tc = 0;\n\n\t/** Part of the world transform matrix for the Y axis. If changed, {@link #updateAppliedTransform()} should be called. */\n\td = 0;\n\n\t/** The world X position. If changed, {@link #updateAppliedTransform()} should be called. */\n\tworldY = 0;\n\n\t/** The world Y position. If changed, {@link #updateAppliedTransform()} should be called. */\n\tworldX = 0;\n\n\tsorted = false;\n\tactive = false;\n\n\t/** @param parent May be null. */\n\tconstructor(data: BoneData, skeleton: Skeleton, parent: Bone) {\n\t\tif (!data) throw new Error(\"data cannot be null.\");\n\t\tif (!skeleton) throw new Error(\"skeleton cannot be null.\");\n\t\tthis.data = data;\n\t\tthis.skeleton = skeleton;\n\t\tthis.parent = parent;\n\t\tthis.setToSetupPose();\n\t}\n\n\t/** Returns false when the bone has not been computed because {@link BoneData#skinRequired} is true and the\n\t * {@link Skeleton#skin active skin} does not {@link Skin#bones contain} this bone. */\n\tisActive() {\n\t\treturn this.active;\n\t}\n\n\t/** Computes the world transform using the parent bone and this bone's local applied transform. */\n\tupdate() {\n\t\tthis.updateWorldTransformWith(this.ax, this.ay, this.arotation, this.ascaleX, this.ascaleY, this.ashearX, this.ashearY);\n\t}\n\n\t/** Computes the world transform using the parent bone and this bone's local transform.\n\t *\n\t * See {@link #updateWorldTransformWith()}. */\n\tupdateWorldTransform() {\n\t\tthis.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);\n\t}\n\n\t/** Computes the world transform using the parent bone and the specified local transform. The applied transform is set to the\n\t * specified local transform. Child bones are not updated.\n\t *\n\t * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine\n\t * Runtimes Guide. */\n\tupdateWorldTransformWith(x: number, y: number, rotation: number, scaleX: number, scaleY: number, shearX: number, shearY: number) {\n\t\tthis.ax = x;\n\t\tthis.ay = y;\n\t\tthis.arotation = rotation;\n\t\tthis.ascaleX = scaleX;\n\t\tthis.ascaleY = scaleY;\n\t\tthis.ashearX = shearX;\n\t\tthis.ashearY = shearY;\n\n\t\tlet parent = this.parent;\n\t\tif (!parent) { // Root bone.\n\t\t\tlet skeleton = this.skeleton;\n\t\t\tlet rotationY = rotation + 90 + shearY;\n\t\t\tlet sx = skeleton.scaleX;\n\t\t\tlet sy = skeleton.scaleY;\n\t\t\tthis.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx;\n\t\t\tthis.b = MathUtils.cosDeg(rotationY) * scaleY * sx;\n\t\t\tthis.c = MathUtils.sinDeg(rotation + shearX) * scaleX * sy;\n\t\t\tthis.d = MathUtils.sinDeg(rotationY) * scaleY * sy;\n\t\t\tthis.worldX = x * sx + skeleton.x;\n\t\t\tthis.worldY = y * sy + skeleton.y;\n\t\t\treturn;\n\t\t}\n\n\t\tlet pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;\n\t\tthis.worldX = pa * x + pb * y + parent.worldX;\n\t\tthis.worldY = pc * x + pd * y + parent.worldY;\n\n\t\tswitch (this.data.transformMode) {\n\t\t\tcase TransformMode.Normal: {\n\t\t\t\tlet rotationY = rotation + 90 + shearY;\n\t\t\t\tlet la = MathUtils.cosDeg(rotation + shearX) * scaleX;\n\t\t\t\tlet lb = MathUtils.cosDeg(rotationY) * scaleY;\n\t\t\t\tlet lc = MathUtils.sinDeg(rotation + shearX) * scaleX;\n\t\t\t\tlet ld = MathUtils.sinDeg(rotationY) * scaleY;\n\t\t\t\tthis.a = pa * la + pb * lc;\n\t\t\t\tthis.b = pa * lb + pb * ld;\n\t\t\t\tthis.c = pc * la + pd * lc;\n\t\t\t\tthis.d = pc * lb + pd * ld;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase TransformMode.OnlyTranslation: {\n\t\t\t\tlet rotationY = rotation + 90 + shearY;\n\t\t\t\tthis.a = MathUtils.cosDeg(rotation + shearX) * scaleX;\n\t\t\t\tthis.b = MathUtils.cosDeg(rotationY) * scaleY;\n\t\t\t\tthis.c = MathUtils.sinDeg(rotation + shearX) * scaleX;\n\t\t\t\tthis.d = MathUtils.sinDeg(rotationY) * scaleY;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TransformMode.NoRotationOrReflection: {\n\t\t\t\tlet s = pa * pa + pc * pc;\n\t\t\t\tlet prx = 0;\n\t\t\t\tif (s > 0.0001) {\n\t\t\t\t\ts = Math.abs(pa * pd - pb * pc) / s;\n\t\t\t\t\tpa /= this.skeleton.scaleX;\n\t\t\t\t\tpc /= this.skeleton.scaleY;\n\t\t\t\t\tpb = pc * s;\n\t\t\t\t\tpd = pa * s;\n\t\t\t\t\tprx = Math.atan2(pc, pa) * MathUtils.radDeg;\n\t\t\t\t} else {\n\t\t\t\t\tpa = 0;\n\t\t\t\t\tpc = 0;\n\t\t\t\t\tprx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg;\n\t\t\t\t}\n\t\t\t\tlet rx = rotation + shearX - prx;\n\t\t\t\tlet ry = rotation + shearY - prx + 90;\n\t\t\t\tlet la = MathUtils.cosDeg(rx) * scaleX;\n\t\t\t\tlet lb = MathUtils.cosDeg(ry) * scaleY;\n\t\t\t\tlet lc = MathUtils.sinDeg(rx) * scaleX;\n\t\t\t\tlet ld = MathUtils.sinDeg(ry) * scaleY;\n\t\t\t\tthis.a = pa * la - pb * lc;\n\t\t\t\tthis.b = pa * lb - pb * ld;\n\t\t\t\tthis.c = pc * la + pd * lc;\n\t\t\t\tthis.d = pc * lb + pd * ld;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TransformMode.NoScale:\n\t\t\tcase TransformMode.NoScaleOrReflection: {\n\t\t\t\tlet cos = MathUtils.cosDeg(rotation);\n\t\t\t\tlet sin = MathUtils.sinDeg(rotation);\n\t\t\t\tlet za = (pa * cos + pb * sin) / this.skeleton.scaleX;\n\t\t\t\tlet zc = (pc * cos + pd * sin) / this.skeleton.scaleY;\n\t\t\t\tlet s = Math.sqrt(za * za + zc * zc);\n\t\t\t\tif (s > 0.00001) s = 1 / s;\n\t\t\t\tza *= s;\n\t\t\t\tzc *= s;\n\t\t\t\ts = Math.sqrt(za * za + zc * zc);\n\t\t\t\tif (this.data.transformMode == TransformMode.NoScale\n\t\t\t\t\t&& (pa * pd - pb * pc < 0) != (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0)) s = -s;\n\t\t\t\tlet r = Math.PI / 2 + Math.atan2(zc, za);\n\t\t\t\tlet zb = Math.cos(r) * s;\n\t\t\t\tlet zd = Math.sin(r) * s;\n\t\t\t\tlet la = MathUtils.cosDeg(shearX) * scaleX;\n\t\t\t\tlet lb = MathUtils.cosDeg(90 + shearY) * scaleY;\n\t\t\t\tlet lc = MathUtils.sinDeg(shearX) * scaleX;\n\t\t\t\tlet ld = MathUtils.sinDeg(90 + shearY) * scaleY;\n\t\t\t\tthis.a = za * la + zb * lc;\n\t\t\t\tthis.b = za * lb + zb * ld;\n\t\t\t\tthis.c = zc * la + zd * lc;\n\t\t\t\tthis.d = zc * lb + zd * ld;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.a *= this.skeleton.scaleX;\n\t\tthis.b *= this.skeleton.scaleX;\n\t\tthis.c *= this.skeleton.scaleY;\n\t\tthis.d *= this.skeleton.scaleY;\n\t}\n\n\t/** Sets this bone's local transform to the setup pose. */\n\tsetToSetupPose() {\n\t\tlet data = this.data;\n\t\tthis.x = data.x;\n\t\tthis.y = data.y;\n\t\tthis.rotation = data.rotation;\n\t\tthis.scaleX = data.scaleX;\n\t\tthis.scaleY = data.scaleY;\n\t\tthis.shearX = data.shearX;\n\t\tthis.shearY = data.shearY;\n\t}\n\n\t/** The world rotation for the X axis, calculated using {@link #a} and {@link #c}. */\n\tgetWorldRotationX() {\n\t\treturn Math.atan2(this.c, this.a) * MathUtils.radDeg;\n\t}\n\n\t/** The world rotation for the Y axis, calculated using {@link #b} and {@link #d}. */\n\tgetWorldRotationY() {\n\t\treturn Math.atan2(this.d, this.b) * MathUtils.radDeg;\n\t}\n\n\t/** The magnitude (always positive) of the world scale X, calculated using {@link #a} and {@link #c}. */\n\tgetWorldScaleX() {\n\t\treturn Math.sqrt(this.a * this.a + this.c * this.c);\n\t}\n\n\t/** The magnitude (always positive) of the world scale Y, calculated using {@link #b} and {@link #d}. */\n\tgetWorldScaleY() {\n\t\treturn Math.sqrt(this.b * this.b + this.d * this.d);\n\t}\n\n\t/** Computes the applied transform values from the world transform.\n\t *\n\t * If the world transform is modified (by a constraint, {@link #rotateWorld(float)}, etc) then this method should be called so\n\t * the applied transform matches the world transform. The applied transform may be needed by other code (eg to apply other\n\t * constraints).\n\t *\n\t * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. The applied transform after\n\t * calling this method is equivalent to the local transform used to compute the world transform, but may not be identical. */\n\tupdateAppliedTransform() {\n\t\tlet parent = this.parent;\n\t\tif (!parent) {\n\t\t\tthis.ax = this.worldX;\n\t\t\tthis.ay = this.worldY;\n\t\t\tthis.arotation = Math.atan2(this.c, this.a) * MathUtils.radDeg;\n\t\t\tthis.ascaleX = Math.sqrt(this.a * this.a + this.c * this.c);\n\t\t\tthis.ascaleY = Math.sqrt(this.b * this.b + this.d * this.d);\n\t\t\tthis.ashearX = 0;\n\t\t\tthis.ashearY = Math.atan2(this.a * this.b + this.c * this.d, this.a * this.d - this.b * this.c) * MathUtils.radDeg;\n\t\t\treturn;\n\t\t}\n\t\tlet pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;\n\t\tlet pid = 1 / (pa * pd - pb * pc);\n\t\tlet dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY;\n\t\tthis.ax = (dx * pd * pid - dy * pb * pid);\n\t\tthis.ay = (dy * pa * pid - dx * pc * pid);\n\t\tlet ia = pid * pd;\n\t\tlet id = pid * pa;\n\t\tlet ib = pid * pb;\n\t\tlet ic = pid * pc;\n\t\tlet ra = ia * this.a - ib * this.c;\n\t\tlet rb = ia * this.b - ib * this.d;\n\t\tlet rc = id * this.c - ic * this.a;\n\t\tlet rd = id * this.d - ic * this.b;\n\t\tthis.ashearX = 0;\n\t\tthis.ascaleX = Math.sqrt(ra * ra + rc * rc);\n\t\tif (this.ascaleX > 0.0001) {\n\t\t\tlet det = ra * rd - rb * rc;\n\t\t\tthis.ascaleY = det / this.ascaleX;\n\t\t\tthis.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;\n\t\t\tthis.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;\n\t\t} else {\n\t\t\tthis.ascaleX = 0;\n\t\t\tthis.ascaleY = Math.sqrt(rb * rb + rd * rd);\n\t\t\tthis.ashearY = 0;\n\t\t\tthis.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;\n\t\t}\n\t}\n\n\t/** Transforms a point from world coordinates to the bone's local coordinates. */\n\tworldToLocal(world: Vector2) {\n\t\tlet invDet = 1 / (this.a * this.d - this.b * this.c);\n\t\tlet x = world.x - this.worldX, y = world.y - this.worldY;\n\t\tworld.x = x * this.d * invDet - y * this.b * invDet;\n\t\tworld.y = y * this.a * invDet - x * this.c * invDet;\n\t\treturn world;\n\t}\n\n\t/** Transforms a point from the bone's local coordinates to world coordinates. */\n\tlocalToWorld(local: Vector2) {\n\t\tlet x = local.x, y = local.y;\n\t\tlocal.x = x * this.a + y * this.b + this.worldX;\n\t\tlocal.y = x * this.c + y * this.d + this.worldY;\n\t\treturn local;\n\t}\n\n\t/** Transforms a world rotation to a local rotation. */\n\tworldToLocalRotation(worldRotation: number) {\n\t\tlet sin = MathUtils.sinDeg(worldRotation), cos = MathUtils.cosDeg(worldRotation);\n\t\treturn Math.atan2(this.a * sin - this.c * cos, this.d * cos - this.b * sin) * MathUtils.radDeg + this.rotation - this.shearX;\n\t}\n\n\t/** Transforms a local rotation to a world rotation. */\n\tlocalToWorldRotation(localRotation: number) {\n\t\tlocalRotation -= this.rotation - this.shearX;\n\t\tlet sin = MathUtils.sinDeg(localRotation), cos = MathUtils.cosDeg(localRotation);\n\t\treturn Math.atan2(cos * this.c + sin * this.d, cos * this.a + sin * this.b) * MathUtils.radDeg;\n\t}\n\n\t/** Rotates the world transform the specified amount.\n\t *

\n\t * After changes are made to the world transform, {@link #updateAppliedTransform()} should be called and {@link #update()} will\n\t * need to be called on any child bones, recursively. */\n\trotateWorld(degrees: number) {\n\t\tlet a = this.a, b = this.b, c = this.c, d = this.d;\n\t\tlet cos = MathUtils.cosDeg(degrees), sin = MathUtils.sinDeg(degrees);\n\t\tthis.a = cos * a - sin * c;\n\t\tthis.b = cos * b - sin * d;\n\t\tthis.c = sin * a + cos * c;\n\t\tthis.d = sin * b + cos * d;\n\t}\n}", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n/** The base class for all constraint datas. */\nexport abstract class ConstraintData {\n\tconstructor(public name: string, public order: number, public skinRequired: boolean) { }\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Texture } from \"./Texture\";\nimport { TextureAtlas } from \"./TextureAtlas\";\nimport { Disposable, StringMap } from \"./Utils\";\n\nexport class AssetManagerBase implements Disposable {\n\tprivate pathPrefix: string;\n\tprivate textureLoader: (image: HTMLImageElement | ImageBitmap) => Texture;\n\tprivate downloader: Downloader;\n\tprivate assets: StringMap = {};\n\tprivate errors: StringMap = {};\n\tprivate toLoad = 0;\n\tprivate loaded = 0;\n\n\tconstructor(textureLoader: (image: HTMLImageElement | ImageBitmap) => Texture, pathPrefix: string = \"\", downloader: Downloader = null) {\n\t\tthis.textureLoader = textureLoader;\n\t\tthis.pathPrefix = pathPrefix;\n\t\tthis.downloader = downloader || new Downloader();\n\t}\n\n\tprivate start(path: string): string {\n\t\tthis.toLoad++;\n\t\treturn this.pathPrefix + path;\n\t}\n\n\tprivate success(callback: (path: string, data: any) => void, path: string, asset: any) {\n\t\tthis.toLoad--;\n\t\tthis.loaded++;\n\t\tthis.assets[path] = asset;\n\t\tif (callback) callback(path, asset);\n\t}\n\n\tprivate error(callback: (path: string, message: string) => void, path: string, message: string) {\n\t\tthis.toLoad--;\n\t\tthis.loaded++;\n\t\tthis.errors[path] = message;\n\t\tif (callback) callback(path, message);\n\t}\n\n\tsetRawDataURI(path: string, data: string) {\n\t\tthis.downloader.rawDataUris[this.pathPrefix + path] = data;\n\t}\n\n\tloadBinary(path: string,\n\t\tsuccess: (path: string, binary: Uint8Array) => void = null,\n\t\terror: (path: string, message: string) => void = null) {\n\t\tpath = this.start(path);\n\n\t\tthis.downloader.downloadBinary(path, (data: Uint8Array): void => {\n\t\t\tthis.success(success, path, data);\n\t\t}, (status: number, responseText: string): void => {\n\t\t\tthis.error(error, path, `Couldn't load binary ${path}: status ${status}, ${responseText}`);\n\t\t});\n\t}\n\n\tloadText(path: string,\n\t\tsuccess: (path: string, text: string) => void = null,\n\t\terror: (path: string, message: string) => void = null) {\n\t\tpath = this.start(path);\n\n\t\tthis.downloader.downloadText(path, (data: string): void => {\n\t\t\tthis.success(success, path, data);\n\t\t}, (status: number, responseText: string): void => {\n\t\t\tthis.error(error, path, `Couldn't load text ${path}: status ${status}, ${responseText}`);\n\t\t});\n\t}\n\n\tloadJson(path: string,\n\t\tsuccess: (path: string, object: object) => void = null,\n\t\terror: (path: string, message: string) => void = null) {\n\t\tpath = this.start(path);\n\n\t\tthis.downloader.downloadJson(path, (data: object): void => {\n\t\t\tthis.success(success, path, data);\n\t\t}, (status: number, responseText: string): void => {\n\t\t\tthis.error(error, path, `Couldn't load JSON ${path}: status ${status}, ${responseText}`);\n\t\t});\n\t}\n\n\tloadTexture(path: string,\n\t\tsuccess: (path: string, texture: Texture) => void = null,\n\t\terror: (path: string, message: string) => void = null) {\n\t\tpath = this.start(path);\n\n\t\tlet isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document);\n\t\tlet isWebWorker = !isBrowser; // && typeof importScripts !== 'undefined';\n\t\tif (isWebWorker) {\n\t\t\tfetch(path, { mode: \"cors\" }).then((response) => {\n\t\t\t\tif (response.ok) return response.blob();\n\t\t\t\tthis.error(error, path, `Couldn't load image: ${path}`);\n\t\t\t\treturn null;\n\t\t\t}).then((blob) => {\n\t\t\t\treturn blob ? createImageBitmap(blob, { premultiplyAlpha: \"none\", colorSpaceConversion: \"none\" }) : null;\n\t\t\t}).then((bitmap) => {\n\t\t\t\tif (bitmap) this.success(success, path, this.textureLoader(bitmap));\n\t\t\t});\n\t\t} else {\n\t\t\tlet image = new Image();\n\t\t\timage.crossOrigin = \"anonymous\";\n\t\t\timage.onload = () => {\n\t\t\t\tthis.success(success, path, this.textureLoader(image));\n\t\t\t};\n\t\t\timage.onerror = () => {\n\t\t\t\tthis.error(error, path, `Couldn't load image: ${path}`);\n\t\t\t};\n\t\t\tif (this.downloader.rawDataUris[path]) path = this.downloader.rawDataUris[path];\n\t\t\timage.src = path;\n\t\t}\n\t}\n\n\tloadTextureAtlas(path: string,\n\t\tsuccess: (path: string, atlas: TextureAtlas) => void = null,\n\t\terror: (path: string, message: string) => void = null\n\t) {\n\t\tlet index = path.lastIndexOf(\"/\");\n\t\tlet parent = index >= 0 ? path.substring(0, index + 1) : \"\";\n\t\tpath = this.start(path);\n\n\t\tthis.downloader.downloadText(path, (atlasText: string): void => {\n\t\t\ttry {\n\t\t\t\tlet atlas = new TextureAtlas(atlasText);\n\t\t\t\tlet toLoad = atlas.pages.length, abort = false;\n\t\t\t\tfor (let page of atlas.pages) {\n\t\t\t\t\tthis.loadTexture(parent + page.name,\n\t\t\t\t\t\t(imagePath: string, texture: Texture) => {\n\t\t\t\t\t\t\tif (!abort) {\n\t\t\t\t\t\t\t\tpage.setTexture(texture);\n\t\t\t\t\t\t\t\tif (--toLoad == 0) this.success(success, path, atlas);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(imagePath: string, message: string) => {\n\t\t\t\t\t\t\tif (!abort) this.error(error, path, `Couldn't load texture atlas ${path} page image: ${imagePath}`);\n\t\t\t\t\t\t\tabort = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis.error(error, path, `Couldn't parse texture atlas ${path}: ${e.message}`);\n\t\t\t}\n\t\t}, (status: number, responseText: string): void => {\n\t\t\tthis.error(error, path, `Couldn't load texture atlas ${path}: status ${status}, ${responseText}`);\n\t\t});\n\t}\n\n\tget(path: string) {\n\t\treturn this.assets[this.pathPrefix + path];\n\t}\n\n\trequire(path: string) {\n\t\tpath = this.pathPrefix + path;\n\t\tlet asset = this.assets[path];\n\t\tif (asset) return asset;\n\t\tlet error = this.errors[path];\n\t\tthrow Error(\"Asset not found: \" + path + (error ? \"\\n\" + error : \"\"));\n\t}\n\n\tremove(path: string) {\n\t\tpath = this.pathPrefix + path;\n\t\tlet asset = this.assets[path];\n\t\tif ((asset).dispose) (asset).dispose();\n\t\tdelete this.assets[path];\n\t\treturn asset;\n\t}\n\n\tremoveAll() {\n\t\tfor (let key in this.assets) {\n\t\t\tlet asset = this.assets[key];\n\t\t\tif ((asset).dispose) (asset).dispose();\n\t\t}\n\t\tthis.assets = {};\n\t}\n\n\tisLoadingComplete(): boolean {\n\t\treturn this.toLoad == 0;\n\t}\n\n\tgetToLoad(): number {\n\t\treturn this.toLoad;\n\t}\n\n\tgetLoaded(): number {\n\t\treturn this.loaded;\n\t}\n\n\tdispose() {\n\t\tthis.removeAll();\n\t}\n\n\thasErrors() {\n\t\treturn Object.keys(this.errors).length > 0;\n\t}\n\n\tgetErrors() {\n\t\treturn this.errors;\n\t}\n}\n\nexport class Downloader {\n\tprivate callbacks: StringMap> = {};\n\trawDataUris: StringMap = {};\n\n\tdownloadText(url: string, success: (data: string) => void, error: (status: number, responseText: string) => void) {\n\t\tif (this.rawDataUris[url]) url = this.rawDataUris[url];\n\t\tif (this.start(url, success, error)) return;\n\t\tlet request = new XMLHttpRequest();\n\t\trequest.overrideMimeType(\"text/html\");\n\t\trequest.open(\"GET\", url, true);\n\t\tlet done = () => {\n\t\t\tthis.finish(url, request.status, request.responseText);\n\t\t};\n\t\trequest.onload = done;\n\t\trequest.onerror = done;\n\t\trequest.send();\n\t}\n\n\tdownloadJson(url: string, success: (data: object) => void, error: (status: number, responseText: string) => void) {\n\t\tthis.downloadText(url, (data: string): void => {\n\t\t\tsuccess(JSON.parse(data));\n\t\t}, error);\n\t}\n\n\tdownloadBinary(url: string, success: (data: Uint8Array) => void, error: (status: number, responseText: string) => void) {\n\t\tif (this.rawDataUris[url]) url = this.rawDataUris[url];\n\t\tif (this.start(url, success, error)) return;\n\t\tlet request = new XMLHttpRequest();\n\t\trequest.open(\"GET\", url, true);\n\t\trequest.responseType = \"arraybuffer\";\n\t\tlet onerror = () => {\n\t\t\tthis.finish(url, request.status, request.responseText);\n\t\t};\n\t\trequest.onload = () => {\n\t\t\tif (request.status == 200)\n\t\t\t\tthis.finish(url, 200, new Uint8Array(request.response as ArrayBuffer));\n\t\t\telse\n\t\t\t\tonerror();\n\t\t};\n\t\trequest.onerror = onerror;\n\t\trequest.send();\n\t}\n\n\tprivate start(url: string, success: any, error: any) {\n\t\tlet callbacks = this.callbacks[url];\n\t\ttry {\n\t\t\tif (callbacks) return true;\n\t\t\tthis.callbacks[url] = callbacks = [];\n\t\t} finally {\n\t\t\tcallbacks.push(success, error);\n\t\t}\n\t}\n\n\tprivate finish(url: string, status: number, data: any) {\n\t\tlet callbacks = this.callbacks[url];\n\t\tdelete this.callbacks[url];\n\t\tlet args = status == 200 ? [data] : [status, data];\n\t\tfor (let i = args.length - 1, n = callbacks.length; i < n; i += 2)\n\t\t\tcallbacks[i].apply(null, args);\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { EventData } from \"./EventData\";\n\n/** Stores the current pose values for an {@link Event}.\n *\n * See Timeline {@link Timeline#apply()},\n * AnimationStateListener {@link AnimationStateListener#event()}, and\n * [Events](http://esotericsoftware.com/spine-events) in the Spine User Guide. */\nexport class Event {\n\tdata: EventData;\n\tintValue: number;\n\tfloatValue: number;\n\tstringValue: string;\n\ttime: number;\n\tvolume: number;\n\tbalance: number;\n\n\tconstructor(time: number, data: EventData) {\n\t\tif (!data) throw new Error(\"data cannot be null.\");\n\t\tthis.time = time;\n\t\tthis.data = data;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n/** Stores the setup pose values for an {@link Event}.\n *\n * See [Events](http://esotericsoftware.com/spine-events) in the Spine User Guide. */\nexport class EventData {\n\tname: string;\n\tintValue: number;\n\tfloatValue: number;\n\tstringValue: string;\n\taudioPath: string;\n\tvolume: number;\n\tbalance: number;\n\n\tconstructor(name: string) {\n\t\tthis.name = name;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Bone } from \"./Bone\";\nimport { TransformMode } from \"./BoneData\";\nimport { IkConstraintData } from \"./IkConstraintData\";\nimport { Skeleton } from \"./Skeleton\";\nimport { Updatable } from \"./Updatable\";\nimport { MathUtils } from \"./Utils\";\n\n/** Stores the current pose for an IK constraint. An IK constraint adjusts the rotation of 1 or 2 constrained bones so the tip of\n * the last bone is as close to the target bone as possible.\n *\n * See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide. */\nexport class IkConstraint implements Updatable {\n\t/** The IK constraint's setup pose data. */\n\tdata: IkConstraintData;\n\n\t/** The bones that will be modified by this IK constraint. */\n\tbones: Array;\n\n\t/** The bone that is the IK target. */\n\ttarget: Bone;\n\n\t/** Controls the bend direction of the IK bones, either 1 or -1. */\n\tbendDirection = 0;\n\n\t/** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */\n\tcompress = false;\n\n\t/** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained\n\t * and the parent bone has local nonuniform scale, stretch is not applied. */\n\tstretch = false;\n\n\t/** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */\n\tmix = 1;\n\n\t/** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */\n\tsoftness = 0;\n\tactive = false;\n\n\tconstructor(data: IkConstraintData, skeleton: Skeleton) {\n\t\tif (!data) throw new Error(\"data cannot be null.\");\n\t\tif (!skeleton) throw new Error(\"skeleton cannot be null.\");\n\t\tthis.data = data;\n\t\tthis.mix = data.mix;\n\t\tthis.softness = data.softness;\n\t\tthis.bendDirection = data.bendDirection;\n\t\tthis.compress = data.compress;\n\t\tthis.stretch = data.stretch;\n\n\t\tthis.bones = new Array();\n\t\tfor (let i = 0; i < data.bones.length; i++)\n\t\t\tthis.bones.push(skeleton.findBone(data.bones[i].name));\n\t\tthis.target = skeleton.findBone(data.target.name);\n\t}\n\n\tisActive() {\n\t\treturn this.active;\n\t}\n\n\tupdate() {\n\t\tif (this.mix == 0) return;\n\t\tlet target = this.target;\n\t\tlet bones = this.bones;\n\t\tswitch (bones.length) {\n\t\t\tcase 1:\n\t\t\t\tthis.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.data.uniform, this.softness, this.mix);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** Applies 1 bone IK. The target is specified in the world coordinate system. */\n\tapply1(bone: Bone, targetX: number, targetY: number, compress: boolean, stretch: boolean, uniform: boolean, alpha: number) {\n\t\tlet p = bone.parent;\n\t\tlet pa = p.a, pb = p.b, pc = p.c, pd = p.d;\n\t\tlet rotationIK = -bone.ashearX - bone.arotation, tx = 0, ty = 0;\n\n\t\tswitch (bone.data.transformMode) {\n\t\t\tcase TransformMode.OnlyTranslation:\n\t\t\t\ttx = targetX - bone.worldX;\n\t\t\t\tty = targetY - bone.worldY;\n\t\t\t\tbreak;\n\t\t\tcase TransformMode.NoRotationOrReflection:\n\t\t\t\tlet s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);\n\t\t\t\tlet sa = pa / bone.skeleton.scaleX;\n\t\t\t\tlet sc = pc / bone.skeleton.scaleY;\n\t\t\t\tpb = -sc * s * bone.skeleton.scaleX;\n\t\t\t\tpd = sa * s * bone.skeleton.scaleY;\n\t\t\t\trotationIK += Math.atan2(sc, sa) * MathUtils.radDeg;\n\t\t\t// Fall through\n\t\t\tdefault:\n\t\t\t\tlet x = targetX - p.worldX, y = targetY - p.worldY;\n\t\t\t\tlet d = pa * pd - pb * pc;\n\t\t\t\ttx = (x * pd - y * pb) / d - bone.ax;\n\t\t\t\tty = (y * pa - x * pc) / d - bone.ay;\n\t\t}\n\t\trotationIK += Math.atan2(ty, tx) * MathUtils.radDeg;\n\t\tif (bone.ascaleX < 0) rotationIK += 180;\n\t\tif (rotationIK > 180)\n\t\t\trotationIK -= 360;\n\t\telse if (rotationIK < -180)\n\t\t\trotationIK += 360;\n\t\tlet sx = bone.ascaleX, sy = bone.ascaleY;\n\t\tif (compress || stretch) {\n\t\t\tswitch (bone.data.transformMode) {\n\t\t\t\tcase TransformMode.NoScale:\n\t\t\t\tcase TransformMode.NoScaleOrReflection:\n\t\t\t\t\ttx = targetX - bone.worldX;\n\t\t\t\t\tty = targetY - bone.worldY;\n\t\t\t}\n\t\t\tlet b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty);\n\t\t\tif ((compress && dd < b) || (stretch && dd > b) && b > 0.0001) {\n\t\t\t\tlet s = (dd / b - 1) * alpha + 1;\n\t\t\t\tsx *= s;\n\t\t\t\tif (uniform) sy *= s;\n\t\t\t}\n\t\t}\n\t\tbone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX,\n\t\t\tbone.ashearY);\n\t}\n\n\t/** Applies 2 bone IK. The target is specified in the world coordinate system.\n\t * @param child A direct descendant of the parent bone. */\n\tapply2(parent: Bone, child: Bone, targetX: number, targetY: number, bendDir: number, stretch: boolean, uniform: boolean, softness: number, alpha: number) {\n\t\tlet px = parent.ax, py = parent.ay, psx = parent.ascaleX, psy = parent.ascaleY, sx = psx, sy = psy, csx = child.ascaleX;\n\t\tlet os1 = 0, os2 = 0, s2 = 0;\n\t\tif (psx < 0) {\n\t\t\tpsx = -psx;\n\t\t\tos1 = 180;\n\t\t\ts2 = -1;\n\t\t} else {\n\t\t\tos1 = 0;\n\t\t\ts2 = 1;\n\t\t}\n\t\tif (psy < 0) {\n\t\t\tpsy = -psy;\n\t\t\ts2 = -s2;\n\t\t}\n\t\tif (csx < 0) {\n\t\t\tcsx = -csx;\n\t\t\tos2 = 180;\n\t\t} else\n\t\t\tos2 = 0;\n\t\tlet cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = parent.a, b = parent.b, c = parent.c, d = parent.d;\n\t\tlet u = Math.abs(psx - psy) <= 0.0001;\n\t\tif (!u || stretch) {\n\t\t\tcy = 0;\n\t\t\tcwx = a * cx + parent.worldX;\n\t\t\tcwy = c * cx + parent.worldY;\n\t\t} else {\n\t\t\tcy = child.ay;\n\t\t\tcwx = a * cx + b * cy + parent.worldX;\n\t\t\tcwy = c * cx + d * cy + parent.worldY;\n\t\t}\n\t\tlet pp = parent.parent;\n\t\ta = pp.a;\n\t\tb = pp.b;\n\t\tc = pp.c;\n\t\td = pp.d;\n\t\tlet id = 1 / (a * d - b * c), x = cwx - pp.worldX, y = cwy - pp.worldY;\n\t\tlet dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py;\n\t\tlet l1 = Math.sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1, a2;\n\t\tif (l1 < 0.0001) {\n\t\t\tthis.apply1(parent, targetX, targetY, false, stretch, false, alpha);\n\t\t\tchild.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);\n\t\t\treturn;\n\t\t}\n\t\tx = targetX - pp.worldX;\n\t\ty = targetY - pp.worldY;\n\t\tlet tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py;\n\t\tlet dd = tx * tx + ty * ty;\n\t\tif (softness != 0) {\n\t\t\tsoftness *= psx * (csx + 1) * 0.5;\n\t\t\tlet td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;\n\t\t\tif (sd > 0) {\n\t\t\t\tlet p = Math.min(1, sd / (softness * 2)) - 1;\n\t\t\t\tp = (sd - softness * (1 - p * p)) / td;\n\t\t\t\ttx -= p * tx;\n\t\t\t\tty -= p * ty;\n\t\t\t\tdd = tx * tx + ty * ty;\n\t\t\t}\n\t\t}\n\t\touter:\n\t\tif (u) {\n\t\t\tl2 *= psx;\n\t\t\tlet cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);\n\t\t\tif (cos < -1) {\n\t\t\t\tcos = -1;\n\t\t\t\ta2 = Math.PI * bendDir;\n\t\t\t} else if (cos > 1) {\n\t\t\t\tcos = 1;\n\t\t\t\ta2 = 0;\n\t\t\t\tif (stretch) {\n\t\t\t\t\ta = (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;\n\t\t\t\t\tsx *= a;\n\t\t\t\t\tif (uniform) sy *= a;\n\t\t\t\t}\n\t\t\t} else\n\t\t\t\ta2 = Math.acos(cos) * bendDir;\n\t\t\ta = l1 + l2 * cos;\n\t\t\tb = l2 * Math.sin(a2);\n\t\t\ta1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);\n\t\t} else {\n\t\t\ta = psx * l2;\n\t\t\tb = psy * l2;\n\t\t\tlet aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);\n\t\t\tc = bb * l1 * l1 + aa * dd - aa * bb;\n\t\t\tlet c1 = -2 * bb * l1, c2 = bb - aa;\n\t\t\td = c1 * c1 - 4 * c2 * c;\n\t\t\tif (d >= 0) {\n\t\t\t\tlet q = Math.sqrt(d);\n\t\t\t\tif (c1 < 0) q = -q;\n\t\t\t\tq = -(c1 + q) * 0.5;\n\t\t\t\tlet r0 = q / c2, r1 = c / q;\n\t\t\t\tlet r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;\n\t\t\t\tif (r * r <= dd) {\n\t\t\t\t\ty = Math.sqrt(dd - r * r) * bendDir;\n\t\t\t\t\ta1 = ta - Math.atan2(y, r);\n\t\t\t\t\ta2 = Math.atan2(y / psy, (r - l1) / psx);\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet minAngle = MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0;\n\t\t\tlet maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;\n\t\t\tc = -a * l1 / (aa - bb);\n\t\t\tif (c >= -1 && c <= 1) {\n\t\t\t\tc = Math.acos(c);\n\t\t\t\tx = a * Math.cos(c) + l1;\n\t\t\t\ty = b * Math.sin(c);\n\t\t\t\td = x * x + y * y;\n\t\t\t\tif (d < minDist) {\n\t\t\t\t\tminAngle = c;\n\t\t\t\t\tminDist = d;\n\t\t\t\t\tminX = x;\n\t\t\t\t\tminY = y;\n\t\t\t\t}\n\t\t\t\tif (d > maxDist) {\n\t\t\t\t\tmaxAngle = c;\n\t\t\t\t\tmaxDist = d;\n\t\t\t\t\tmaxX = x;\n\t\t\t\t\tmaxY = y;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (dd <= (minDist + maxDist) * 0.5) {\n\t\t\t\ta1 = ta - Math.atan2(minY * bendDir, minX);\n\t\t\t\ta2 = minAngle * bendDir;\n\t\t\t} else {\n\t\t\t\ta1 = ta - Math.atan2(maxY * bendDir, maxX);\n\t\t\t\ta2 = maxAngle * bendDir;\n\t\t\t}\n\t\t}\n\t\tlet os = Math.atan2(cy, cx) * s2;\n\t\tlet rotation = parent.arotation;\n\t\ta1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;\n\t\tif (a1 > 180)\n\t\t\ta1 -= 360;\n\t\telse if (a1 < -180) //\n\t\t\ta1 += 360;\n\t\tparent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, sy, 0, 0);\n\t\trotation = child.arotation;\n\t\ta2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;\n\t\tif (a2 > 180)\n\t\t\ta2 -= 360;\n\t\telse if (a2 < -180) //\n\t\t\ta2 += 360;\n\t\tchild.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { BoneData } from \"./BoneData\";\nimport { ConstraintData } from \"./ConstraintData\";\n\n\n/** Stores the setup pose for an {@link IkConstraint}.\n *

\n * See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide. */\nexport class IkConstraintData extends ConstraintData {\n\t/** The bones that are constrained by this IK constraint. */\n\tbones = new Array();\n\n\t/** The bone that is the IK target. */\n\ttarget: BoneData;\n\n\t/** Controls the bend direction of the IK bones, either 1 or -1. */\n\tbendDirection = 1;\n\n\t/** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */\n\tcompress = false;\n\n\t/** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained\n\t * and the parent bone has local nonuniform scale, stretch is not applied. */\n\tstretch = false;\n\n\t/** When true, only a single bone is being constrained, and {@link #getCompress()} or {@link #getStretch()} is used, the bone\n\t * is scaled on both the X and Y axes. */\n\tuniform = false;\n\n\t/** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */\n\tmix = 1;\n\n\t/** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */\n\tsoftness = 0;\n\n\tconstructor(name: string) {\n\t\tsuper(name, 0, false);\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { BoneData } from \"./BoneData\";\nimport { ConstraintData } from \"./ConstraintData\";\nimport { SlotData } from \"./SlotData\";\n\n\n/** Stores the setup pose for a {@link PathConstraint}.\n *\n * See [path constraints](http://esotericsoftware.com/spine-path-constraints) in the Spine User Guide. */\nexport class PathConstraintData extends ConstraintData {\n\n\t/** The bones that will be modified by this path constraint. */\n\tbones = new Array();\n\n\t/** The slot whose path attachment will be used to constrained the bones. */\n\ttarget: SlotData;\n\n\t/** The mode for positioning the first bone on the path. */\n\tpositionMode: PositionMode;\n\n\t/** The mode for positioning the bones after the first bone on the path. */\n\tspacingMode: SpacingMode;\n\n\t/** The mode for adjusting the rotation of the bones. */\n\trotateMode: RotateMode;\n\n\t/** An offset added to the constrained bone rotation. */\n\toffsetRotation: number;\n\n\t/** The position along the path. */\n\tposition: number;\n\n\t/** The spacing between bones. */\n\tspacing: number;\n\n\tmixRotate = 0;\n\tmixX = 0;\n\tmixY = 0;\n\n\tconstructor(name: string) {\n\t\tsuper(name, 0, false);\n\t}\n}\n\n/** Controls how the first bone is positioned along the path.\n *\n * See [position](http://esotericsoftware.com/spine-path-constraints#Position) in the Spine User Guide. */\nexport enum PositionMode { Fixed, Percent }\n\n/** Controls how bones after the first bone are positioned along the path.\n *\n * See [spacing](http://esotericsoftware.com/spine-path-constraints#Spacing) in the Spine User Guide. */\nexport enum SpacingMode { Length, Fixed, Percent, Proportional }\n\n/** Controls how bones are rotated, translated, and scaled to match the path.\n *\n * See [rotate mix](http://esotericsoftware.com/spine-path-constraints#Rotate-mix) in the Spine User Guide. */\nexport enum RotateMode { Tangent, Chain, ChainScale }\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { PathAttachment } from \"./attachments/PathAttachment\";\nimport { Bone } from \"./Bone\";\nimport { PathConstraintData, RotateMode, SpacingMode, PositionMode } from \"./PathConstraintData\";\nimport { Skeleton } from \"./Skeleton\";\nimport { Slot } from \"./Slot\";\nimport { Updatable } from \"./Updatable\";\nimport { Utils, MathUtils } from \"./Utils\";\n\n\n/** Stores the current pose for a path constraint. A path constraint adjusts the rotation, translation, and scale of the\n * constrained bones so they follow a {@link PathAttachment}.\n *\n * See [Path constraints](http://esotericsoftware.com/spine-path-constraints) in the Spine User Guide. */\nexport class PathConstraint implements Updatable {\n\tstatic NONE = -1; static BEFORE = -2; static AFTER = -3;\n\tstatic epsilon = 0.00001;\n\n\t/** The path constraint's setup pose data. */\n\tdata: PathConstraintData;\n\n\t/** The bones that will be modified by this path constraint. */\n\tbones: Array;\n\n\t/** The slot whose path attachment will be used to constrained the bones. */\n\ttarget: Slot;\n\n\t/** The position along the path. */\n\tposition = 0;\n\n\t/** The spacing between bones. */\n\tspacing = 0;\n\n\tmixRotate = 0;\n\n\tmixX = 0;\n\n\tmixY = 0;\n\n\tspaces = new Array(); positions = new Array();\n\tworld = new Array(); curves = new Array(); lengths = new Array();\n\tsegments = new Array();\n\n\tactive = false;\n\n\tconstructor(data: PathConstraintData, skeleton: Skeleton) {\n\t\tif (!data) throw new Error(\"data cannot be null.\");\n\t\tif (!skeleton) throw new Error(\"skeleton cannot be null.\");\n\t\tthis.data = data;\n\t\tthis.bones = new Array();\n\t\tfor (let i = 0, n = data.bones.length; i < n; i++)\n\t\t\tthis.bones.push(skeleton.findBone(data.bones[i].name));\n\t\tthis.target = skeleton.findSlot(data.target.name);\n\t\tthis.position = data.position;\n\t\tthis.spacing = data.spacing;\n\t\tthis.mixRotate = data.mixRotate;\n\t\tthis.mixX = data.mixX;\n\t\tthis.mixY = data.mixY;\n\t}\n\n\tisActive() {\n\t\treturn this.active;\n\t}\n\n\tupdate() {\n\t\tlet attachment = this.target.getAttachment();\n\t\tif (!(attachment instanceof PathAttachment)) return;\n\n\t\tlet mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY;\n\t\tif (mixRotate == 0 && mixX == 0 && mixY == 0) return;\n\n\t\tlet data = this.data;\n\t\tlet tangents = data.rotateMode == RotateMode.Tangent, scale = data.rotateMode == RotateMode.ChainScale;\n\n\t\tlet bones = this.bones;\n\t\tlet boneCount = bones.length, spacesCount = tangents ? boneCount : boneCount + 1;\n\t\tlet spaces = Utils.setArraySize(this.spaces, spacesCount), lengths: Array = scale ? this.lengths = Utils.setArraySize(this.lengths, boneCount) : null;\n\t\tlet spacing = this.spacing;\n\n\t\tswitch (data.spacingMode) {\n\t\t\tcase SpacingMode.Percent:\n\t\t\t\tif (scale) {\n\t\t\t\t\tfor (let i = 0, n = spacesCount - 1; i < n; i++) {\n\t\t\t\t\t\tlet bone = bones[i];\n\t\t\t\t\t\tlet setupLength = bone.data.length;\n\t\t\t\t\t\tif (setupLength < PathConstraint.epsilon)\n\t\t\t\t\t\t\tlengths[i] = 0;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlet x = setupLength * bone.a, y = setupLength * bone.c;\n\t\t\t\t\t\t\tlengths[i] = Math.sqrt(x * x + y * y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tUtils.arrayFill(spaces, 1, spacesCount, spacing);\n\t\t\t\tbreak;\n\t\t\tcase SpacingMode.Proportional:\n\t\t\t\tlet sum = 0;\n\t\t\t\tfor (let i = 0, n = spacesCount - 1; i < n;) {\n\t\t\t\t\tlet bone = bones[i];\n\t\t\t\t\tlet setupLength = bone.data.length;\n\t\t\t\t\tif (setupLength < PathConstraint.epsilon) {\n\t\t\t\t\t\tif (scale) lengths[i] = 0;\n\t\t\t\t\t\tspaces[++i] = spacing;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet x = setupLength * bone.a, y = setupLength * bone.c;\n\t\t\t\t\t\tlet length = Math.sqrt(x * x + y * y);\n\t\t\t\t\t\tif (scale) lengths[i] = length;\n\t\t\t\t\t\tspaces[++i] = length;\n\t\t\t\t\t\tsum += length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (sum > 0) {\n\t\t\t\t\tsum = spacesCount / sum * spacing;\n\t\t\t\t\tfor (let i = 1; i < spacesCount; i++)\n\t\t\t\t\t\tspaces[i] *= sum;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlet lengthSpacing = data.spacingMode == SpacingMode.Length;\n\t\t\t\tfor (let i = 0, n = spacesCount - 1; i < n;) {\n\t\t\t\t\tlet bone = bones[i];\n\t\t\t\t\tlet setupLength = bone.data.length;\n\t\t\t\t\tif (setupLength < PathConstraint.epsilon) {\n\t\t\t\t\t\tif (scale) lengths[i] = 0;\n\t\t\t\t\t\tspaces[++i] = spacing;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet x = setupLength * bone.a, y = setupLength * bone.c;\n\t\t\t\t\t\tlet length = Math.sqrt(x * x + y * y);\n\t\t\t\t\t\tif (scale) lengths[i] = length;\n\t\t\t\t\t\tspaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\n\t\tlet positions = this.computeWorldPositions(attachment, spacesCount, tangents);\n\t\tlet boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation;\n\t\tlet tip = false;\n\t\tif (offsetRotation == 0)\n\t\t\ttip = data.rotateMode == RotateMode.Chain;\n\t\telse {\n\t\t\ttip = false;\n\t\t\tlet p = this.target.bone;\n\t\t\toffsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad;\n\t\t}\n\t\tfor (let i = 0, p = 3; i < boneCount; i++, p += 3) {\n\t\t\tlet bone = bones[i];\n\t\t\tbone.worldX += (boneX - bone.worldX) * mixX;\n\t\t\tbone.worldY += (boneY - bone.worldY) * mixY;\n\t\t\tlet x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY;\n\t\t\tif (scale) {\n\t\t\t\tlet length = lengths[i];\n\t\t\t\tif (length != 0) {\n\t\t\t\t\tlet s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * mixRotate + 1;\n\t\t\t\t\tbone.a *= s;\n\t\t\t\t\tbone.c *= s;\n\t\t\t\t}\n\t\t\t}\n\t\t\tboneX = x;\n\t\t\tboneY = y;\n\t\t\tif (mixRotate > 0) {\n\t\t\t\tlet a = bone.a, b = bone.b, c = bone.c, d = bone.d, r = 0, cos = 0, sin = 0;\n\t\t\t\tif (tangents)\n\t\t\t\t\tr = positions[p - 1];\n\t\t\t\telse if (spaces[i + 1] == 0)\n\t\t\t\t\tr = positions[p + 2];\n\t\t\t\telse\n\t\t\t\t\tr = Math.atan2(dy, dx);\n\t\t\t\tr -= Math.atan2(c, a);\n\t\t\t\tif (tip) {\n\t\t\t\t\tcos = Math.cos(r);\n\t\t\t\t\tsin = Math.sin(r);\n\t\t\t\t\tlet length = bone.data.length;\n\t\t\t\t\tboneX += (length * (cos * a - sin * c) - dx) * mixRotate;\n\t\t\t\t\tboneY += (length * (sin * a + cos * c) - dy) * mixRotate;\n\t\t\t\t} else {\n\t\t\t\t\tr += offsetRotation;\n\t\t\t\t}\n\t\t\t\tif (r > MathUtils.PI)\n\t\t\t\t\tr -= MathUtils.PI2;\n\t\t\t\telse if (r < -MathUtils.PI) //\n\t\t\t\t\tr += MathUtils.PI2;\n\t\t\t\tr *= mixRotate;\n\t\t\t\tcos = Math.cos(r);\n\t\t\t\tsin = Math.sin(r);\n\t\t\t\tbone.a = cos * a - sin * c;\n\t\t\t\tbone.b = cos * b - sin * d;\n\t\t\t\tbone.c = sin * a + cos * c;\n\t\t\t\tbone.d = sin * b + cos * d;\n\t\t\t}\n\t\t\tbone.updateAppliedTransform();\n\t\t}\n\t}\n\n\tcomputeWorldPositions(path: PathAttachment, spacesCount: number, tangents: boolean) {\n\t\tlet target = this.target;\n\t\tlet position = this.position;\n\t\tlet spaces = this.spaces, out = Utils.setArraySize(this.positions, spacesCount * 3 + 2), world: Array = null;\n\t\tlet closed = path.closed;\n\t\tlet verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint.NONE;\n\n\t\tif (!path.constantSpeed) {\n\t\t\tlet lengths = path.lengths;\n\t\t\tcurveCount -= closed ? 1 : 2;\n\t\t\tlet pathLength = lengths[curveCount];\n\t\t\tif (this.data.positionMode == PositionMode.Percent) position *= pathLength;\n\n\t\t\tlet multiplier;\n\t\t\tswitch (this.data.spacingMode) {\n\t\t\t\tcase SpacingMode.Percent:\n\t\t\t\t\tmultiplier = pathLength;\n\t\t\t\t\tbreak;\n\t\t\t\tcase SpacingMode.Proportional:\n\t\t\t\t\tmultiplier = pathLength / spacesCount;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tmultiplier = 1;\n\t\t\t}\n\t\t\tworld = Utils.setArraySize(this.world, 8);\n\t\t\tfor (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {\n\t\t\t\tlet space = spaces[i] * multiplier;\n\t\t\t\tposition += space;\n\t\t\t\tlet p = position;\n\n\t\t\t\tif (closed) {\n\t\t\t\t\tp %= pathLength;\n\t\t\t\t\tif (p < 0) p += pathLength;\n\t\t\t\t\tcurve = 0;\n\t\t\t\t} else if (p < 0) {\n\t\t\t\t\tif (prevCurve != PathConstraint.BEFORE) {\n\t\t\t\t\t\tprevCurve = PathConstraint.BEFORE;\n\t\t\t\t\t\tpath.computeWorldVertices(target, 2, 4, world, 0, 2);\n\t\t\t\t\t}\n\t\t\t\t\tthis.addBeforePosition(p, world, 0, out, o);\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (p > pathLength) {\n\t\t\t\t\tif (prevCurve != PathConstraint.AFTER) {\n\t\t\t\t\t\tprevCurve = PathConstraint.AFTER;\n\t\t\t\t\t\tpath.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2);\n\t\t\t\t\t}\n\t\t\t\t\tthis.addAfterPosition(p - pathLength, world, 0, out, o);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Determine curve containing position.\n\t\t\t\tfor (; ; curve++) {\n\t\t\t\t\tlet length = lengths[curve];\n\t\t\t\t\tif (p > length) continue;\n\t\t\t\t\tif (curve == 0)\n\t\t\t\t\t\tp /= length;\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet prev = lengths[curve - 1];\n\t\t\t\t\t\tp = (p - prev) / (length - prev);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (curve != prevCurve) {\n\t\t\t\t\tprevCurve = curve;\n\t\t\t\t\tif (closed && curve == curveCount) {\n\t\t\t\t\t\tpath.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2);\n\t\t\t\t\t\tpath.computeWorldVertices(target, 0, 4, world, 4, 2);\n\t\t\t\t\t} else\n\t\t\t\t\t\tpath.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2);\n\t\t\t\t}\n\t\t\t\tthis.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o,\n\t\t\t\t\ttangents || (i > 0 && space == 0));\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\n\t\t// World vertices.\n\t\tif (closed) {\n\t\t\tverticesLength += 2;\n\t\t\tworld = Utils.setArraySize(this.world, verticesLength);\n\t\t\tpath.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2);\n\t\t\tpath.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2);\n\t\t\tworld[verticesLength - 2] = world[0];\n\t\t\tworld[verticesLength - 1] = world[1];\n\t\t} else {\n\t\t\tcurveCount--;\n\t\t\tverticesLength -= 4;\n\t\t\tworld = Utils.setArraySize(this.world, verticesLength);\n\t\t\tpath.computeWorldVertices(target, 2, verticesLength, world, 0, 2);\n\t\t}\n\n\t\t// Curve lengths.\n\t\tlet curves = Utils.setArraySize(this.curves, curveCount);\n\t\tlet pathLength = 0;\n\t\tlet x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0;\n\t\tlet tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0;\n\t\tfor (let i = 0, w = 2; i < curveCount; i++, w += 6) {\n\t\t\tcx1 = world[w];\n\t\t\tcy1 = world[w + 1];\n\t\t\tcx2 = world[w + 2];\n\t\t\tcy2 = world[w + 3];\n\t\t\tx2 = world[w + 4];\n\t\t\ty2 = world[w + 5];\n\t\t\ttmpx = (x1 - cx1 * 2 + cx2) * 0.1875;\n\t\t\ttmpy = (y1 - cy1 * 2 + cy2) * 0.1875;\n\t\t\tdddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375;\n\t\t\tdddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375;\n\t\t\tddfx = tmpx * 2 + dddfx;\n\t\t\tddfy = tmpy * 2 + dddfy;\n\t\t\tdfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667;\n\t\t\tdfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667;\n\t\t\tpathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n\t\t\tdfx += ddfx;\n\t\t\tdfy += ddfy;\n\t\t\tddfx += dddfx;\n\t\t\tddfy += dddfy;\n\t\t\tpathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n\t\t\tdfx += ddfx;\n\t\t\tdfy += ddfy;\n\t\t\tpathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n\t\t\tdfx += ddfx + dddfx;\n\t\t\tdfy += ddfy + dddfy;\n\t\t\tpathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n\t\t\tcurves[i] = pathLength;\n\t\t\tx1 = x2;\n\t\t\ty1 = y2;\n\t\t}\n\n\t\tif (this.data.positionMode == PositionMode.Percent) position *= pathLength;\n\n\t\tlet multiplier;\n\t\tswitch (this.data.spacingMode) {\n\t\t\tcase SpacingMode.Percent:\n\t\t\t\tmultiplier = pathLength;\n\t\t\t\tbreak;\n\t\t\tcase SpacingMode.Proportional:\n\t\t\t\tmultiplier = pathLength / spacesCount;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tmultiplier = 1;\n\t\t}\n\n\t\tlet segments = this.segments;\n\t\tlet curveLength = 0;\n\t\tfor (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {\n\t\t\tlet space = spaces[i] * multiplier;\n\t\t\tposition += space;\n\t\t\tlet p = position;\n\n\t\t\tif (closed) {\n\t\t\t\tp %= pathLength;\n\t\t\t\tif (p < 0) p += pathLength;\n\t\t\t\tcurve = 0;\n\t\t\t} else if (p < 0) {\n\t\t\t\tthis.addBeforePosition(p, world, 0, out, o);\n\t\t\t\tcontinue;\n\t\t\t} else if (p > pathLength) {\n\t\t\t\tthis.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Determine curve containing position.\n\t\t\tfor (; ; curve++) {\n\t\t\t\tlet length = curves[curve];\n\t\t\t\tif (p > length) continue;\n\t\t\t\tif (curve == 0)\n\t\t\t\t\tp /= length;\n\t\t\t\telse {\n\t\t\t\t\tlet prev = curves[curve - 1];\n\t\t\t\t\tp = (p - prev) / (length - prev);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Curve segment lengths.\n\t\t\tif (curve != prevCurve) {\n\t\t\t\tprevCurve = curve;\n\t\t\t\tlet ii = curve * 6;\n\t\t\t\tx1 = world[ii];\n\t\t\t\ty1 = world[ii + 1];\n\t\t\t\tcx1 = world[ii + 2];\n\t\t\t\tcy1 = world[ii + 3];\n\t\t\t\tcx2 = world[ii + 4];\n\t\t\t\tcy2 = world[ii + 5];\n\t\t\t\tx2 = world[ii + 6];\n\t\t\t\ty2 = world[ii + 7];\n\t\t\t\ttmpx = (x1 - cx1 * 2 + cx2) * 0.03;\n\t\t\t\ttmpy = (y1 - cy1 * 2 + cy2) * 0.03;\n\t\t\t\tdddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006;\n\t\t\t\tdddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006;\n\t\t\t\tddfx = tmpx * 2 + dddfx;\n\t\t\t\tddfy = tmpy * 2 + dddfy;\n\t\t\t\tdfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667;\n\t\t\t\tdfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667;\n\t\t\t\tcurveLength = Math.sqrt(dfx * dfx + dfy * dfy);\n\t\t\t\tsegments[0] = curveLength;\n\t\t\t\tfor (ii = 1; ii < 8; ii++) {\n\t\t\t\t\tdfx += ddfx;\n\t\t\t\t\tdfy += ddfy;\n\t\t\t\t\tddfx += dddfx;\n\t\t\t\t\tddfy += dddfy;\n\t\t\t\t\tcurveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n\t\t\t\t\tsegments[ii] = curveLength;\n\t\t\t\t}\n\t\t\t\tdfx += ddfx;\n\t\t\t\tdfy += ddfy;\n\t\t\t\tcurveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n\t\t\t\tsegments[8] = curveLength;\n\t\t\t\tdfx += ddfx + dddfx;\n\t\t\t\tdfy += ddfy + dddfy;\n\t\t\t\tcurveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n\t\t\t\tsegments[9] = curveLength;\n\t\t\t\tsegment = 0;\n\t\t\t}\n\n\t\t\t// Weight by segment length.\n\t\t\tp *= curveLength;\n\t\t\tfor (; ; segment++) {\n\t\t\t\tlet length = segments[segment];\n\t\t\t\tif (p > length) continue;\n\t\t\t\tif (segment == 0)\n\t\t\t\t\tp /= length;\n\t\t\t\telse {\n\t\t\t\t\tlet prev = segments[segment - 1];\n\t\t\t\t\tp = segment + (p - prev) / (length - prev);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));\n\t\t}\n\t\treturn out;\n\t}\n\n\taddBeforePosition(p: number, temp: Array, i: number, out: Array, o: number) {\n\t\tlet x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx);\n\t\tout[o] = x1 + p * Math.cos(r);\n\t\tout[o + 1] = y1 + p * Math.sin(r);\n\t\tout[o + 2] = r;\n\t}\n\n\taddAfterPosition(p: number, temp: Array, i: number, out: Array, o: number) {\n\t\tlet x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx);\n\t\tout[o] = x1 + p * Math.cos(r);\n\t\tout[o + 1] = y1 + p * Math.sin(r);\n\t\tout[o + 2] = r;\n\t}\n\n\taddCurvePosition(p: number, x1: number, y1: number, cx1: number, cy1: number, cx2: number, cy2: number, x2: number, y2: number,\n\t\tout: Array, o: number, tangents: boolean) {\n\t\tif (p == 0 || isNaN(p)) {\n\t\t\tout[o] = x1;\n\t\t\tout[o + 1] = y1;\n\t\t\tout[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);\n\t\t\treturn;\n\t\t}\n\t\tlet tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u;\n\t\tlet ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p;\n\t\tlet x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;\n\t\tout[o] = x;\n\t\tout[o + 1] = y;\n\t\tif (tangents) {\n\t\t\tif (p < 0.001)\n\t\t\t\tout[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);\n\t\t\telse\n\t\t\t\tout[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));\n\t\t}\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Attachment, VertexAttachment } from \"./attachments/Attachment\";\nimport { Bone } from \"./Bone\";\nimport { Skeleton } from \"./Skeleton\";\nimport { SlotData } from \"./SlotData\";\nimport { Color } from \"./Utils\";\n\n/** Stores a slot's current pose. Slots organize attachments for {@link Skeleton#drawOrder} purposes and provide a place to store\n * state for an attachment. State cannot be stored in an attachment itself because attachments are stateless and may be shared\n * across multiple skeletons. */\nexport class Slot {\n\t/** The slot's setup pose data. */\n\tdata: SlotData;\n\n\t/** The bone this slot belongs to. */\n\tbone: Bone;\n\n\t/** The color used to tint the slot's attachment. If {@link #getDarkColor()} is set, this is used as the light color for two\n\t * color tinting. */\n\tcolor: Color;\n\n\t/** The dark color used to tint the slot's attachment for two color tinting, or null if two color tinting is not used. The dark\n\t * color's alpha is not used. */\n\tdarkColor: Color;\n\n\tattachment: Attachment;\n\n\tprivate attachmentTime: number;\n\n\tattachmentState: number;\n\n\t/** Values to deform the slot's attachment. For an unweighted mesh, the entries are local positions for each vertex. For a\n\t * weighted mesh, the entries are an offset for each vertex which will be added to the mesh's local vertex positions.\n\t *\n\t * See {@link VertexAttachment#computeWorldVertices()} and {@link DeformTimeline}. */\n\tdeform = new Array();\n\n\tconstructor(data: SlotData, bone: Bone) {\n\t\tif (!data) throw new Error(\"data cannot be null.\");\n\t\tif (!bone) throw new Error(\"bone cannot be null.\");\n\t\tthis.data = data;\n\t\tthis.bone = bone;\n\t\tthis.color = new Color();\n\t\tthis.darkColor = !data.darkColor ? null : new Color();\n\t\tthis.setToSetupPose();\n\t}\n\n\t/** The skeleton this slot belongs to. */\n\tgetSkeleton(): Skeleton {\n\t\treturn this.bone.skeleton;\n\t}\n\n\t/** The current attachment for the slot, or null if the slot has no attachment. */\n\tgetAttachment(): Attachment {\n\t\treturn this.attachment;\n\t}\n\n\t/** Sets the slot's attachment and, if the attachment changed, resets {@link #attachmentTime} and clears the {@link #deform}.\n\t * The deform is not cleared if the old attachment has the same {@link VertexAttachment#getDeformAttachment()} as the specified\n\t * attachment.\n\t * @param attachment May be null. */\n\tsetAttachment(attachment: Attachment) {\n\t\tif (this.attachment == attachment) return;\n\t\tif (!(attachment instanceof VertexAttachment) || !(this.attachment instanceof VertexAttachment)\n\t\t\t|| (attachment).deformAttachment != (this.attachment).deformAttachment) {\n\t\t\tthis.deform.length = 0;\n\t\t}\n\t\tthis.attachment = attachment;\n\t\tthis.attachmentTime = this.bone.skeleton.time;\n\t}\n\n\tsetAttachmentTime(time: number) {\n\t\tthis.attachmentTime = this.bone.skeleton.time - time;\n\t}\n\n\t/** The time that has elapsed since the last time the attachment was set or cleared. Relies on Skeleton\n\t * {@link Skeleton#time}. */\n\tgetAttachmentTime(): number {\n\t\treturn this.bone.skeleton.time - this.attachmentTime;\n\t}\n\n\t/** Sets this slot to the setup pose. */\n\tsetToSetupPose() {\n\t\tthis.color.setFromColor(this.data.color);\n\t\tif (this.darkColor) this.darkColor.setFromColor(this.data.darkColor);\n\t\tif (!this.data.attachmentName)\n\t\t\tthis.attachment = null;\n\t\telse {\n\t\t\tthis.attachment = null;\n\t\t\tthis.setAttachment(this.bone.skeleton.getAttachment(this.data.index, this.data.attachmentName));\n\t\t}\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Bone } from \"./Bone\";\nimport { Skeleton } from \"./Skeleton\";\nimport { TransformConstraintData } from \"./TransformConstraintData\";\nimport { Updatable } from \"./Updatable\";\nimport { Vector2, MathUtils } from \"./Utils\";\n\n\n/** Stores the current pose for a transform constraint. A transform constraint adjusts the world transform of the constrained\n * bones to match that of the target bone.\n *\n * See [Transform constraints](http://esotericsoftware.com/spine-transform-constraints) in the Spine User Guide. */\nexport class TransformConstraint implements Updatable {\n\n\t/** The transform constraint's setup pose data. */\n\tdata: TransformConstraintData;\n\n\t/** The bones that will be modified by this transform constraint. */\n\tbones: Array;\n\n\t/** The target bone whose world transform will be copied to the constrained bones. */\n\ttarget: Bone;\n\n\tmixRotate = 0; mixX = 0; mixY = 0; mixScaleX = 0; mixScaleY = 0; mixShearY = 0;\n\n\ttemp = new Vector2();\n\tactive = false;\n\n\tconstructor(data: TransformConstraintData, skeleton: Skeleton) {\n\t\tif (!data) throw new Error(\"data cannot be null.\");\n\t\tif (!skeleton) throw new Error(\"skeleton cannot be null.\");\n\t\tthis.data = data;\n\t\tthis.mixRotate = data.mixRotate;\n\t\tthis.mixX = data.mixX;\n\t\tthis.mixY = data.mixY;\n\t\tthis.mixScaleX = data.mixScaleX;\n\t\tthis.mixScaleY = data.mixScaleY;\n\t\tthis.mixShearY = data.mixShearY;\n\t\tthis.bones = new Array();\n\t\tfor (let i = 0; i < data.bones.length; i++)\n\t\t\tthis.bones.push(skeleton.findBone(data.bones[i].name));\n\t\tthis.target = skeleton.findBone(data.target.name);\n\t}\n\n\tisActive() {\n\t\treturn this.active;\n\t}\n\n\tupdate() {\n\t\tif (this.mixRotate == 0 && this.mixX == 0 && this.mixY == 0 && this.mixScaleX == 0 && this.mixScaleX == 0 && this.mixShearY == 0) return;\n\n\t\tif (this.data.local) {\n\t\t\tif (this.data.relative)\n\t\t\t\tthis.applyRelativeLocal();\n\t\t\telse\n\t\t\t\tthis.applyAbsoluteLocal();\n\t\t} else {\n\t\t\tif (this.data.relative)\n\t\t\t\tthis.applyRelativeWorld();\n\t\t\telse\n\t\t\t\tthis.applyAbsoluteWorld();\n\t\t}\n\t}\n\n\tapplyAbsoluteWorld() {\n\t\tlet mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX,\n\t\t\tmixScaleY = this.mixScaleY, mixShearY = this.mixShearY;\n\t\tlet translate = mixX != 0 || mixY != 0;\n\n\t\tlet target = this.target;\n\t\tlet ta = target.a, tb = target.b, tc = target.c, td = target.d;\n\t\tlet degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;\n\t\tlet offsetRotation = this.data.offsetRotation * degRadReflect;\n\t\tlet offsetShearY = this.data.offsetShearY * degRadReflect;\n\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\n\t\t\tif (mixRotate != 0) {\n\t\t\t\tlet a = bone.a, b = bone.b, c = bone.c, d = bone.d;\n\t\t\t\tlet r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation;\n\t\t\t\tif (r > MathUtils.PI)\n\t\t\t\t\tr -= MathUtils.PI2;\n\t\t\t\telse if (r < -MathUtils.PI) //\n\t\t\t\t\tr += MathUtils.PI2;\n\t\t\t\tr *= mixRotate;\n\t\t\t\tlet cos = Math.cos(r), sin = Math.sin(r);\n\t\t\t\tbone.a = cos * a - sin * c;\n\t\t\t\tbone.b = cos * b - sin * d;\n\t\t\t\tbone.c = sin * a + cos * c;\n\t\t\t\tbone.d = sin * b + cos * d;\n\t\t\t}\n\n\t\t\tif (translate) {\n\t\t\t\tlet temp = this.temp;\n\t\t\t\ttarget.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));\n\t\t\t\tbone.worldX += (temp.x - bone.worldX) * mixX;\n\t\t\t\tbone.worldY += (temp.y - bone.worldY) * mixY;\n\t\t\t}\n\n\t\t\tif (mixScaleX != 0) {\n\t\t\t\tlet s = Math.sqrt(bone.a * bone.a + bone.c * bone.c);\n\t\t\t\tif (s != 0) s = (s + (Math.sqrt(ta * ta + tc * tc) - s + this.data.offsetScaleX) * mixScaleX) / s;\n\t\t\t\tbone.a *= s;\n\t\t\t\tbone.c *= s;\n\t\t\t}\n\t\t\tif (mixScaleY != 0) {\n\t\t\t\tlet s = Math.sqrt(bone.b * bone.b + bone.d * bone.d);\n\t\t\t\tif (s != 0) s = (s + (Math.sqrt(tb * tb + td * td) - s + this.data.offsetScaleY) * mixScaleY) / s;\n\t\t\t\tbone.b *= s;\n\t\t\t\tbone.d *= s;\n\t\t\t}\n\n\t\t\tif (mixShearY > 0) {\n\t\t\t\tlet b = bone.b, d = bone.d;\n\t\t\t\tlet by = Math.atan2(d, b);\n\t\t\t\tlet r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(bone.c, bone.a));\n\t\t\t\tif (r > MathUtils.PI)\n\t\t\t\t\tr -= MathUtils.PI2;\n\t\t\t\telse if (r < -MathUtils.PI) //\n\t\t\t\t\tr += MathUtils.PI2;\n\t\t\t\tr = by + (r + offsetShearY) * mixShearY;\n\t\t\t\tlet s = Math.sqrt(b * b + d * d);\n\t\t\t\tbone.b = Math.cos(r) * s;\n\t\t\t\tbone.d = Math.sin(r) * s;\n\t\t\t}\n\n\t\t\tbone.updateAppliedTransform();\n\t\t}\n\t}\n\n\tapplyRelativeWorld() {\n\t\tlet mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX,\n\t\t\tmixScaleY = this.mixScaleY, mixShearY = this.mixShearY;\n\t\tlet translate = mixX != 0 || mixY != 0;\n\n\t\tlet target = this.target;\n\t\tlet ta = target.a, tb = target.b, tc = target.c, td = target.d;\n\t\tlet degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;\n\t\tlet offsetRotation = this.data.offsetRotation * degRadReflect, offsetShearY = this.data.offsetShearY * degRadReflect;\n\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\n\t\t\tif (mixRotate != 0) {\n\t\t\t\tlet a = bone.a, b = bone.b, c = bone.c, d = bone.d;\n\t\t\t\tlet r = Math.atan2(tc, ta) + offsetRotation;\n\t\t\t\tif (r > MathUtils.PI)\n\t\t\t\t\tr -= MathUtils.PI2;\n\t\t\t\telse if (r < -MathUtils.PI) //\n\t\t\t\t\tr += MathUtils.PI2;\n\t\t\t\tr *= mixRotate;\n\t\t\t\tlet cos = Math.cos(r), sin = Math.sin(r);\n\t\t\t\tbone.a = cos * a - sin * c;\n\t\t\t\tbone.b = cos * b - sin * d;\n\t\t\t\tbone.c = sin * a + cos * c;\n\t\t\t\tbone.d = sin * b + cos * d;\n\t\t\t}\n\n\t\t\tif (translate) {\n\t\t\t\tlet temp = this.temp;\n\t\t\t\ttarget.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));\n\t\t\t\tbone.worldX += temp.x * mixX;\n\t\t\t\tbone.worldY += temp.y * mixY;\n\t\t\t}\n\n\t\t\tif (mixScaleX != 0) {\n\t\t\t\tlet s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * mixScaleX + 1;\n\t\t\t\tbone.a *= s;\n\t\t\t\tbone.c *= s;\n\t\t\t}\n\t\t\tif (mixScaleY != 0) {\n\t\t\t\tlet s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * mixScaleY + 1;\n\t\t\t\tbone.b *= s;\n\t\t\t\tbone.d *= s;\n\t\t\t}\n\n\t\t\tif (mixShearY > 0) {\n\t\t\t\tlet r = Math.atan2(td, tb) - Math.atan2(tc, ta);\n\t\t\t\tif (r > MathUtils.PI)\n\t\t\t\t\tr -= MathUtils.PI2;\n\t\t\t\telse if (r < -MathUtils.PI) //\n\t\t\t\t\tr += MathUtils.PI2;\n\t\t\t\tlet b = bone.b, d = bone.d;\n\t\t\t\tr = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * mixShearY;\n\t\t\t\tlet s = Math.sqrt(b * b + d * d);\n\t\t\t\tbone.b = Math.cos(r) * s;\n\t\t\t\tbone.d = Math.sin(r) * s;\n\t\t\t}\n\n\t\t\tbone.updateAppliedTransform();\n\t\t}\n\t}\n\n\tapplyAbsoluteLocal() {\n\t\tlet mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX,\n\t\t\tmixScaleY = this.mixScaleY, mixShearY = this.mixShearY;\n\n\t\tlet target = this.target;\n\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\n\t\t\tlet rotation = bone.arotation;\n\t\t\tif (mixRotate != 0) {\n\t\t\t\tlet r = target.arotation - rotation + this.data.offsetRotation;\n\t\t\t\tr -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;\n\t\t\t\trotation += r * mixRotate;\n\t\t\t}\n\n\t\t\tlet x = bone.ax, y = bone.ay;\n\t\t\tx += (target.ax - x + this.data.offsetX) * mixX;\n\t\t\ty += (target.ay - y + this.data.offsetY) * mixY;\n\n\t\t\tlet scaleX = bone.ascaleX, scaleY = bone.ascaleY;\n\t\t\tif (mixScaleX != 0 && scaleX != 0)\n\t\t\t\tscaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * mixScaleX) / scaleX;\n\t\t\tif (mixScaleY != 0 && scaleY != 0)\n\t\t\t\tscaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * mixScaleY) / scaleY;\n\n\t\t\tlet shearY = bone.ashearY;\n\t\t\tif (mixShearY != 0) {\n\t\t\t\tlet r = target.ashearY - shearY + this.data.offsetShearY;\n\t\t\t\tr -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;\n\t\t\t\tshearY += r * mixShearY;\n\t\t\t}\n\n\t\t\tbone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);\n\t\t}\n\t}\n\n\tapplyRelativeLocal() {\n\t\tlet mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX,\n\t\t\tmixScaleY = this.mixScaleY, mixShearY = this.mixShearY;\n\n\t\tlet target = this.target;\n\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\n\t\t\tlet rotation = bone.arotation + (target.arotation + this.data.offsetRotation) * mixRotate;\n\t\t\tlet x = bone.ax + (target.ax + this.data.offsetX) * mixX;\n\t\t\tlet y = bone.ay + (target.ay + this.data.offsetY) * mixY;\n\t\t\tlet scaleX = (bone.ascaleX * ((target.ascaleX - 1 + this.data.offsetScaleX) * mixScaleX) + 1);\n\t\t\tlet scaleY = (bone.ascaleY * ((target.ascaleY - 1 + this.data.offsetScaleY) * mixScaleY) + 1);\n\t\t\tlet shearY = bone.ashearY + (target.ashearY + this.data.offsetShearY) * mixShearY;\n\n\t\t\tbone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);\n\t\t}\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Attachment } from \"./attachments/Attachment\";\nimport { MeshAttachment } from \"./attachments/MeshAttachment\";\nimport { PathAttachment } from \"./attachments/PathAttachment\";\nimport { RegionAttachment } from \"./attachments/RegionAttachment\";\nimport { Bone } from \"./Bone\";\nimport { IkConstraint } from \"./IkConstraint\";\nimport { PathConstraint } from \"./PathConstraint\";\nimport { SkeletonData } from \"./SkeletonData\";\nimport { Skin } from \"./Skin\";\nimport { Slot } from \"./Slot\";\nimport { TransformConstraint } from \"./TransformConstraint\";\nimport { Updatable } from \"./Updatable\";\nimport { Color, Utils, MathUtils, Vector2, NumberArrayLike } from \"./Utils\";\n\n/** Stores the current pose for a skeleton.\n *\n * See [Instance objects](http://esotericsoftware.com/spine-runtime-architecture#Instance-objects) in the Spine Runtimes Guide. */\nexport class Skeleton {\n\t/** The skeleton's setup pose data. */\n\tdata: SkeletonData;\n\n\t/** The skeleton's bones, sorted parent first. The root bone is always the first bone. */\n\tbones: Array;\n\n\t/** The skeleton's slots. */\n\tslots: Array;\n\n\t/** The skeleton's slots in the order they should be drawn. The returned array may be modified to change the draw order. */\n\tdrawOrder: Array;\n\n\t/** The skeleton's IK constraints. */\n\tikConstraints: Array;\n\n\t/** The skeleton's transform constraints. */\n\ttransformConstraints: Array;\n\n\t/** The skeleton's path constraints. */\n\tpathConstraints: Array;\n\n\t/** The list of bones and constraints, sorted in the order they should be updated, as computed by {@link #updateCache()}. */\n\t_updateCache = new Array();\n\n\t/** The skeleton's current skin. May be null. */\n\tskin: Skin;\n\n\t/** The color to tint all the skeleton's attachments. */\n\tcolor: Color;\n\n\t/** Returns the skeleton's time. This can be used for tracking, such as with Slot {@link Slot#attachmentTime}.\n\t *

\n\t * See {@link #update()}. */\n\ttime = 0;\n\n\t/** Scales the entire skeleton on the X axis. This affects all bones, even if the bone's transform mode disallows scale\n\t * inheritance. */\n\tscaleX = 1;\n\n\t/** Scales the entire skeleton on the Y axis. This affects all bones, even if the bone's transform mode disallows scale\n\t * inheritance. */\n\tscaleY = 1;\n\n\t/** Sets the skeleton X position, which is added to the root bone worldX position. */\n\tx = 0;\n\n\t/** Sets the skeleton Y position, which is added to the root bone worldY position. */\n\ty = 0;\n\n\tconstructor(data: SkeletonData) {\n\t\tif (!data) throw new Error(\"data cannot be null.\");\n\t\tthis.data = data;\n\n\t\tthis.bones = new Array();\n\t\tfor (let i = 0; i < data.bones.length; i++) {\n\t\t\tlet boneData = data.bones[i];\n\t\t\tlet bone: Bone;\n\t\t\tif (!boneData.parent)\n\t\t\t\tbone = new Bone(boneData, this, null);\n\t\t\telse {\n\t\t\t\tlet parent = this.bones[boneData.parent.index];\n\t\t\t\tbone = new Bone(boneData, this, parent);\n\t\t\t\tparent.children.push(bone);\n\t\t\t}\n\t\t\tthis.bones.push(bone);\n\t\t}\n\n\t\tthis.slots = new Array();\n\t\tthis.drawOrder = new Array();\n\t\tfor (let i = 0; i < data.slots.length; i++) {\n\t\t\tlet slotData = data.slots[i];\n\t\t\tlet bone = this.bones[slotData.boneData.index];\n\t\t\tlet slot = new Slot(slotData, bone);\n\t\t\tthis.slots.push(slot);\n\t\t\tthis.drawOrder.push(slot);\n\t\t}\n\n\t\tthis.ikConstraints = new Array();\n\t\tfor (let i = 0; i < data.ikConstraints.length; i++) {\n\t\t\tlet ikConstraintData = data.ikConstraints[i];\n\t\t\tthis.ikConstraints.push(new IkConstraint(ikConstraintData, this));\n\t\t}\n\n\t\tthis.transformConstraints = new Array();\n\t\tfor (let i = 0; i < data.transformConstraints.length; i++) {\n\t\t\tlet transformConstraintData = data.transformConstraints[i];\n\t\t\tthis.transformConstraints.push(new TransformConstraint(transformConstraintData, this));\n\t\t}\n\n\t\tthis.pathConstraints = new Array();\n\t\tfor (let i = 0; i < data.pathConstraints.length; i++) {\n\t\t\tlet pathConstraintData = data.pathConstraints[i];\n\t\t\tthis.pathConstraints.push(new PathConstraint(pathConstraintData, this));\n\t\t}\n\n\t\tthis.color = new Color(1, 1, 1, 1);\n\t\tthis.updateCache();\n\t}\n\n\t/** Caches information about bones and constraints. Must be called if the {@link #getSkin()} is modified or if bones,\n\t * constraints, or weighted path attachments are added or removed. */\n\tupdateCache() {\n\t\tlet updateCache = this._updateCache;\n\t\tupdateCache.length = 0;\n\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\t\t\tbone.sorted = bone.data.skinRequired;\n\t\t\tbone.active = !bone.sorted;\n\t\t}\n\n\t\tif (this.skin) {\n\t\t\tlet skinBones = this.skin.bones;\n\t\t\tfor (let i = 0, n = this.skin.bones.length; i < n; i++) {\n\t\t\t\tlet bone = this.bones[skinBones[i].index];\n\t\t\t\tdo {\n\t\t\t\t\tbone.sorted = false;\n\t\t\t\t\tbone.active = true;\n\t\t\t\t\tbone = bone.parent;\n\t\t\t\t} while (bone);\n\t\t\t}\n\t\t}\n\n\t\t// IK first, lowest hierarchy depth first.\n\t\tlet ikConstraints = this.ikConstraints;\n\t\tlet transformConstraints = this.transformConstraints;\n\t\tlet pathConstraints = this.pathConstraints;\n\t\tlet ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length;\n\t\tlet constraintCount = ikCount + transformCount + pathCount;\n\n\t\touter:\n\t\tfor (let i = 0; i < constraintCount; i++) {\n\t\t\tfor (let ii = 0; ii < ikCount; ii++) {\n\t\t\t\tlet constraint = ikConstraints[ii];\n\t\t\t\tif (constraint.data.order == i) {\n\t\t\t\t\tthis.sortIkConstraint(constraint);\n\t\t\t\t\tcontinue outer;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let ii = 0; ii < transformCount; ii++) {\n\t\t\t\tlet constraint = transformConstraints[ii];\n\t\t\t\tif (constraint.data.order == i) {\n\t\t\t\t\tthis.sortTransformConstraint(constraint);\n\t\t\t\t\tcontinue outer;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let ii = 0; ii < pathCount; ii++) {\n\t\t\t\tlet constraint = pathConstraints[ii];\n\t\t\t\tif (constraint.data.order == i) {\n\t\t\t\t\tthis.sortPathConstraint(constraint);\n\t\t\t\t\tcontinue outer;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0, n = bones.length; i < n; i++)\n\t\t\tthis.sortBone(bones[i]);\n\t}\n\n\tsortIkConstraint(constraint: IkConstraint) {\n\t\tconstraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));\n\t\tif (!constraint.active) return;\n\n\t\tlet target = constraint.target;\n\t\tthis.sortBone(target);\n\n\t\tlet constrained = constraint.bones;\n\t\tlet parent = constrained[0];\n\t\tthis.sortBone(parent);\n\n\t\tif (constrained.length == 1) {\n\t\t\tthis._updateCache.push(constraint);\n\t\t\tthis.sortReset(parent.children);\n\t\t} else {\n\t\t\tlet child = constrained[constrained.length - 1];\n\t\t\tthis.sortBone(child);\n\n\t\t\tthis._updateCache.push(constraint);\n\n\t\t\tthis.sortReset(parent.children);\n\t\t\tchild.sorted = true;\n\t\t}\n\t}\n\n\tsortPathConstraint(constraint: PathConstraint) {\n\t\tconstraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));\n\t\tif (!constraint.active) return;\n\n\t\tlet slot = constraint.target;\n\t\tlet slotIndex = slot.data.index;\n\t\tlet slotBone = slot.bone;\n\t\tif (this.skin) this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone);\n\t\tif (this.data.defaultSkin && this.data.defaultSkin != this.skin)\n\t\t\tthis.sortPathConstraintAttachment(this.data.defaultSkin, slotIndex, slotBone);\n\t\tfor (let i = 0, n = this.data.skins.length; i < n; i++)\n\t\t\tthis.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone);\n\n\t\tlet attachment = slot.getAttachment();\n\t\tif (attachment instanceof PathAttachment) this.sortPathConstraintAttachmentWith(attachment, slotBone);\n\n\t\tlet constrained = constraint.bones;\n\t\tlet boneCount = constrained.length;\n\t\tfor (let i = 0; i < boneCount; i++)\n\t\t\tthis.sortBone(constrained[i]);\n\n\t\tthis._updateCache.push(constraint);\n\n\t\tfor (let i = 0; i < boneCount; i++)\n\t\t\tthis.sortReset(constrained[i].children);\n\t\tfor (let i = 0; i < boneCount; i++)\n\t\t\tconstrained[i].sorted = true;\n\t}\n\n\tsortTransformConstraint(constraint: TransformConstraint) {\n\t\tconstraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));\n\t\tif (!constraint.active) return;\n\n\t\tthis.sortBone(constraint.target);\n\n\t\tlet constrained = constraint.bones;\n\t\tlet boneCount = constrained.length;\n\t\tif (constraint.data.local) {\n\t\t\tfor (let i = 0; i < boneCount; i++) {\n\t\t\t\tlet child = constrained[i];\n\t\t\t\tthis.sortBone(child.parent);\n\t\t\t\tthis.sortBone(child);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let i = 0; i < boneCount; i++) {\n\t\t\t\tthis.sortBone(constrained[i]);\n\t\t\t}\n\t\t}\n\n\t\tthis._updateCache.push(constraint);\n\n\t\tfor (let i = 0; i < boneCount; i++)\n\t\t\tthis.sortReset(constrained[i].children);\n\t\tfor (let i = 0; i < boneCount; i++)\n\t\t\tconstrained[i].sorted = true;\n\t}\n\n\tsortPathConstraintAttachment(skin: Skin, slotIndex: number, slotBone: Bone) {\n\t\tlet attachments = skin.attachments[slotIndex];\n\t\tif (!attachments) return;\n\t\tfor (let key in attachments) {\n\t\t\tthis.sortPathConstraintAttachmentWith(attachments[key], slotBone);\n\t\t}\n\t}\n\n\tsortPathConstraintAttachmentWith(attachment: Attachment, slotBone: Bone) {\n\t\tif (!(attachment instanceof PathAttachment)) return;\n\t\tlet pathBones = (attachment).bones;\n\t\tif (!pathBones)\n\t\t\tthis.sortBone(slotBone);\n\t\telse {\n\t\t\tlet bones = this.bones;\n\t\t\tfor (let i = 0, n = pathBones.length; i < n;) {\n\t\t\t\tlet nn = pathBones[i++];\n\t\t\t\tnn += i;\n\t\t\t\twhile (i < nn)\n\t\t\t\t\tthis.sortBone(bones[pathBones[i++]]);\n\t\t\t}\n\t\t}\n\t}\n\n\tsortBone(bone: Bone) {\n\t\tif (bone.sorted) return;\n\t\tlet parent = bone.parent;\n\t\tif (parent) this.sortBone(parent);\n\t\tbone.sorted = true;\n\t\tthis._updateCache.push(bone);\n\t}\n\n\tsortReset(bones: Array) {\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\t\t\tif (!bone.active) continue;\n\t\t\tif (bone.sorted) this.sortReset(bone.children);\n\t\t\tbone.sorted = false;\n\t\t}\n\t}\n\n\t/** Updates the world transform for each bone and applies all constraints.\n\t *\n\t * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine\n\t * Runtimes Guide. */\n\tupdateWorldTransform() {\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\t\t\tbone.ax = bone.x;\n\t\t\tbone.ay = bone.y;\n\t\t\tbone.arotation = bone.rotation;\n\t\t\tbone.ascaleX = bone.scaleX;\n\t\t\tbone.ascaleY = bone.scaleY;\n\t\t\tbone.ashearX = bone.shearX;\n\t\t\tbone.ashearY = bone.shearY;\n\t\t}\n\n\t\tlet updateCache = this._updateCache;\n\t\tfor (let i = 0, n = updateCache.length; i < n; i++)\n\t\t\tupdateCache[i].update();\n\t}\n\n\tupdateWorldTransformWith(parent: Bone) {\n\t\t// Apply the parent bone transform to the root bone. The root bone always inherits scale, rotation and reflection.\n\t\tlet rootBone = this.getRootBone();\n\t\tlet pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;\n\t\trootBone.worldX = pa * this.x + pb * this.y + parent.worldX;\n\t\trootBone.worldY = pc * this.x + pd * this.y + parent.worldY;\n\n\t\tlet rotationY = rootBone.rotation + 90 + rootBone.shearY;\n\t\tlet la = MathUtils.cosDeg(rootBone.rotation + rootBone.shearX) * rootBone.scaleX;\n\t\tlet lb = MathUtils.cosDeg(rotationY) * rootBone.scaleY;\n\t\tlet lc = MathUtils.sinDeg(rootBone.rotation + rootBone.shearX) * rootBone.scaleX;\n\t\tlet ld = MathUtils.sinDeg(rotationY) * rootBone.scaleY;\n\t\trootBone.a = (pa * la + pb * lc) * this.scaleX;\n\t\trootBone.b = (pa * lb + pb * ld) * this.scaleX;\n\t\trootBone.c = (pc * la + pd * lc) * this.scaleY;\n\t\trootBone.d = (pc * lb + pd * ld) * this.scaleY;\n\n\t\t// Update everything except root bone.\n\t\tlet updateCache = this._updateCache;\n\t\tfor (let i = 0, n = updateCache.length; i < n; i++) {\n\t\t\tlet updatable = updateCache[i];\n\t\t\tif (updatable != rootBone) updatable.update();\n\t\t}\n\t}\n\n\t/** Sets the bones, constraints, and slots to their setup pose values. */\n\tsetToSetupPose() {\n\t\tthis.setBonesToSetupPose();\n\t\tthis.setSlotsToSetupPose();\n\t}\n\n\t/** Sets the bones and constraints to their setup pose values. */\n\tsetBonesToSetupPose() {\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++)\n\t\t\tbones[i].setToSetupPose();\n\n\t\tlet ikConstraints = this.ikConstraints;\n\t\tfor (let i = 0, n = ikConstraints.length; i < n; i++) {\n\t\t\tlet constraint = ikConstraints[i];\n\t\t\tconstraint.mix = constraint.data.mix;\n\t\t\tconstraint.softness = constraint.data.softness;\n\t\t\tconstraint.bendDirection = constraint.data.bendDirection;\n\t\t\tconstraint.compress = constraint.data.compress;\n\t\t\tconstraint.stretch = constraint.data.stretch;\n\t\t}\n\n\t\tlet transformConstraints = this.transformConstraints;\n\t\tfor (let i = 0, n = transformConstraints.length; i < n; i++) {\n\t\t\tlet constraint = transformConstraints[i];\n\t\t\tlet data = constraint.data;\n\t\t\tconstraint.mixRotate = data.mixRotate;\n\t\t\tconstraint.mixX = data.mixX;\n\t\t\tconstraint.mixY = data.mixY;\n\t\t\tconstraint.mixScaleX = data.mixScaleX;\n\t\t\tconstraint.mixScaleY = data.mixScaleY;\n\t\t\tconstraint.mixShearY = data.mixShearY;\n\t\t}\n\n\t\tlet pathConstraints = this.pathConstraints;\n\t\tfor (let i = 0, n = pathConstraints.length; i < n; i++) {\n\t\t\tlet constraint = pathConstraints[i];\n\t\t\tlet data = constraint.data;\n\t\t\tconstraint.position = data.position;\n\t\t\tconstraint.spacing = data.spacing;\n\t\t\tconstraint.mixRotate = data.mixRotate;\n\t\t\tconstraint.mixX = data.mixX;\n\t\t\tconstraint.mixY = data.mixY;\n\t\t}\n\t}\n\n\t/** Sets the slots and draw order to their setup pose values. */\n\tsetSlotsToSetupPose() {\n\t\tlet slots = this.slots;\n\t\tUtils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length);\n\t\tfor (let i = 0, n = slots.length; i < n; i++)\n\t\t\tslots[i].setToSetupPose();\n\t}\n\n\t/** @returns May return null. */\n\tgetRootBone() {\n\t\tif (this.bones.length == 0) return null;\n\t\treturn this.bones[0];\n\t}\n\n\t/** @returns May be null. */\n\tfindBone(boneName: string) {\n\t\tif (!boneName) throw new Error(\"boneName cannot be null.\");\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\t\t\tif (bone.data.name == boneName) return bone;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** @returns -1 if the bone was not found. */\n\tfindBoneIndex(boneName: string) {\n\t\tif (!boneName) throw new Error(\"boneName cannot be null.\");\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++)\n\t\t\tif (bones[i].data.name == boneName) return i;\n\t\treturn -1;\n\t}\n\n\t/** Finds a slot by comparing each slot's name. It is more efficient to cache the results of this method than to call it\n\t * repeatedly.\n\t * @returns May be null. */\n\tfindSlot(slotName: string) {\n\t\tif (!slotName) throw new Error(\"slotName cannot be null.\");\n\t\tlet slots = this.slots;\n\t\tfor (let i = 0, n = slots.length; i < n; i++) {\n\t\t\tlet slot = slots[i];\n\t\t\tif (slot.data.name == slotName) return slot;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** @returns -1 if the bone was not found. */\n\tfindSlotIndex(slotName: string) {\n\t\tif (!slotName) throw new Error(\"slotName cannot be null.\");\n\t\tlet slots = this.slots;\n\t\tfor (let i = 0, n = slots.length; i < n; i++)\n\t\t\tif (slots[i].data.name == slotName) return i;\n\t\treturn -1;\n\t}\n\n\t/** Sets a skin by name.\n\t *\n\t * See {@link #setSkin()}. */\n\tsetSkinByName(skinName: string) {\n\t\tlet skin = this.data.findSkin(skinName);\n\t\tif (!skin) throw new Error(\"Skin not found: \" + skinName);\n\t\tthis.setSkin(skin);\n\t}\n\n\t/** Sets the skin used to look up attachments before looking in the {@link SkeletonData#defaultSkin default skin}. If the\n\t * skin is changed, {@link #updateCache()} is called.\n\t *\n\t * Attachments from the new skin are attached if the corresponding attachment from the old skin was attached. If there was no\n\t * old skin, each slot's setup mode attachment is attached from the new skin.\n\t *\n\t * After changing the skin, the visible attachments can be reset to those attached in the setup pose by calling\n\t * {@link #setSlotsToSetupPose()}. Also, often {@link AnimationState#apply()} is called before the next time the\n\t * skeleton is rendered to allow any attachment keys in the current animation(s) to hide or show attachments from the new skin.\n\t * @param newSkin May be null. */\n\tsetSkin(newSkin: Skin) {\n\t\tif (newSkin == this.skin) return;\n\t\tif (newSkin) {\n\t\t\tif (this.skin)\n\t\t\t\tnewSkin.attachAll(this, this.skin);\n\t\t\telse {\n\t\t\t\tlet slots = this.slots;\n\t\t\t\tfor (let i = 0, n = slots.length; i < n; i++) {\n\t\t\t\t\tlet slot = slots[i];\n\t\t\t\t\tlet name = slot.data.attachmentName;\n\t\t\t\t\tif (name) {\n\t\t\t\t\t\tlet attachment: Attachment = newSkin.getAttachment(i, name);\n\t\t\t\t\t\tif (attachment) slot.setAttachment(attachment);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.skin = newSkin;\n\t\tthis.updateCache();\n\t}\n\n\n\t/** Finds an attachment by looking in the {@link #skin} and {@link SkeletonData#defaultSkin} using the slot name and attachment\n\t * name.\n\t *\n\t * See {@link #getAttachment()}.\n\t * @returns May be null. */\n\tgetAttachmentByName(slotName: string, attachmentName: string): Attachment {\n\t\treturn this.getAttachment(this.data.findSlotIndex(slotName), attachmentName);\n\t}\n\n\t/** Finds an attachment by looking in the {@link #skin} and {@link SkeletonData#defaultSkin} using the slot index and\n\t * attachment name. First the skin is checked and if the attachment was not found, the default skin is checked.\n\t *\n\t * See [Runtime skins](http://esotericsoftware.com/spine-runtime-skins) in the Spine Runtimes Guide.\n\t * @returns May be null. */\n\tgetAttachment(slotIndex: number, attachmentName: string): Attachment {\n\t\tif (!attachmentName) throw new Error(\"attachmentName cannot be null.\");\n\t\tif (this.skin) {\n\t\t\tlet attachment: Attachment = this.skin.getAttachment(slotIndex, attachmentName);\n\t\t\tif (attachment) return attachment;\n\t\t}\n\t\tif (this.data.defaultSkin) return this.data.defaultSkin.getAttachment(slotIndex, attachmentName);\n\t\treturn null;\n\t}\n\n\t/** A convenience method to set an attachment by finding the slot with {@link #findSlot()}, finding the attachment with\n\t * {@link #getAttachment()}, then setting the slot's {@link Slot#attachment}.\n\t * @param attachmentName May be null to clear the slot's attachment. */\n\tsetAttachment(slotName: string, attachmentName: string) {\n\t\tif (!slotName) throw new Error(\"slotName cannot be null.\");\n\t\tlet slots = this.slots;\n\t\tfor (let i = 0, n = slots.length; i < n; i++) {\n\t\t\tlet slot = slots[i];\n\t\t\tif (slot.data.name == slotName) {\n\t\t\t\tlet attachment: Attachment = null;\n\t\t\t\tif (attachmentName) {\n\t\t\t\t\tattachment = this.getAttachment(i, attachmentName);\n\t\t\t\t\tif (!attachment) throw new Error(\"Attachment not found: \" + attachmentName + \", for slot: \" + slotName);\n\t\t\t\t}\n\t\t\t\tslot.setAttachment(attachment);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthrow new Error(\"Slot not found: \" + slotName);\n\t}\n\n\n\t/** Finds an IK constraint by comparing each IK constraint's name. It is more efficient to cache the results of this method\n\t * than to call it repeatedly.\n\t * @return May be null. */\n\tfindIkConstraint(constraintName: string) {\n\t\tif (!constraintName) throw new Error(\"constraintName cannot be null.\");\n\t\tlet ikConstraints = this.ikConstraints;\n\t\tfor (let i = 0, n = ikConstraints.length; i < n; i++) {\n\t\t\tlet ikConstraint = ikConstraints[i];\n\t\t\tif (ikConstraint.data.name == constraintName) return ikConstraint;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Finds a transform constraint by comparing each transform constraint's name. It is more efficient to cache the results of\n\t * this method than to call it repeatedly.\n\t * @return May be null. */\n\tfindTransformConstraint(constraintName: string) {\n\t\tif (!constraintName) throw new Error(\"constraintName cannot be null.\");\n\t\tlet transformConstraints = this.transformConstraints;\n\t\tfor (let i = 0, n = transformConstraints.length; i < n; i++) {\n\t\t\tlet constraint = transformConstraints[i];\n\t\t\tif (constraint.data.name == constraintName) return constraint;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Finds a path constraint by comparing each path constraint's name. It is more efficient to cache the results of this method\n\t * than to call it repeatedly.\n\t * @return May be null. */\n\tfindPathConstraint(constraintName: string) {\n\t\tif (!constraintName) throw new Error(\"constraintName cannot be null.\");\n\t\tlet pathConstraints = this.pathConstraints;\n\t\tfor (let i = 0, n = pathConstraints.length; i < n; i++) {\n\t\t\tlet constraint = pathConstraints[i];\n\t\t\tif (constraint.data.name == constraintName) return constraint;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose.\n\t * @param offset An output value, the distance from the skeleton origin to the bottom left corner of the AABB.\n\t * @param size An output value, the width and height of the AABB.\n\t * @param temp Working memory to temporarily store attachments' computed world vertices. */\n\tgetBounds(offset: Vector2, size: Vector2, temp: Array = new Array(2)) {\n\t\tif (!offset) throw new Error(\"offset cannot be null.\");\n\t\tif (!size) throw new Error(\"size cannot be null.\");\n\t\tlet drawOrder = this.drawOrder;\n\t\tlet minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;\n\t\tfor (let i = 0, n = drawOrder.length; i < n; i++) {\n\t\t\tlet slot = drawOrder[i];\n\t\t\tif (!slot.bone.active) continue;\n\t\t\tlet verticesLength = 0;\n\t\t\tlet vertices: NumberArrayLike = null;\n\t\t\tlet attachment = slot.getAttachment();\n\t\t\tif (attachment instanceof RegionAttachment) {\n\t\t\t\tverticesLength = 8;\n\t\t\t\tvertices = Utils.setArraySize(temp, verticesLength, 0);\n\t\t\t\t(attachment).computeWorldVertices(slot.bone, vertices, 0, 2);\n\t\t\t} else if (attachment instanceof MeshAttachment) {\n\t\t\t\tlet mesh = (attachment);\n\t\t\t\tverticesLength = mesh.worldVerticesLength;\n\t\t\t\tvertices = Utils.setArraySize(temp, verticesLength, 0);\n\t\t\t\tmesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2);\n\t\t\t}\n\t\t\tif (vertices) {\n\t\t\t\tfor (let ii = 0, nn = vertices.length; ii < nn; ii += 2) {\n\t\t\t\t\tlet x = vertices[ii], y = vertices[ii + 1];\n\t\t\t\t\tminX = Math.min(minX, x);\n\t\t\t\t\tminY = Math.min(minY, y);\n\t\t\t\t\tmaxX = Math.max(maxX, x);\n\t\t\t\t\tmaxY = Math.max(maxY, y);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\toffset.set(minX, minY);\n\t\tsize.set(maxX - minX, maxY - minY);\n\t}\n\n\t/** Increments the skeleton's {@link #time}. */\n\tupdate(delta: number) {\n\t\tthis.time += delta;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Animation } from \"./Animation\"\nimport { BoneData } from \"./BoneData\";\nimport { EventData } from \"./EventData\";\nimport { IkConstraintData } from \"./IkConstraintData\";\nimport { PathConstraintData } from \"./PathConstraintData\";\nimport { Skin } from \"./Skin\";\nimport { SlotData } from \"./SlotData\";\nimport { TransformConstraintData } from \"./TransformConstraintData\";\n\n/** Stores the setup pose and all of the stateless data for a skeleton.\n *\n * See [Data objects](http://esotericsoftware.com/spine-runtime-architecture#Data-objects) in the Spine Runtimes\n * Guide. */\nexport class SkeletonData {\n\n\t/** The skeleton's name, which by default is the name of the skeleton data file, if possible. May be null. */\n\tname: string;\n\n\t/** The skeleton's bones, sorted parent first. The root bone is always the first bone. */\n\tbones = new Array(); // Ordered parents first.\n\n\t/** The skeleton's slots. */\n\tslots = new Array(); // Setup pose draw order.\n\tskins = new Array();\n\n\t/** The skeleton's default skin. By default this skin contains all attachments that were not in a skin in Spine.\n\t *\n\t * See {@link Skeleton#getAttachmentByName()}.\n\t * May be null. */\n\tdefaultSkin: Skin;\n\n\t/** The skeleton's events. */\n\tevents = new Array();\n\n\t/** The skeleton's animations. */\n\tanimations = new Array();\n\n\t/** The skeleton's IK constraints. */\n\tikConstraints = new Array();\n\n\t/** The skeleton's transform constraints. */\n\ttransformConstraints = new Array();\n\n\t/** The skeleton's path constraints. */\n\tpathConstraints = new Array();\n\n\t/** The X coordinate of the skeleton's axis aligned bounding box in the setup pose. */\n\tx: number;\n\n\t/** The Y coordinate of the skeleton's axis aligned bounding box in the setup pose. */\n\ty: number;\n\n\t/** The width of the skeleton's axis aligned bounding box in the setup pose. */\n\twidth: number;\n\n\t/** The height of the skeleton's axis aligned bounding box in the setup pose. */\n\theight: number;\n\n\t/** The Spine version used to export the skeleton data, or null. */\n\tversion: string;\n\n\t/** The skeleton data hash. This value will change if any of the skeleton data has changed. May be null. */\n\thash: string;\n\n\t// Nonessential\n\t/** The dopesheet FPS in Spine. Available only when nonessential data was exported. */\n\tfps = 0;\n\n\t/** The path to the images directory as defined in Spine. Available only when nonessential data was exported. May be null. */\n\timagesPath: string;\n\n\t/** The path to the audio directory as defined in Spine. Available only when nonessential data was exported. May be null. */\n\taudioPath: string;\n\n\t/** Finds a bone by comparing each bone's name. It is more efficient to cache the results of this method than to call it\n\t * multiple times.\n\t * @returns May be null. */\n\tfindBone(boneName: string) {\n\t\tif (!boneName) throw new Error(\"boneName cannot be null.\");\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++) {\n\t\t\tlet bone = bones[i];\n\t\t\tif (bone.name == boneName) return bone;\n\t\t}\n\t\treturn null;\n\t}\n\n\tfindBoneIndex(boneName: string) {\n\t\tif (!boneName) throw new Error(\"boneName cannot be null.\");\n\t\tlet bones = this.bones;\n\t\tfor (let i = 0, n = bones.length; i < n; i++)\n\t\t\tif (bones[i].name == boneName) return i;\n\t\treturn -1;\n\t}\n\n\t/** Finds a slot by comparing each slot's name. It is more efficient to cache the results of this method than to call it\n\t * multiple times.\n\t * @returns May be null. */\n\tfindSlot(slotName: string) {\n\t\tif (!slotName) throw new Error(\"slotName cannot be null.\");\n\t\tlet slots = this.slots;\n\t\tfor (let i = 0, n = slots.length; i < n; i++) {\n\t\t\tlet slot = slots[i];\n\t\t\tif (slot.name == slotName) return slot;\n\t\t}\n\t\treturn null;\n\t}\n\n\tfindSlotIndex(slotName: string) {\n\t\tif (!slotName) throw new Error(\"slotName cannot be null.\");\n\t\tlet slots = this.slots;\n\t\tfor (let i = 0, n = slots.length; i < n; i++)\n\t\t\tif (slots[i].name == slotName) return i;\n\t\treturn -1;\n\t}\n\n\t/** Finds a skin by comparing each skin's name. It is more efficient to cache the results of this method than to call it\n\t * multiple times.\n\t * @returns May be null. */\n\tfindSkin(skinName: string) {\n\t\tif (!skinName) throw new Error(\"skinName cannot be null.\");\n\t\tlet skins = this.skins;\n\t\tfor (let i = 0, n = skins.length; i < n; i++) {\n\t\t\tlet skin = skins[i];\n\t\t\tif (skin.name == skinName) return skin;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Finds an event by comparing each events's name. It is more efficient to cache the results of this method than to call it\n\t * multiple times.\n\t * @returns May be null. */\n\tfindEvent(eventDataName: string) {\n\t\tif (!eventDataName) throw new Error(\"eventDataName cannot be null.\");\n\t\tlet events = this.events;\n\t\tfor (let i = 0, n = events.length; i < n; i++) {\n\t\t\tlet event = events[i];\n\t\t\tif (event.name == eventDataName) return event;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Finds an animation by comparing each animation's name. It is more efficient to cache the results of this method than to\n\t * call it multiple times.\n\t * @returns May be null. */\n\tfindAnimation(animationName: string) {\n\t\tif (!animationName) throw new Error(\"animationName cannot be null.\");\n\t\tlet animations = this.animations;\n\t\tfor (let i = 0, n = animations.length; i < n; i++) {\n\t\t\tlet animation = animations[i];\n\t\t\tif (animation.name == animationName) return animation;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Finds an IK constraint by comparing each IK constraint's name. It is more efficient to cache the results of this method\n\t * than to call it multiple times.\n\t * @return May be null. */\n\tfindIkConstraint(constraintName: string) {\n\t\tif (!constraintName) throw new Error(\"constraintName cannot be null.\");\n\t\tlet ikConstraints = this.ikConstraints;\n\t\tfor (let i = 0, n = ikConstraints.length; i < n; i++) {\n\t\t\tlet constraint = ikConstraints[i];\n\t\t\tif (constraint.name == constraintName) return constraint;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Finds a transform constraint by comparing each transform constraint's name. It is more efficient to cache the results of\n\t * this method than to call it multiple times.\n\t * @return May be null. */\n\tfindTransformConstraint(constraintName: string) {\n\t\tif (!constraintName) throw new Error(\"constraintName cannot be null.\");\n\t\tlet transformConstraints = this.transformConstraints;\n\t\tfor (let i = 0, n = transformConstraints.length; i < n; i++) {\n\t\t\tlet constraint = transformConstraints[i];\n\t\t\tif (constraint.name == constraintName) return constraint;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Finds a path constraint by comparing each path constraint's name. It is more efficient to cache the results of this method\n\t * than to call it multiple times.\n\t * @return May be null. */\n\tfindPathConstraint(constraintName: string) {\n\t\tif (!constraintName) throw new Error(\"constraintName cannot be null.\");\n\t\tlet pathConstraints = this.pathConstraints;\n\t\tfor (let i = 0, n = pathConstraints.length; i < n; i++) {\n\t\t\tlet constraint = pathConstraints[i];\n\t\t\tif (constraint.name == constraintName) return constraint;\n\t\t}\n\t\treturn null;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Attachment } from \"./attachments/Attachment\";\nimport { MeshAttachment } from \"./attachments/MeshAttachment\";\nimport { BoneData } from \"./BoneData\";\nimport { ConstraintData } from \"./ConstraintData\";\nimport { Skeleton } from \"./Skeleton\";\nimport { StringMap } from \"./Utils\";\n\n/** Stores an entry in the skin consisting of the slot index, name, and attachment **/\nexport class SkinEntry {\n\tconstructor(public slotIndex: number, public name: string, public attachment: Attachment) { }\n}\n\n/** Stores attachments by slot index and attachment name.\n *\n * See SkeletonData {@link SkeletonData#defaultSkin}, Skeleton {@link Skeleton#skin}, and\n * [Runtime skins](http://esotericsoftware.com/spine-runtime-skins) in the Spine Runtimes Guide. */\nexport class Skin {\n\t/** The skin's name, which is unique across all skins in the skeleton. */\n\tname: string;\n\n\tattachments = new Array>();\n\tbones = Array();\n\tconstraints = new Array();\n\n\tconstructor(name: string) {\n\t\tif (!name) throw new Error(\"name cannot be null.\");\n\t\tthis.name = name;\n\t}\n\n\t/** Adds an attachment to the skin for the specified slot index and name. */\n\tsetAttachment(slotIndex: number, name: string, attachment: Attachment) {\n\t\tif (!attachment) throw new Error(\"attachment cannot be null.\");\n\t\tlet attachments = this.attachments;\n\t\tif (slotIndex >= attachments.length) attachments.length = slotIndex + 1;\n\t\tif (!attachments[slotIndex]) attachments[slotIndex] = {};\n\t\tattachments[slotIndex][name] = attachment;\n\t}\n\n\t/** Adds all attachments, bones, and constraints from the specified skin to this skin. */\n\taddSkin(skin: Skin) {\n\t\tfor (let i = 0; i < skin.bones.length; i++) {\n\t\t\tlet bone = skin.bones[i];\n\t\t\tlet contained = false;\n\t\t\tfor (let ii = 0; ii < this.bones.length; ii++) {\n\t\t\t\tif (this.bones[ii] == bone) {\n\t\t\t\t\tcontained = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!contained) this.bones.push(bone);\n\t\t}\n\n\t\tfor (let i = 0; i < skin.constraints.length; i++) {\n\t\t\tlet constraint = skin.constraints[i];\n\t\t\tlet contained = false;\n\t\t\tfor (let ii = 0; ii < this.constraints.length; ii++) {\n\t\t\t\tif (this.constraints[ii] == constraint) {\n\t\t\t\t\tcontained = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!contained) this.constraints.push(constraint);\n\t\t}\n\n\t\tlet attachments = skin.getAttachments();\n\t\tfor (let i = 0; i < attachments.length; i++) {\n\t\t\tvar attachment = attachments[i];\n\t\t\tthis.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n\t\t}\n\t}\n\n\t/** Adds all bones and constraints and copies of all attachments from the specified skin to this skin. Mesh attachments are not\n\t * copied, instead a new linked mesh is created. The attachment copies can be modified without affecting the originals. */\n\tcopySkin(skin: Skin) {\n\t\tfor (let i = 0; i < skin.bones.length; i++) {\n\t\t\tlet bone = skin.bones[i];\n\t\t\tlet contained = false;\n\t\t\tfor (let ii = 0; ii < this.bones.length; ii++) {\n\t\t\t\tif (this.bones[ii] == bone) {\n\t\t\t\t\tcontained = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!contained) this.bones.push(bone);\n\t\t}\n\n\t\tfor (let i = 0; i < skin.constraints.length; i++) {\n\t\t\tlet constraint = skin.constraints[i];\n\t\t\tlet contained = false;\n\t\t\tfor (let ii = 0; ii < this.constraints.length; ii++) {\n\t\t\t\tif (this.constraints[ii] == constraint) {\n\t\t\t\t\tcontained = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!contained) this.constraints.push(constraint);\n\t\t}\n\n\t\tlet attachments = skin.getAttachments();\n\t\tfor (let i = 0; i < attachments.length; i++) {\n\t\t\tvar attachment = attachments[i];\n\t\t\tif (!attachment.attachment) continue;\n\t\t\tif (attachment.attachment instanceof MeshAttachment) {\n\t\t\t\tattachment.attachment = attachment.attachment.newLinkedMesh();\n\t\t\t\tthis.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n\t\t\t} else {\n\t\t\t\tattachment.attachment = attachment.attachment.copy();\n\t\t\t\tthis.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Returns the attachment for the specified slot index and name, or null. */\n\tgetAttachment(slotIndex: number, name: string): Attachment {\n\t\tlet dictionary = this.attachments[slotIndex];\n\t\treturn dictionary ? dictionary[name] : null;\n\t}\n\n\t/** Removes the attachment in the skin for the specified slot index and name, if any. */\n\tremoveAttachment(slotIndex: number, name: string) {\n\t\tlet dictionary = this.attachments[slotIndex];\n\t\tif (dictionary) dictionary[name] = null;\n\t}\n\n\t/** Returns all attachments in this skin. */\n\tgetAttachments(): Array {\n\t\tlet entries = new Array();\n\t\tfor (var i = 0; i < this.attachments.length; i++) {\n\t\t\tlet slotAttachments = this.attachments[i];\n\t\t\tif (slotAttachments) {\n\t\t\t\tfor (let name in slotAttachments) {\n\t\t\t\t\tlet attachment = slotAttachments[name];\n\t\t\t\t\tif (attachment) entries.push(new SkinEntry(i, name, attachment));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn entries;\n\t}\n\n\t/** Returns all attachments in this skin for the specified slot index. */\n\tgetAttachmentsForSlot(slotIndex: number, attachments: Array) {\n\t\tlet slotAttachments = this.attachments[slotIndex];\n\t\tif (slotAttachments) {\n\t\t\tfor (let name in slotAttachments) {\n\t\t\t\tlet attachment = slotAttachments[name];\n\t\t\t\tif (attachment) attachments.push(new SkinEntry(slotIndex, name, attachment));\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Clears all attachments, bones, and constraints. */\n\tclear() {\n\t\tthis.attachments.length = 0;\n\t\tthis.bones.length = 0;\n\t\tthis.constraints.length = 0;\n\t}\n\n\t/** Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached. */\n\tattachAll(skeleton: Skeleton, oldSkin: Skin) {\n\t\tlet slotIndex = 0;\n\t\tfor (let i = 0; i < skeleton.slots.length; i++) {\n\t\t\tlet slot = skeleton.slots[i];\n\t\t\tlet slotAttachment = slot.getAttachment();\n\t\t\tif (slotAttachment && slotIndex < oldSkin.attachments.length) {\n\t\t\t\tlet dictionary = oldSkin.attachments[slotIndex];\n\t\t\t\tfor (let key in dictionary) {\n\t\t\t\t\tlet skinAttachment: Attachment = dictionary[key];\n\t\t\t\t\tif (slotAttachment == skinAttachment) {\n\t\t\t\t\t\tlet attachment = this.getAttachment(slotIndex, key);\n\t\t\t\t\t\tif (attachment) slot.setAttachment(attachment);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tslotIndex++;\n\t\t}\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { BoneData } from \"./BoneData\";\nimport { Color } from \"./Utils\";\n\n/** Stores the setup pose for a {@link Slot}. */\nexport class SlotData {\n\t/** The index of the slot in {@link Skeleton#getSlots()}. */\n\tindex: number;\n\n\t/** The name of the slot, which is unique across all slots in the skeleton. */\n\tname: string;\n\n\t/** The bone this slot belongs to. */\n\tboneData: BoneData;\n\n\t/** The color used to tint the slot's attachment. If {@link #getDarkColor()} is set, this is used as the light color for two\n\t * color tinting. */\n\tcolor = new Color(1, 1, 1, 1);\n\n\t/** The dark color used to tint the slot's attachment for two color tinting, or null if two color tinting is not used. The dark\n\t * color's alpha is not used. */\n\tdarkColor: Color;\n\n\t/** The name of the attachment that is visible for this slot in the setup pose, or null if no attachment is visible. */\n\tattachmentName: string;\n\n\t/** The blend mode for drawing the slot's attachment. */\n\tblendMode: BlendMode;\n\n\tconstructor(index: number, name: string, boneData: BoneData) {\n\t\tif (index < 0) throw new Error(\"index must be >= 0.\");\n\t\tif (!name) throw new Error(\"name cannot be null.\");\n\t\tif (!boneData) throw new Error(\"boneData cannot be null.\");\n\t\tthis.index = index;\n\t\tthis.name = name;\n\t\tthis.boneData = boneData;\n\t}\n}\n\n/** Determines how images are blended with existing pixels when drawn. */\nexport enum BlendMode { Normal, Additive, Multiply, Screen }\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { ConstraintData } from \"./ConstraintData\";\nimport { BoneData } from \"./BoneData\";\n\n/** Stores the setup pose for a {@link TransformConstraint}.\n *\n * See [Transform constraints](http://esotericsoftware.com/spine-transform-constraints) in the Spine User Guide. */\nexport class TransformConstraintData extends ConstraintData {\n\n\t/** The bones that will be modified by this transform constraint. */\n\tbones = new Array();\n\n\t/** The target bone whose world transform will be copied to the constrained bones. */\n\ttarget: BoneData;\n\n\tmixRotate = 0;\n\tmixX = 0;\n\tmixY = 0;\n\tmixScaleX = 0;\n\tmixScaleY = 0;\n\tmixShearY = 0;\n\n\t/** An offset added to the constrained bone rotation. */\n\toffsetRotation = 0;\n\n\t/** An offset added to the constrained bone X translation. */\n\toffsetX = 0;\n\n\t/** An offset added to the constrained bone Y translation. */\n\toffsetY = 0;\n\n\t/** An offset added to the constrained bone scaleX. */\n\toffsetScaleX = 0;\n\n\t/** An offset added to the constrained bone scaleY. */\n\toffsetScaleY = 0;\n\n\t/** An offset added to the constrained bone shearY. */\n\toffsetShearY = 0;\n\n\trelative = false;\n\tlocal = false;\n\n\tconstructor(name: string) {\n\t\tsuper(name, 0, false);\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Animation, Timeline, AttachmentTimeline, RGBATimeline, RGBTimeline, RGBA2Timeline, RGB2Timeline, AlphaTimeline, RotateTimeline, TranslateTimeline, TranslateXTimeline, TranslateYTimeline, ScaleTimeline, ScaleXTimeline, ScaleYTimeline, ShearTimeline, ShearXTimeline, ShearYTimeline, IkConstraintTimeline, TransformConstraintTimeline, PathConstraintPositionTimeline, PathConstraintSpacingTimeline, PathConstraintMixTimeline, DeformTimeline, DrawOrderTimeline, EventTimeline, CurveTimeline1, CurveTimeline2, CurveTimeline } from \"./Animation\";\nimport { VertexAttachment, Attachment } from \"./attachments/Attachment\";\nimport { AttachmentLoader } from \"./attachments/AttachmentLoader\";\nimport { MeshAttachment } from \"./attachments/MeshAttachment\";\nimport { BoneData } from \"./BoneData\";\nimport { Event } from \"./Event\";\nimport { EventData } from \"./EventData\";\nimport { IkConstraintData } from \"./IkConstraintData\";\nimport { PathConstraintData, PositionMode, SpacingMode } from \"./PathConstraintData\";\nimport { SkeletonData } from \"./SkeletonData\";\nimport { Skin } from \"./Skin\";\nimport { SlotData } from \"./SlotData\";\nimport { TransformConstraintData } from \"./TransformConstraintData\";\nimport { Color, Utils } from \"./Utils\";\n\n/** Loads skeleton data in the Spine binary format.\n *\n * See [Spine binary format](http://esotericsoftware.com/spine-binary-format) and\n * [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine\n * Runtimes Guide. */\nexport class SkeletonBinary {\n\t/** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at\n\t * runtime than were used in Spine.\n\t *\n\t * See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */\n\tscale = 1;\n\n\tattachmentLoader: AttachmentLoader;\n\tprivate linkedMeshes = new Array();\n\n\tconstructor(attachmentLoader: AttachmentLoader) {\n\t\tthis.attachmentLoader = attachmentLoader;\n\t}\n\n\treadSkeletonData(binary: Uint8Array): SkeletonData {\n\t\tlet scale = this.scale;\n\n\t\tlet skeletonData = new SkeletonData();\n\t\tskeletonData.name = \"\"; // BOZO\n\n\t\tlet input = new BinaryInput(binary);\n\n\t\tlet lowHash = input.readInt32();\n\t\tlet highHash = input.readInt32();\n\t\tskeletonData.hash = highHash == 0 && lowHash == 0 ? null : highHash.toString(16) + lowHash.toString(16);\n\t\tskeletonData.version = input.readString();\n\t\tskeletonData.x = input.readFloat();\n\t\tskeletonData.y = input.readFloat();\n\t\tskeletonData.width = input.readFloat();\n\t\tskeletonData.height = input.readFloat();\n\n\t\tlet nonessential = input.readBoolean();\n\t\tif (nonessential) {\n\t\t\tskeletonData.fps = input.readFloat();\n\n\t\t\tskeletonData.imagesPath = input.readString();\n\t\t\tskeletonData.audioPath = input.readString();\n\t\t}\n\n\t\tlet n = 0;\n\t\t// Strings.\n\t\tn = input.readInt(true)\n\t\tfor (let i = 0; i < n; i++)\n\t\t\tinput.strings.push(input.readString());\n\n\t\t// Bones.\n\t\tn = input.readInt(true)\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tlet name = input.readString();\n\t\t\tlet parent = i == 0 ? null : skeletonData.bones[input.readInt(true)];\n\t\t\tlet data = new BoneData(i, name, parent);\n\t\t\tdata.rotation = input.readFloat();\n\t\t\tdata.x = input.readFloat() * scale;\n\t\t\tdata.y = input.readFloat() * scale;\n\t\t\tdata.scaleX = input.readFloat();\n\t\t\tdata.scaleY = input.readFloat();\n\t\t\tdata.shearX = input.readFloat();\n\t\t\tdata.shearY = input.readFloat();\n\t\t\tdata.length = input.readFloat() * scale;\n\t\t\tdata.transformMode = input.readInt(true);\n\t\t\tdata.skinRequired = input.readBoolean();\n\t\t\tif (nonessential) Color.rgba8888ToColor(data.color, input.readInt32());\n\t\t\tskeletonData.bones.push(data);\n\t\t}\n\n\t\t// Slots.\n\t\tn = input.readInt(true);\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tlet slotName = input.readString();\n\t\t\tlet boneData = skeletonData.bones[input.readInt(true)];\n\t\t\tlet data = new SlotData(i, slotName, boneData);\n\t\t\tColor.rgba8888ToColor(data.color, input.readInt32());\n\n\t\t\tlet darkColor = input.readInt32();\n\t\t\tif (darkColor != -1) Color.rgb888ToColor(data.darkColor = new Color(), darkColor);\n\n\t\t\tdata.attachmentName = input.readStringRef();\n\t\t\tdata.blendMode = input.readInt(true);\n\t\t\tskeletonData.slots.push(data);\n\t\t}\n\n\t\t// IK constraints.\n\t\tn = input.readInt(true);\n\t\tfor (let i = 0, nn; i < n; i++) {\n\t\t\tlet data = new IkConstraintData(input.readString());\n\t\t\tdata.order = input.readInt(true);\n\t\t\tdata.skinRequired = input.readBoolean();\n\t\t\tnn = input.readInt(true);\n\t\t\tfor (let ii = 0; ii < nn; ii++)\n\t\t\t\tdata.bones.push(skeletonData.bones[input.readInt(true)]);\n\t\t\tdata.target = skeletonData.bones[input.readInt(true)];\n\t\t\tdata.mix = input.readFloat();\n\t\t\tdata.softness = input.readFloat() * scale;\n\t\t\tdata.bendDirection = input.readByte();\n\t\t\tdata.compress = input.readBoolean();\n\t\t\tdata.stretch = input.readBoolean();\n\t\t\tdata.uniform = input.readBoolean();\n\t\t\tskeletonData.ikConstraints.push(data);\n\t\t}\n\n\t\t// Transform constraints.\n\t\tn = input.readInt(true);\n\t\tfor (let i = 0, nn; i < n; i++) {\n\t\t\tlet data = new TransformConstraintData(input.readString());\n\t\t\tdata.order = input.readInt(true);\n\t\t\tdata.skinRequired = input.readBoolean();\n\t\t\tnn = input.readInt(true);\n\t\t\tfor (let ii = 0; ii < nn; ii++)\n\t\t\t\tdata.bones.push(skeletonData.bones[input.readInt(true)]);\n\t\t\tdata.target = skeletonData.bones[input.readInt(true)];\n\t\t\tdata.local = input.readBoolean();\n\t\t\tdata.relative = input.readBoolean();\n\t\t\tdata.offsetRotation = input.readFloat();\n\t\t\tdata.offsetX = input.readFloat() * scale;\n\t\t\tdata.offsetY = input.readFloat() * scale;\n\t\t\tdata.offsetScaleX = input.readFloat();\n\t\t\tdata.offsetScaleY = input.readFloat();\n\t\t\tdata.offsetShearY = input.readFloat();\n\t\t\tdata.mixRotate = input.readFloat();\n\t\t\tdata.mixX = input.readFloat();\n\t\t\tdata.mixY = input.readFloat();\n\t\t\tdata.mixScaleX = input.readFloat();\n\t\t\tdata.mixScaleY = input.readFloat();\n\t\t\tdata.mixShearY = input.readFloat();\n\t\t\tskeletonData.transformConstraints.push(data);\n\t\t}\n\n\t\t// Path constraints.\n\t\tn = input.readInt(true);\n\t\tfor (let i = 0, nn; i < n; i++) {\n\t\t\tlet data = new PathConstraintData(input.readString());\n\t\t\tdata.order = input.readInt(true);\n\t\t\tdata.skinRequired = input.readBoolean();\n\t\t\tnn = input.readInt(true);\n\t\t\tfor (let ii = 0; ii < nn; ii++)\n\t\t\t\tdata.bones.push(skeletonData.bones[input.readInt(true)]);\n\t\t\tdata.target = skeletonData.slots[input.readInt(true)];\n\t\t\tdata.positionMode = input.readInt(true);\n\t\t\tdata.spacingMode = input.readInt(true);\n\t\t\tdata.rotateMode = input.readInt(true);\n\t\t\tdata.offsetRotation = input.readFloat();\n\t\t\tdata.position = input.readFloat();\n\t\t\tif (data.positionMode == PositionMode.Fixed) data.position *= scale;\n\t\t\tdata.spacing = input.readFloat();\n\t\t\tif (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale;\n\t\t\tdata.mixRotate = input.readFloat();\n\t\t\tdata.mixX = input.readFloat();\n\t\t\tdata.mixY = input.readFloat();\n\t\t\tskeletonData.pathConstraints.push(data);\n\t\t}\n\n\t\t// Default skin.\n\t\tlet defaultSkin = this.readSkin(input, skeletonData, true, nonessential);\n\t\tif (defaultSkin) {\n\t\t\tskeletonData.defaultSkin = defaultSkin;\n\t\t\tskeletonData.skins.push(defaultSkin);\n\t\t}\n\n\t\t// Skins.\n\t\t{\n\t\t\tlet i = skeletonData.skins.length;\n\t\t\tUtils.setArraySize(skeletonData.skins, n = i + input.readInt(true));\n\t\t\tfor (; i < n; i++)\n\t\t\t\tskeletonData.skins[i] = this.readSkin(input, skeletonData, false, nonessential);\n\t\t}\n\n\t\t// Linked meshes.\n\t\tn = this.linkedMeshes.length;\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tlet linkedMesh = this.linkedMeshes[i];\n\t\t\tlet skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);\n\t\t\tlet parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);\n\t\t\tlinkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent as VertexAttachment : linkedMesh.mesh;\n\t\t\tlinkedMesh.mesh.setParentMesh(parent as MeshAttachment);\n\t\t\tlinkedMesh.mesh.updateUVs();\n\t\t}\n\t\tthis.linkedMeshes.length = 0;\n\n\t\t// Events.\n\t\tn = input.readInt(true);\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tlet data = new EventData(input.readStringRef());\n\t\t\tdata.intValue = input.readInt(false);\n\t\t\tdata.floatValue = input.readFloat();\n\t\t\tdata.stringValue = input.readString();\n\t\t\tdata.audioPath = input.readString();\n\t\t\tif (data.audioPath) {\n\t\t\t\tdata.volume = input.readFloat();\n\t\t\t\tdata.balance = input.readFloat();\n\t\t\t}\n\t\t\tskeletonData.events.push(data);\n\t\t}\n\n\t\t// Animations.\n\t\tn = input.readInt(true);\n\t\tfor (let i = 0; i < n; i++)\n\t\t\tskeletonData.animations.push(this.readAnimation(input, input.readString(), skeletonData));\n\t\treturn skeletonData;\n\t}\n\n\tprivate readSkin(input: BinaryInput, skeletonData: SkeletonData, defaultSkin: boolean, nonessential: boolean): Skin {\n\t\tlet skin = null;\n\t\tlet slotCount = 0;\n\n\t\tif (defaultSkin) {\n\t\t\tslotCount = input.readInt(true)\n\t\t\tif (slotCount == 0) return null;\n\t\t\tskin = new Skin(\"default\");\n\t\t} else {\n\t\t\tskin = new Skin(input.readStringRef());\n\t\t\tskin.bones.length = input.readInt(true);\n\t\t\tfor (let i = 0, n = skin.bones.length; i < n; i++)\n\t\t\t\tskin.bones[i] = skeletonData.bones[input.readInt(true)];\n\n\t\t\tfor (let i = 0, n = input.readInt(true); i < n; i++)\n\t\t\t\tskin.constraints.push(skeletonData.ikConstraints[input.readInt(true)]);\n\t\t\tfor (let i = 0, n = input.readInt(true); i < n; i++)\n\t\t\t\tskin.constraints.push(skeletonData.transformConstraints[input.readInt(true)]);\n\t\t\tfor (let i = 0, n = input.readInt(true); i < n; i++)\n\t\t\t\tskin.constraints.push(skeletonData.pathConstraints[input.readInt(true)]);\n\n\t\t\tslotCount = input.readInt(true);\n\t\t}\n\n\t\tfor (let i = 0; i < slotCount; i++) {\n\t\t\tlet slotIndex = input.readInt(true);\n\t\t\tfor (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n\t\t\t\tlet name = input.readStringRef();\n\t\t\t\tlet attachment = this.readAttachment(input, skeletonData, skin, slotIndex, name, nonessential);\n\t\t\t\tif (attachment) skin.setAttachment(slotIndex, name, attachment);\n\t\t\t}\n\t\t}\n\t\treturn skin;\n\t}\n\n\tprivate readAttachment(input: BinaryInput, skeletonData: SkeletonData, skin: Skin, slotIndex: number, attachmentName: string, nonessential: boolean): Attachment {\n\t\tlet scale = this.scale;\n\n\t\tlet name = input.readStringRef();\n\t\tif (!name) name = attachmentName;\n\n\t\tswitch (input.readByte()) {\n\t\t\tcase AttachmentType.Region: {\n\t\t\t\tlet path = input.readStringRef();\n\t\t\t\tlet rotation = input.readFloat();\n\t\t\t\tlet x = input.readFloat();\n\t\t\t\tlet y = input.readFloat();\n\t\t\t\tlet scaleX = input.readFloat();\n\t\t\t\tlet scaleY = input.readFloat();\n\t\t\t\tlet width = input.readFloat();\n\t\t\t\tlet height = input.readFloat();\n\t\t\t\tlet color = input.readInt32();\n\n\t\t\t\tif (!path) path = name;\n\t\t\t\tlet region = this.attachmentLoader.newRegionAttachment(skin, name, path);\n\t\t\t\tif (!region) return null;\n\t\t\t\tregion.path = path;\n\t\t\t\tregion.x = x * scale;\n\t\t\t\tregion.y = y * scale;\n\t\t\t\tregion.scaleX = scaleX;\n\t\t\t\tregion.scaleY = scaleY;\n\t\t\t\tregion.rotation = rotation;\n\t\t\t\tregion.width = width * scale;\n\t\t\t\tregion.height = height * scale;\n\t\t\t\tColor.rgba8888ToColor(region.color, color);\n\t\t\t\tregion.updateOffset();\n\t\t\t\treturn region;\n\t\t\t}\n\t\t\tcase AttachmentType.BoundingBox: {\n\t\t\t\tlet vertexCount = input.readInt(true);\n\t\t\t\tlet vertices = this.readVertices(input, vertexCount);\n\t\t\t\tlet color = nonessential ? input.readInt32() : 0;\n\n\t\t\t\tlet box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);\n\t\t\t\tif (!box) return null;\n\t\t\t\tbox.worldVerticesLength = vertexCount << 1;\n\t\t\t\tbox.vertices = vertices.vertices;\n\t\t\t\tbox.bones = vertices.bones;\n\t\t\t\tif (nonessential) Color.rgba8888ToColor(box.color, color);\n\t\t\t\treturn box;\n\t\t\t}\n\t\t\tcase AttachmentType.Mesh: {\n\t\t\t\tlet path = input.readStringRef();\n\t\t\t\tlet color = input.readInt32();\n\t\t\t\tlet vertexCount = input.readInt(true);\n\t\t\t\tlet uvs = this.readFloatArray(input, vertexCount << 1, 1);\n\t\t\t\tlet triangles = this.readShortArray(input);\n\t\t\t\tlet vertices = this.readVertices(input, vertexCount);\n\t\t\t\tlet hullLength = input.readInt(true);\n\t\t\t\tlet edges = null;\n\t\t\t\tlet width = 0, height = 0;\n\t\t\t\tif (nonessential) {\n\t\t\t\t\tedges = this.readShortArray(input);\n\t\t\t\t\twidth = input.readFloat();\n\t\t\t\t\theight = input.readFloat();\n\t\t\t\t}\n\n\t\t\t\tif (!path) path = name;\n\t\t\t\tlet mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);\n\t\t\t\tif (!mesh) return null;\n\t\t\t\tmesh.path = path;\n\t\t\t\tColor.rgba8888ToColor(mesh.color, color);\n\t\t\t\tmesh.bones = vertices.bones;\n\t\t\t\tmesh.vertices = vertices.vertices;\n\t\t\t\tmesh.worldVerticesLength = vertexCount << 1;\n\t\t\t\tmesh.triangles = triangles;\n\t\t\t\tmesh.regionUVs = uvs;\n\t\t\t\tmesh.updateUVs();\n\t\t\t\tmesh.hullLength = hullLength << 1;\n\t\t\t\tif (nonessential) {\n\t\t\t\t\tmesh.edges = edges;\n\t\t\t\t\tmesh.width = width * scale;\n\t\t\t\t\tmesh.height = height * scale;\n\t\t\t\t}\n\t\t\t\treturn mesh;\n\t\t\t}\n\t\t\tcase AttachmentType.LinkedMesh: {\n\t\t\t\tlet path = input.readStringRef();\n\t\t\t\tlet color = input.readInt32();\n\t\t\t\tlet skinName = input.readStringRef();\n\t\t\t\tlet parent = input.readStringRef();\n\t\t\t\tlet inheritDeform = input.readBoolean();\n\t\t\t\tlet width = 0, height = 0;\n\t\t\t\tif (nonessential) {\n\t\t\t\t\twidth = input.readFloat();\n\t\t\t\t\theight = input.readFloat();\n\t\t\t\t}\n\n\t\t\t\tif (!path) path = name;\n\t\t\t\tlet mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);\n\t\t\t\tif (!mesh) return null;\n\t\t\t\tmesh.path = path;\n\t\t\t\tColor.rgba8888ToColor(mesh.color, color);\n\t\t\t\tif (nonessential) {\n\t\t\t\t\tmesh.width = width * scale;\n\t\t\t\t\tmesh.height = height * scale;\n\t\t\t\t}\n\t\t\t\tthis.linkedMeshes.push(new LinkedMesh(mesh, skinName, slotIndex, parent, inheritDeform));\n\t\t\t\treturn mesh;\n\t\t\t}\n\t\t\tcase AttachmentType.Path: {\n\t\t\t\tlet closed = input.readBoolean();\n\t\t\t\tlet constantSpeed = input.readBoolean();\n\t\t\t\tlet vertexCount = input.readInt(true);\n\t\t\t\tlet vertices = this.readVertices(input, vertexCount);\n\t\t\t\tlet lengths = Utils.newArray(vertexCount / 3, 0);\n\t\t\t\tfor (let i = 0, n = lengths.length; i < n; i++)\n\t\t\t\t\tlengths[i] = input.readFloat() * scale;\n\t\t\t\tlet color = nonessential ? input.readInt32() : 0;\n\n\t\t\t\tlet path = this.attachmentLoader.newPathAttachment(skin, name);\n\t\t\t\tif (!path) return null;\n\t\t\t\tpath.closed = closed;\n\t\t\t\tpath.constantSpeed = constantSpeed;\n\t\t\t\tpath.worldVerticesLength = vertexCount << 1;\n\t\t\t\tpath.vertices = vertices.vertices;\n\t\t\t\tpath.bones = vertices.bones;\n\t\t\t\tpath.lengths = lengths;\n\t\t\t\tif (nonessential) Color.rgba8888ToColor(path.color, color);\n\t\t\t\treturn path;\n\t\t\t}\n\t\t\tcase AttachmentType.Point: {\n\t\t\t\tlet rotation = input.readFloat();\n\t\t\t\tlet x = input.readFloat();\n\t\t\t\tlet y = input.readFloat();\n\t\t\t\tlet color = nonessential ? input.readInt32() : 0;\n\n\t\t\t\tlet point = this.attachmentLoader.newPointAttachment(skin, name);\n\t\t\t\tif (!point) return null;\n\t\t\t\tpoint.x = x * scale;\n\t\t\t\tpoint.y = y * scale;\n\t\t\t\tpoint.rotation = rotation;\n\t\t\t\tif (nonessential) Color.rgba8888ToColor(point.color, color);\n\t\t\t\treturn point;\n\t\t\t}\n\t\t\tcase AttachmentType.Clipping: {\n\t\t\t\tlet endSlotIndex = input.readInt(true);\n\t\t\t\tlet vertexCount = input.readInt(true);\n\t\t\t\tlet vertices = this.readVertices(input, vertexCount);\n\t\t\t\tlet color = nonessential ? input.readInt32() : 0;\n\n\t\t\t\tlet clip = this.attachmentLoader.newClippingAttachment(skin, name);\n\t\t\t\tif (!clip) return null;\n\t\t\t\tclip.endSlot = skeletonData.slots[endSlotIndex];\n\t\t\t\tclip.worldVerticesLength = vertexCount << 1;\n\t\t\t\tclip.vertices = vertices.vertices;\n\t\t\t\tclip.bones = vertices.bones;\n\t\t\t\tif (nonessential) Color.rgba8888ToColor(clip.color, color);\n\t\t\t\treturn clip;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate readVertices(input: BinaryInput, vertexCount: number): Vertices {\n\t\tlet scale = this.scale;\n\t\tlet verticesLength = vertexCount << 1;\n\t\tlet vertices = new Vertices();\n\t\tif (!input.readBoolean()) {\n\t\t\tvertices.vertices = this.readFloatArray(input, verticesLength, scale);\n\t\t\treturn vertices;\n\t\t}\n\t\tlet weights = new Array();\n\t\tlet bonesArray = new Array();\n\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\tlet boneCount = input.readInt(true);\n\t\t\tbonesArray.push(boneCount);\n\t\t\tfor (let ii = 0; ii < boneCount; ii++) {\n\t\t\t\tbonesArray.push(input.readInt(true));\n\t\t\t\tweights.push(input.readFloat() * scale);\n\t\t\t\tweights.push(input.readFloat() * scale);\n\t\t\t\tweights.push(input.readFloat());\n\t\t\t}\n\t\t}\n\t\tvertices.vertices = Utils.toFloatArray(weights);\n\t\tvertices.bones = bonesArray;\n\t\treturn vertices;\n\t}\n\n\tprivate readFloatArray(input: BinaryInput, n: number, scale: number): number[] {\n\t\tlet array = new Array(n);\n\t\tif (scale == 1) {\n\t\t\tfor (let i = 0; i < n; i++)\n\t\t\t\tarray[i] = input.readFloat();\n\t\t} else {\n\t\t\tfor (let i = 0; i < n; i++)\n\t\t\t\tarray[i] = input.readFloat() * scale;\n\t\t}\n\t\treturn array;\n\t}\n\n\tprivate readShortArray(input: BinaryInput): number[] {\n\t\tlet n = input.readInt(true);\n\t\tlet array = new Array(n);\n\t\tfor (let i = 0; i < n; i++)\n\t\t\tarray[i] = input.readShort();\n\t\treturn array;\n\t}\n\n\tprivate readAnimation(input: BinaryInput, name: string, skeletonData: SkeletonData): Animation {\n\t\tinput.readInt(true); // Number of timelines.\n\t\tlet timelines = new Array();\n\t\tlet scale = this.scale;\n\t\tlet tempColor1 = new Color();\n\t\tlet tempColor2 = new Color();\n\n\t\t// Slot timelines.\n\t\tfor (let i = 0, n = input.readInt(true); i < n; i++) {\n\t\t\tlet slotIndex = input.readInt(true);\n\t\t\tfor (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n\t\t\t\tlet timelineType = input.readByte();\n\t\t\t\tlet frameCount = input.readInt(true);\n\t\t\t\tlet frameLast = frameCount - 1;\n\t\t\t\tswitch (timelineType) {\n\t\t\t\t\tcase SLOT_ATTACHMENT: {\n\t\t\t\t\t\tlet timeline = new AttachmentTimeline(frameCount, slotIndex);\n\t\t\t\t\t\tfor (let frame = 0; frame < frameCount; frame++)\n\t\t\t\t\t\t\ttimeline.setFrame(frame, input.readFloat(), input.readStringRef());\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SLOT_RGBA: {\n\t\t\t\t\t\tlet bezierCount = input.readInt(true);\n\t\t\t\t\t\tlet timeline = new RGBATimeline(frameCount, bezierCount, slotIndex);\n\n\t\t\t\t\t\tlet time = input.readFloat();\n\t\t\t\t\t\tlet r = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet g = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet b = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet a = input.readUnsignedByte() / 255.0;\n\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, r, g, b, a);\n\t\t\t\t\t\t\tif (frame == frameLast) break;\n\n\t\t\t\t\t\t\tlet time2 = input.readFloat();\n\t\t\t\t\t\t\tlet r2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet g2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet b2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet a2 = input.readUnsignedByte() / 255.0;\n\n\t\t\t\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 3, time, time2, a, a2, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tr = r2;\n\t\t\t\t\t\t\tg = g2;\n\t\t\t\t\t\t\tb = b2;\n\t\t\t\t\t\t\ta = a2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SLOT_RGB: {\n\t\t\t\t\t\tlet bezierCount = input.readInt(true);\n\t\t\t\t\t\tlet timeline = new RGBTimeline(frameCount, bezierCount, slotIndex);\n\n\t\t\t\t\t\tlet time = input.readFloat();\n\t\t\t\t\t\tlet r = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet g = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet b = input.readUnsignedByte() / 255.0;\n\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, r, g, b);\n\t\t\t\t\t\t\tif (frame == frameLast) break;\n\n\t\t\t\t\t\t\tlet time2 = input.readFloat();\n\t\t\t\t\t\t\tlet r2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet g2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet b2 = input.readUnsignedByte() / 255.0;\n\n\t\t\t\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tr = r2;\n\t\t\t\t\t\t\tg = g2;\n\t\t\t\t\t\t\tb = b2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SLOT_RGBA2: {\n\t\t\t\t\t\tlet bezierCount = input.readInt(true);\n\t\t\t\t\t\tlet timeline = new RGBA2Timeline(frameCount, bezierCount, slotIndex);\n\n\t\t\t\t\t\tlet time = input.readFloat();\n\t\t\t\t\t\tlet r = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet g = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet b = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet a = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet r2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet g2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet b2 = input.readUnsignedByte() / 255.0;\n\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, r, g, b, a, r2, g2, b2);\n\t\t\t\t\t\t\tif (frame == frameLast) break;\n\t\t\t\t\t\t\tlet time2 = input.readFloat();\n\t\t\t\t\t\t\tlet nr = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet ng = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet nb = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet na = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet nr2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet ng2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet nb2 = input.readUnsignedByte() / 255.0;\n\n\t\t\t\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 3, time, time2, a, na, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 4, time, time2, r2, nr2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 5, time, time2, g2, ng2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 6, time, time2, b2, nb2, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tr = nr;\n\t\t\t\t\t\t\tg = ng;\n\t\t\t\t\t\t\tb = nb;\n\t\t\t\t\t\t\ta = na;\n\t\t\t\t\t\t\tr2 = nr2;\n\t\t\t\t\t\t\tg2 = ng2;\n\t\t\t\t\t\t\tb2 = nb2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SLOT_RGB2: {\n\t\t\t\t\t\tlet bezierCount = input.readInt(true);\n\t\t\t\t\t\tlet timeline = new RGB2Timeline(frameCount, bezierCount, slotIndex);\n\n\t\t\t\t\t\tlet time = input.readFloat();\n\t\t\t\t\t\tlet r = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet g = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet b = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet r2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet g2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\tlet b2 = input.readUnsignedByte() / 255.0;\n\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, r, g, b, r2, g2, b2);\n\t\t\t\t\t\t\tif (frame == frameLast) break;\n\t\t\t\t\t\t\tlet time2 = input.readFloat();\n\t\t\t\t\t\t\tlet nr = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet ng = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet nb = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet nr2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet ng2 = input.readUnsignedByte() / 255.0;\n\t\t\t\t\t\t\tlet nb2 = input.readUnsignedByte() / 255.0;\n\n\t\t\t\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 3, time, time2, r2, nr2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 4, time, time2, g2, ng2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 5, time, time2, b2, nb2, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tr = nr;\n\t\t\t\t\t\t\tg = ng;\n\t\t\t\t\t\t\tb = nb;\n\t\t\t\t\t\t\tr2 = nr2;\n\t\t\t\t\t\t\tg2 = ng2;\n\t\t\t\t\t\t\tb2 = nb2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SLOT_ALPHA: {\n\t\t\t\t\t\tlet timeline = new AlphaTimeline(frameCount, input.readInt(true), slotIndex);\n\t\t\t\t\t\tlet time = input.readFloat(), a = input.readUnsignedByte() / 255;\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, a);\n\t\t\t\t\t\t\tif (frame == frameLast) break;\n\t\t\t\t\t\t\tlet time2 = input.readFloat();\n\t\t\t\t\t\t\tlet a2 = input.readUnsignedByte() / 255;\n\t\t\t\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, a, a2, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\ta = a2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Bone timelines.\n\t\tfor (let i = 0, n = input.readInt(true); i < n; i++) {\n\t\t\tlet boneIndex = input.readInt(true);\n\t\t\tfor (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n\t\t\t\tlet type = input.readByte(), frameCount = input.readInt(true), bezierCount = input.readInt(true);\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase BONE_ROTATE:\n\t\t\t\t\t\ttimelines.push(readTimeline1(input, new RotateTimeline(frameCount, bezierCount, boneIndex), 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_TRANSLATE:\n\t\t\t\t\t\ttimelines.push(readTimeline2(input, new TranslateTimeline(frameCount, bezierCount, boneIndex), scale));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_TRANSLATEX:\n\t\t\t\t\t\ttimelines.push(readTimeline1(input, new TranslateXTimeline(frameCount, bezierCount, boneIndex), scale));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_TRANSLATEY:\n\t\t\t\t\t\ttimelines.push(readTimeline1(input, new TranslateYTimeline(frameCount, bezierCount, boneIndex), scale));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_SCALE:\n\t\t\t\t\t\ttimelines.push(readTimeline2(input, new ScaleTimeline(frameCount, bezierCount, boneIndex), 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_SCALEX:\n\t\t\t\t\t\ttimelines.push(readTimeline1(input, new ScaleXTimeline(frameCount, bezierCount, boneIndex), 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_SCALEY:\n\t\t\t\t\t\ttimelines.push(readTimeline1(input, new ScaleYTimeline(frameCount, bezierCount, boneIndex), 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_SHEAR:\n\t\t\t\t\t\ttimelines.push(readTimeline2(input, new ShearTimeline(frameCount, bezierCount, boneIndex), 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_SHEARX:\n\t\t\t\t\t\ttimelines.push(readTimeline1(input, new ShearXTimeline(frameCount, bezierCount, boneIndex), 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BONE_SHEARY:\n\t\t\t\t\t\ttimelines.push(readTimeline1(input, new ShearYTimeline(frameCount, bezierCount, boneIndex), 1));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// IK constraint timelines.\n\t\tfor (let i = 0, n = input.readInt(true); i < n; i++) {\n\t\t\tlet index = input.readInt(true), frameCount = input.readInt(true), frameLast = frameCount - 1;\n\t\t\tlet timeline = new IkConstraintTimeline(frameCount, input.readInt(true), index);\n\t\t\tlet time = input.readFloat(), mix = input.readFloat(), softness = input.readFloat() * scale;\n\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\ttimeline.setFrame(frame, time, mix, softness, input.readByte(), input.readBoolean(), input.readBoolean());\n\t\t\t\tif (frame == frameLast) break;\n\t\t\t\tlet time2 = input.readFloat(), mix2 = input.readFloat(), softness2 = input.readFloat() * scale;\n\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, mix, mix2, 1);\n\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 1, time, time2, softness, softness2, scale);\n\t\t\t\t}\n\t\t\t\ttime = time2;\n\t\t\t\tmix = mix2;\n\t\t\t\tsoftness = softness2;\n\t\t\t}\n\t\t\ttimelines.push(timeline);\n\t\t}\n\n\t\t// Transform constraint timelines.\n\t\tfor (let i = 0, n = input.readInt(true); i < n; i++) {\n\t\t\tlet index = input.readInt(true), frameCount = input.readInt(true), frameLast = frameCount - 1;\n\t\t\tlet timeline = new TransformConstraintTimeline(frameCount, input.readInt(true), index);\n\t\t\tlet time = input.readFloat(), mixRotate = input.readFloat(), mixX = input.readFloat(), mixY = input.readFloat(),\n\t\t\t\tmixScaleX = input.readFloat(), mixScaleY = input.readFloat(), mixShearY = input.readFloat();\n\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\ttimeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);\n\t\t\t\tif (frame == frameLast) break;\n\t\t\t\tlet time2 = input.readFloat(), mixRotate2 = input.readFloat(), mixX2 = input.readFloat(), mixY2 = input.readFloat(),\n\t\t\t\t\tmixScaleX2 = input.readFloat(), mixScaleY2 = input.readFloat(), mixShearY2 = input.readFloat();\n\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1);\n\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1);\n\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1);\n\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);\n\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);\n\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 5, time, time2, mixShearY, mixShearY2, 1);\n\t\t\t\t}\n\t\t\t\ttime = time2;\n\t\t\t\tmixRotate = mixRotate2;\n\t\t\t\tmixX = mixX2;\n\t\t\t\tmixY = mixY2;\n\t\t\t\tmixScaleX = mixScaleX2;\n\t\t\t\tmixScaleY = mixScaleY2;\n\t\t\t\tmixShearY = mixShearY2;\n\t\t\t}\n\t\t\ttimelines.push(timeline);\n\t\t}\n\n\t\t// Path constraint timelines.\n\t\tfor (let i = 0, n = input.readInt(true); i < n; i++) {\n\t\t\tlet index = input.readInt(true);\n\t\t\tlet data = skeletonData.pathConstraints[index];\n\t\t\tfor (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\tcase PATH_POSITION:\n\t\t\t\t\t\ttimelines\n\t\t\t\t\t\t\t.push(readTimeline1(input, new PathConstraintPositionTimeline(input.readInt(true), input.readInt(true), index),\n\t\t\t\t\t\t\t\tdata.positionMode == PositionMode.Fixed ? scale : 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase PATH_SPACING:\n\t\t\t\t\t\ttimelines\n\t\t\t\t\t\t\t.push(readTimeline1(input, new PathConstraintSpacingTimeline(input.readInt(true), input.readInt(true), index),\n\t\t\t\t\t\t\t\tdata.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed ? scale : 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase PATH_MIX:\n\t\t\t\t\t\tlet timeline = new PathConstraintMixTimeline(input.readInt(true), input.readInt(true), index);\n\t\t\t\t\t\tlet time = input.readFloat(), mixRotate = input.readFloat(), mixX = input.readFloat(), mixY = input.readFloat();\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, mixRotate, mixX, mixY);\n\t\t\t\t\t\t\tif (frame == frameLast) break;\n\t\t\t\t\t\t\tlet time2 = input.readFloat(), mixRotate2 = input.readFloat(), mixX2 = input.readFloat(),\n\t\t\t\t\t\t\t\tmixY2 = input.readFloat();\n\t\t\t\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1);\n\t\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tmixRotate = mixRotate2;\n\t\t\t\t\t\t\tmixX = mixX2;\n\t\t\t\t\t\t\tmixY = mixY2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Deform timelines.\n\t\tfor (let i = 0, n = input.readInt(true); i < n; i++) {\n\t\t\tlet skin = skeletonData.skins[input.readInt(true)];\n\t\t\tfor (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n\t\t\t\tlet slotIndex = input.readInt(true);\n\t\t\t\tfor (let iii = 0, nnn = input.readInt(true); iii < nnn; iii++) {\n\t\t\t\t\tlet attachmentName = input.readStringRef();\n\t\t\t\t\tlet attachment = skin.getAttachment(slotIndex, attachmentName) as VertexAttachment;\n\t\t\t\t\tlet weighted = attachment.bones;\n\t\t\t\t\tlet vertices = attachment.vertices;\n\t\t\t\t\tlet deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;\n\n\t\t\t\t\tlet frameCount = input.readInt(true);\n\t\t\t\t\tlet frameLast = frameCount - 1;\n\t\t\t\t\tlet bezierCount = input.readInt(true);\n\t\t\t\t\tlet timeline = new DeformTimeline(frameCount, bezierCount, slotIndex, attachment);\n\n\t\t\t\t\tlet time = input.readFloat();\n\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\tlet deform;\n\t\t\t\t\t\tlet end = input.readInt(true);\n\t\t\t\t\t\tif (end == 0)\n\t\t\t\t\t\t\tdeform = weighted ? Utils.newFloatArray(deformLength) : vertices;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdeform = Utils.newFloatArray(deformLength);\n\t\t\t\t\t\t\tlet start = input.readInt(true);\n\t\t\t\t\t\t\tend += start;\n\t\t\t\t\t\t\tif (scale == 1) {\n\t\t\t\t\t\t\t\tfor (let v = start; v < end; v++)\n\t\t\t\t\t\t\t\t\tdeform[v] = input.readFloat();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfor (let v = start; v < end; v++)\n\t\t\t\t\t\t\t\t\tdeform[v] = input.readFloat() * scale;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!weighted) {\n\t\t\t\t\t\t\t\tfor (let v = 0, vn = deform.length; v < vn; v++)\n\t\t\t\t\t\t\t\t\tdeform[v] += vertices[v];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttimeline.setFrame(frame, time, deform);\n\t\t\t\t\t\tif (frame == frameLast) break;\n\t\t\t\t\t\tlet time2 = input.readFloat();\n\t\t\t\t\t\tswitch (input.readByte()) {\n\t\t\t\t\t\t\tcase CURVE_STEPPED:\n\t\t\t\t\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase CURVE_BEZIER:\n\t\t\t\t\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, 0, 1, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t}\n\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Draw order timeline.\n\t\tlet drawOrderCount = input.readInt(true);\n\t\tif (drawOrderCount > 0) {\n\t\t\tlet timeline = new DrawOrderTimeline(drawOrderCount);\n\t\t\tlet slotCount = skeletonData.slots.length;\n\t\t\tfor (let i = 0; i < drawOrderCount; i++) {\n\t\t\t\tlet time = input.readFloat();\n\t\t\t\tlet offsetCount = input.readInt(true);\n\t\t\t\tlet drawOrder = Utils.newArray(slotCount, 0);\n\t\t\t\tfor (let ii = slotCount - 1; ii >= 0; ii--)\n\t\t\t\t\tdrawOrder[ii] = -1;\n\t\t\t\tlet unchanged = Utils.newArray(slotCount - offsetCount, 0);\n\t\t\t\tlet originalIndex = 0, unchangedIndex = 0;\n\t\t\t\tfor (let ii = 0; ii < offsetCount; ii++) {\n\t\t\t\t\tlet slotIndex = input.readInt(true);\n\t\t\t\t\t// Collect unchanged items.\n\t\t\t\t\twhile (originalIndex != slotIndex)\n\t\t\t\t\t\tunchanged[unchangedIndex++] = originalIndex++;\n\t\t\t\t\t// Set changed items.\n\t\t\t\t\tdrawOrder[originalIndex + input.readInt(true)] = originalIndex++;\n\t\t\t\t}\n\t\t\t\t// Collect remaining unchanged items.\n\t\t\t\twhile (originalIndex < slotCount)\n\t\t\t\t\tunchanged[unchangedIndex++] = originalIndex++;\n\t\t\t\t// Fill in unchanged items.\n\t\t\t\tfor (let ii = slotCount - 1; ii >= 0; ii--)\n\t\t\t\t\tif (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex];\n\t\t\t\ttimeline.setFrame(i, time, drawOrder);\n\t\t\t}\n\t\t\ttimelines.push(timeline);\n\t\t}\n\n\t\t// Event timeline.\n\t\tlet eventCount = input.readInt(true);\n\t\tif (eventCount > 0) {\n\t\t\tlet timeline = new EventTimeline(eventCount);\n\t\t\tfor (let i = 0; i < eventCount; i++) {\n\t\t\t\tlet time = input.readFloat();\n\t\t\t\tlet eventData = skeletonData.events[input.readInt(true)];\n\t\t\t\tlet event = new Event(time, eventData);\n\t\t\t\tevent.intValue = input.readInt(false);\n\t\t\t\tevent.floatValue = input.readFloat();\n\t\t\t\tevent.stringValue = input.readBoolean() ? input.readString() : eventData.stringValue;\n\t\t\t\tif (event.data.audioPath) {\n\t\t\t\t\tevent.volume = input.readFloat();\n\t\t\t\t\tevent.balance = input.readFloat();\n\t\t\t\t}\n\t\t\t\ttimeline.setFrame(i, event);\n\t\t\t}\n\t\t\ttimelines.push(timeline);\n\t\t}\n\n\t\tlet duration = 0;\n\t\tfor (let i = 0, n = timelines.length; i < n; i++)\n\t\t\tduration = Math.max(duration, timelines[i].getDuration());\n\t\treturn new Animation(name, timelines, duration);\n\t}\n}\n\nexport class BinaryInput {\n\tconstructor(data: Uint8Array, public strings = new Array(), private index: number = 0, private buffer = new DataView(data.buffer)) {\n\t}\n\n\treadByte(): number {\n\t\treturn this.buffer.getInt8(this.index++);\n\t}\n\n\treadUnsignedByte(): number {\n\t\treturn this.buffer.getUint8(this.index++);\n\t}\n\n\treadShort(): number {\n\t\tlet value = this.buffer.getInt16(this.index);\n\t\tthis.index += 2;\n\t\treturn value;\n\t}\n\n\treadInt32(): number {\n\t\tlet value = this.buffer.getInt32(this.index)\n\t\tthis.index += 4;\n\t\treturn value;\n\t}\n\n\treadInt(optimizePositive: boolean) {\n\t\tlet b = this.readByte();\n\t\tlet result = b & 0x7F;\n\t\tif ((b & 0x80) != 0) {\n\t\t\tb = this.readByte();\n\t\t\tresult |= (b & 0x7F) << 7;\n\t\t\tif ((b & 0x80) != 0) {\n\t\t\t\tb = this.readByte();\n\t\t\t\tresult |= (b & 0x7F) << 14;\n\t\t\t\tif ((b & 0x80) != 0) {\n\t\t\t\t\tb = this.readByte();\n\t\t\t\t\tresult |= (b & 0x7F) << 21;\n\t\t\t\t\tif ((b & 0x80) != 0) {\n\t\t\t\t\t\tb = this.readByte();\n\t\t\t\t\t\tresult |= (b & 0x7F) << 28;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn optimizePositive ? result : ((result >>> 1) ^ -(result & 1));\n\t}\n\n\treadStringRef(): string {\n\t\tlet index = this.readInt(true);\n\t\treturn index == 0 ? null : this.strings[index - 1];\n\t}\n\n\treadString(): string {\n\t\tlet byteCount = this.readInt(true);\n\t\tswitch (byteCount) {\n\t\t\tcase 0:\n\t\t\t\treturn null;\n\t\t\tcase 1:\n\t\t\t\treturn \"\";\n\t\t}\n\t\tbyteCount--;\n\t\tlet chars = \"\";\n\t\tlet charCount = 0;\n\t\tfor (let i = 0; i < byteCount;) {\n\t\t\tlet b = this.readByte();\n\t\t\tswitch (b >> 4) {\n\t\t\t\tcase 12:\n\t\t\t\tcase 13:\n\t\t\t\t\tchars += String.fromCharCode(((b & 0x1F) << 6 | this.readByte() & 0x3F));\n\t\t\t\t\ti += 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 14:\n\t\t\t\t\tchars += String.fromCharCode(((b & 0x0F) << 12 | (this.readByte() & 0x3F) << 6 | this.readByte() & 0x3F));\n\t\t\t\t\ti += 3;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tchars += String.fromCharCode(b);\n\t\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\treturn chars;\n\t}\n\n\treadFloat(): number {\n\t\tlet value = this.buffer.getFloat32(this.index);\n\t\tthis.index += 4;\n\t\treturn value;\n\t}\n\n\treadBoolean(): boolean {\n\t\treturn this.readByte() != 0;\n\t}\n}\n\nclass LinkedMesh {\n\tparent: string; skin: string;\n\tslotIndex: number;\n\tmesh: MeshAttachment;\n\tinheritDeform: boolean;\n\n\tconstructor(mesh: MeshAttachment, skin: string, slotIndex: number, parent: string, inheritDeform: boolean) {\n\t\tthis.mesh = mesh;\n\t\tthis.skin = skin;\n\t\tthis.slotIndex = slotIndex;\n\t\tthis.parent = parent;\n\t\tthis.inheritDeform = inheritDeform;\n\t}\n}\n\nclass Vertices {\n\tconstructor(public bones: Array = null, public vertices: Array | Float32Array = null) { }\n}\n\nenum AttachmentType { Region, BoundingBox, Mesh, LinkedMesh, Path, Point, Clipping }\n\nfunction readTimeline1(input: BinaryInput, timeline: CurveTimeline1, scale: number): CurveTimeline1 {\n\tlet time = input.readFloat(), value = input.readFloat() * scale;\n\tfor (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) {\n\t\ttimeline.setFrame(frame, time, value);\n\t\tif (frame == frameLast) break;\n\t\tlet time2 = input.readFloat(), value2 = input.readFloat() * scale;\n\t\tswitch (input.readByte()) {\n\t\t\tcase CURVE_STEPPED:\n\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\tbreak;\n\t\t\tcase CURVE_BEZIER:\n\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, value, value2, scale);\n\t\t}\n\t\ttime = time2;\n\t\tvalue = value2;\n\t}\n\treturn timeline;\n}\n\nfunction readTimeline2(input: BinaryInput, timeline: CurveTimeline2, scale: number): CurveTimeline2 {\n\tlet time = input.readFloat(), value1 = input.readFloat() * scale, value2 = input.readFloat() * scale;\n\tfor (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) {\n\t\ttimeline.setFrame(frame, time, value1, value2);\n\t\tif (frame == frameLast) break;\n\t\tlet time2 = input.readFloat(), nvalue1 = input.readFloat() * scale, nvalue2 = input.readFloat() * scale;\n\t\tswitch (input.readByte()) {\n\t\t\tcase CURVE_STEPPED:\n\t\t\t\ttimeline.setStepped(frame);\n\t\t\t\tbreak;\n\t\t\tcase CURVE_BEZIER:\n\t\t\t\tsetBezier(input, timeline, bezier++, frame, 0, time, time2, value1, nvalue1, scale);\n\t\t\t\tsetBezier(input, timeline, bezier++, frame, 1, time, time2, value2, nvalue2, scale);\n\t\t}\n\t\ttime = time2;\n\t\tvalue1 = nvalue1;\n\t\tvalue2 = nvalue2;\n\t}\n\treturn timeline;\n}\n\nfunction setBezier(input: BinaryInput, timeline: CurveTimeline, bezier: number, frame: number, value: number,\n\ttime1: number, time2: number, value1: number, value2: number, scale: number) {\n\ttimeline.setBezier(bezier, frame, value, time1, value1, input.readFloat(), input.readFloat() * scale, input.readFloat(), input.readFloat() * scale, time2, value2);\n}\n\nconst BONE_ROTATE = 0;\nconst BONE_TRANSLATE = 1;\nconst BONE_TRANSLATEX = 2;\nconst BONE_TRANSLATEY = 3;\nconst BONE_SCALE = 4;\nconst BONE_SCALEX = 5;\nconst BONE_SCALEY = 6;\nconst BONE_SHEAR = 7;\nconst BONE_SHEARX = 8;\nconst BONE_SHEARY = 9;\n\nconst SLOT_ATTACHMENT = 0;\nconst SLOT_RGBA = 1;\nconst SLOT_RGB = 2;\nconst SLOT_RGBA2 = 3;\nconst SLOT_RGB2 = 4;\nconst SLOT_ALPHA = 5;\n\nconst PATH_POSITION = 0;\nconst PATH_SPACING = 1;\nconst PATH_MIX = 2;\n\nconst CURVE_LINEAR = 0;\nconst CURVE_STEPPED = 1;\nconst CURVE_BEZIER = 2;\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { BoundingBoxAttachment } from \"./attachments/BoundingBoxAttachment\";\nimport { Skeleton } from \"./Skeleton\";\nimport { NumberArrayLike, Pool, Utils } from \"./Utils\";\n\n/** Collects each visible {@link BoundingBoxAttachment} and computes the world vertices for its polygon. The polygon vertices are\n * provided along with convenience methods for doing hit detection. */\nexport class SkeletonBounds {\n\n\t/** The left edge of the axis aligned bounding box. */\n\tminX = 0;\n\n\t/** The bottom edge of the axis aligned bounding box. */\n\tminY = 0;\n\n\t/** The right edge of the axis aligned bounding box. */\n\tmaxX = 0;\n\n\t/** The top edge of the axis aligned bounding box. */\n\tmaxY = 0;\n\n\t/** The visible bounding boxes. */\n\tboundingBoxes = new Array();\n\n\t/** The world vertices for the bounding box polygons. */\n\tpolygons = new Array();\n\n\tprivate polygonPool = new Pool(() => {\n\t\treturn Utils.newFloatArray(16);\n\t});\n\n\t/** Clears any previous polygons, finds all visible bounding box attachments, and computes the world vertices for each bounding\n\t * box's polygon.\n\t * @param updateAabb If true, the axis aligned bounding box containing all the polygons is computed. If false, the\n\t * SkeletonBounds AABB methods will always return true. */\n\tupdate(skeleton: Skeleton, updateAabb: boolean) {\n\t\tif (!skeleton) throw new Error(\"skeleton cannot be null.\");\n\t\tlet boundingBoxes = this.boundingBoxes;\n\t\tlet polygons = this.polygons;\n\t\tlet polygonPool = this.polygonPool;\n\t\tlet slots = skeleton.slots;\n\t\tlet slotCount = slots.length;\n\n\t\tboundingBoxes.length = 0;\n\t\tpolygonPool.freeAll(polygons);\n\t\tpolygons.length = 0;\n\n\t\tfor (let i = 0; i < slotCount; i++) {\n\t\t\tlet slot = slots[i];\n\t\t\tif (!slot.bone.active) continue;\n\t\t\tlet attachment = slot.getAttachment();\n\t\t\tif (attachment instanceof BoundingBoxAttachment) {\n\t\t\t\tlet boundingBox = attachment as BoundingBoxAttachment;\n\t\t\t\tboundingBoxes.push(boundingBox);\n\n\t\t\t\tlet polygon = polygonPool.obtain();\n\t\t\t\tif (polygon.length != boundingBox.worldVerticesLength) {\n\t\t\t\t\tpolygon = Utils.newFloatArray(boundingBox.worldVerticesLength);\n\t\t\t\t}\n\t\t\t\tpolygons.push(polygon);\n\t\t\t\tboundingBox.computeWorldVertices(slot, 0, boundingBox.worldVerticesLength, polygon, 0, 2);\n\t\t\t}\n\t\t}\n\n\t\tif (updateAabb) {\n\t\t\tthis.aabbCompute();\n\t\t} else {\n\t\t\tthis.minX = Number.POSITIVE_INFINITY;\n\t\t\tthis.minY = Number.POSITIVE_INFINITY;\n\t\t\tthis.maxX = Number.NEGATIVE_INFINITY;\n\t\t\tthis.maxY = Number.NEGATIVE_INFINITY;\n\t\t}\n\t}\n\n\taabbCompute() {\n\t\tlet minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;\n\t\tlet polygons = this.polygons;\n\t\tfor (let i = 0, n = polygons.length; i < n; i++) {\n\t\t\tlet polygon = polygons[i];\n\t\t\tlet vertices = polygon;\n\t\t\tfor (let ii = 0, nn = polygon.length; ii < nn; ii += 2) {\n\t\t\t\tlet x = vertices[ii];\n\t\t\t\tlet y = vertices[ii + 1];\n\t\t\t\tminX = Math.min(minX, x);\n\t\t\t\tminY = Math.min(minY, y);\n\t\t\t\tmaxX = Math.max(maxX, x);\n\t\t\t\tmaxY = Math.max(maxY, y);\n\t\t\t}\n\t\t}\n\t\tthis.minX = minX;\n\t\tthis.minY = minY;\n\t\tthis.maxX = maxX;\n\t\tthis.maxY = maxY;\n\t}\n\n\t/** Returns true if the axis aligned bounding box contains the point. */\n\taabbContainsPoint(x: number, y: number) {\n\t\treturn x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY;\n\t}\n\n\t/** Returns true if the axis aligned bounding box intersects the line segment. */\n\taabbIntersectsSegment(x1: number, y1: number, x2: number, y2: number) {\n\t\tlet minX = this.minX;\n\t\tlet minY = this.minY;\n\t\tlet maxX = this.maxX;\n\t\tlet maxY = this.maxY;\n\t\tif ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY))\n\t\t\treturn false;\n\t\tlet m = (y2 - y1) / (x2 - x1);\n\t\tlet y = m * (minX - x1) + y1;\n\t\tif (y > minY && y < maxY) return true;\n\t\ty = m * (maxX - x1) + y1;\n\t\tif (y > minY && y < maxY) return true;\n\t\tlet x = (minY - y1) / m + x1;\n\t\tif (x > minX && x < maxX) return true;\n\t\tx = (maxY - y1) / m + x1;\n\t\tif (x > minX && x < maxX) return true;\n\t\treturn false;\n\t}\n\n\t/** Returns true if the axis aligned bounding box intersects the axis aligned bounding box of the specified bounds. */\n\taabbIntersectsSkeleton(bounds: SkeletonBounds) {\n\t\treturn this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY;\n\t}\n\n\t/** Returns the first bounding box attachment that contains the point, or null. When doing many checks, it is usually more\n\t * efficient to only call this method if {@link #aabbContainsPoint(float, float)} returns true. */\n\tcontainsPoint(x: number, y: number): BoundingBoxAttachment {\n\t\tlet polygons = this.polygons;\n\t\tfor (let i = 0, n = polygons.length; i < n; i++)\n\t\t\tif (this.containsPointPolygon(polygons[i], x, y)) return this.boundingBoxes[i];\n\t\treturn null;\n\t}\n\n\t/** Returns true if the polygon contains the point. */\n\tcontainsPointPolygon(polygon: NumberArrayLike, x: number, y: number) {\n\t\tlet vertices = polygon;\n\t\tlet nn = polygon.length;\n\n\t\tlet prevIndex = nn - 2;\n\t\tlet inside = false;\n\t\tfor (let ii = 0; ii < nn; ii += 2) {\n\t\t\tlet vertexY = vertices[ii + 1];\n\t\t\tlet prevY = vertices[prevIndex + 1];\n\t\t\tif ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) {\n\t\t\t\tlet vertexX = vertices[ii];\n\t\t\t\tif (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) inside = !inside;\n\t\t\t}\n\t\t\tprevIndex = ii;\n\t\t}\n\t\treturn inside;\n\t}\n\n\t/** Returns the first bounding box attachment that contains any part of the line segment, or null. When doing many checks, it\n\t * is usually more efficient to only call this method if {@link #aabbIntersectsSegment()} returns\n\t * true. */\n\tintersectsSegment(x1: number, y1: number, x2: number, y2: number) {\n\t\tlet polygons = this.polygons;\n\t\tfor (let i = 0, n = polygons.length; i < n; i++)\n\t\t\tif (this.intersectsSegmentPolygon(polygons[i], x1, y1, x2, y2)) return this.boundingBoxes[i];\n\t\treturn null;\n\t}\n\n\t/** Returns true if the polygon contains any part of the line segment. */\n\tintersectsSegmentPolygon(polygon: NumberArrayLike, x1: number, y1: number, x2: number, y2: number) {\n\t\tlet vertices = polygon;\n\t\tlet nn = polygon.length;\n\n\t\tlet width12 = x1 - x2, height12 = y1 - y2;\n\t\tlet det1 = x1 * y2 - y1 * x2;\n\t\tlet x3 = vertices[nn - 2], y3 = vertices[nn - 1];\n\t\tfor (let ii = 0; ii < nn; ii += 2) {\n\t\t\tlet x4 = vertices[ii], y4 = vertices[ii + 1];\n\t\t\tlet det2 = x3 * y4 - y3 * x4;\n\t\t\tlet width34 = x3 - x4, height34 = y3 - y4;\n\t\t\tlet det3 = width12 * height34 - height12 * width34;\n\t\t\tlet x = (det1 * width34 - width12 * det2) / det3;\n\t\t\tif (((x >= x3 && x <= x4) || (x >= x4 && x <= x3)) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) {\n\t\t\t\tlet y = (det1 * height34 - height12 * det2) / det3;\n\t\t\t\tif (((y >= y3 && y <= y4) || (y >= y4 && y <= y3)) && ((y >= y1 && y <= y2) || (y >= y2 && y <= y1))) return true;\n\t\t\t}\n\t\t\tx3 = x4;\n\t\t\ty3 = y4;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/** Returns the polygon for the specified bounding box, or null. */\n\tgetPolygon(boundingBox: BoundingBoxAttachment) {\n\t\tif (!boundingBox) throw new Error(\"boundingBox cannot be null.\");\n\t\tlet index = this.boundingBoxes.indexOf(boundingBox);\n\t\treturn index == -1 ? null : this.polygons[index];\n\t}\n\n\t/** The width of the axis aligned bounding box. */\n\tgetWidth() {\n\t\treturn this.maxX - this.minX;\n\t}\n\n\t/** The height of the axis aligned bounding box. */\n\tgetHeight() {\n\t\treturn this.maxY - this.minY;\n\t}\n}", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { NumberArrayLike, Pool } from \"./Utils\";\n\nexport class Triangulator {\n\tprivate convexPolygons = new Array>();\n\tprivate convexPolygonsIndices = new Array>();\n\n\tprivate indicesArray = new Array();\n\tprivate isConcaveArray = new Array();\n\tprivate triangles = new Array();\n\n\tprivate polygonPool = new Pool>(() => {\n\t\treturn new Array();\n\t});\n\n\tprivate polygonIndicesPool = new Pool>(() => {\n\t\treturn new Array();\n\t});\n\n\tpublic triangulate(verticesArray: NumberArrayLike): Array {\n\t\tlet vertices = verticesArray;\n\t\tlet vertexCount = verticesArray.length >> 1;\n\n\t\tlet indices = this.indicesArray;\n\t\tindices.length = 0;\n\t\tfor (let i = 0; i < vertexCount; i++)\n\t\t\tindices[i] = i;\n\n\t\tlet isConcave = this.isConcaveArray;\n\t\tisConcave.length = 0;\n\t\tfor (let i = 0, n = vertexCount; i < n; ++i)\n\t\t\tisConcave[i] = Triangulator.isConcave(i, vertexCount, vertices, indices);\n\n\t\tlet triangles = this.triangles;\n\t\ttriangles.length = 0;\n\n\t\twhile (vertexCount > 3) {\n\t\t\t// Find ear tip.\n\t\t\tlet previous = vertexCount - 1, i = 0, next = 1;\n\t\t\twhile (true) {\n\t\t\t\touter:\n\t\t\t\tif (!isConcave[i]) {\n\t\t\t\t\tlet p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1;\n\t\t\t\t\tlet p1x = vertices[p1], p1y = vertices[p1 + 1];\n\t\t\t\t\tlet p2x = vertices[p2], p2y = vertices[p2 + 1];\n\t\t\t\t\tlet p3x = vertices[p3], p3y = vertices[p3 + 1];\n\t\t\t\t\tfor (let ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) {\n\t\t\t\t\t\tif (!isConcave[ii]) continue;\n\t\t\t\t\t\tlet v = indices[ii] << 1;\n\t\t\t\t\t\tlet vx = vertices[v], vy = vertices[v + 1];\n\t\t\t\t\t\tif (Triangulator.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) {\n\t\t\t\t\t\t\tif (Triangulator.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) {\n\t\t\t\t\t\t\t\tif (Triangulator.positiveArea(p2x, p2y, p3x, p3y, vx, vy)) break outer;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (next == 0) {\n\t\t\t\t\tdo {\n\t\t\t\t\t\tif (!isConcave[i]) break;\n\t\t\t\t\t\ti--;\n\t\t\t\t\t} while (i > 0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tprevious = i;\n\t\t\t\ti = next;\n\t\t\t\tnext = (next + 1) % vertexCount;\n\t\t\t}\n\n\t\t\t// Cut ear tip.\n\t\t\ttriangles.push(indices[(vertexCount + i - 1) % vertexCount]);\n\t\t\ttriangles.push(indices[i]);\n\t\t\ttriangles.push(indices[(i + 1) % vertexCount]);\n\t\t\tindices.splice(i, 1);\n\t\t\tisConcave.splice(i, 1);\n\t\t\tvertexCount--;\n\n\t\t\tlet previousIndex = (vertexCount + i - 1) % vertexCount;\n\t\t\tlet nextIndex = i == vertexCount ? 0 : i;\n\t\t\tisConcave[previousIndex] = Triangulator.isConcave(previousIndex, vertexCount, vertices, indices);\n\t\t\tisConcave[nextIndex] = Triangulator.isConcave(nextIndex, vertexCount, vertices, indices);\n\t\t}\n\n\t\tif (vertexCount == 3) {\n\t\t\ttriangles.push(indices[2]);\n\t\t\ttriangles.push(indices[0]);\n\t\t\ttriangles.push(indices[1]);\n\t\t}\n\n\t\treturn triangles;\n\t}\n\n\tdecompose(verticesArray: Array, triangles: Array): Array> {\n\t\tlet vertices = verticesArray;\n\t\tlet convexPolygons = this.convexPolygons;\n\t\tthis.polygonPool.freeAll(convexPolygons);\n\t\tconvexPolygons.length = 0;\n\n\t\tlet convexPolygonsIndices = this.convexPolygonsIndices;\n\t\tthis.polygonIndicesPool.freeAll(convexPolygonsIndices);\n\t\tconvexPolygonsIndices.length = 0;\n\n\t\tlet polygonIndices = this.polygonIndicesPool.obtain();\n\t\tpolygonIndices.length = 0;\n\n\t\tlet polygon = this.polygonPool.obtain();\n\t\tpolygon.length = 0;\n\n\t\t// Merge subsequent triangles if they form a triangle fan.\n\t\tlet fanBaseIndex = -1, lastWinding = 0;\n\t\tfor (let i = 0, n = triangles.length; i < n; i += 3) {\n\t\t\tlet t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1;\n\t\t\tlet x1 = vertices[t1], y1 = vertices[t1 + 1];\n\t\t\tlet x2 = vertices[t2], y2 = vertices[t2 + 1];\n\t\t\tlet x3 = vertices[t3], y3 = vertices[t3 + 1];\n\n\t\t\t// If the base of the last triangle is the same as this triangle, check if they form a convex polygon (triangle fan).\n\t\t\tlet merged = false;\n\t\t\tif (fanBaseIndex == t1) {\n\t\t\t\tlet o = polygon.length - 4;\n\t\t\t\tlet winding1 = Triangulator.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3);\n\t\t\t\tlet winding2 = Triangulator.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]);\n\t\t\t\tif (winding1 == lastWinding && winding2 == lastWinding) {\n\t\t\t\t\tpolygon.push(x3);\n\t\t\t\t\tpolygon.push(y3);\n\t\t\t\t\tpolygonIndices.push(t3);\n\t\t\t\t\tmerged = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Otherwise make this triangle the new base.\n\t\t\tif (!merged) {\n\t\t\t\tif (polygon.length > 0) {\n\t\t\t\t\tconvexPolygons.push(polygon);\n\t\t\t\t\tconvexPolygonsIndices.push(polygonIndices);\n\t\t\t\t} else {\n\t\t\t\t\tthis.polygonPool.free(polygon)\n\t\t\t\t\tthis.polygonIndicesPool.free(polygonIndices);\n\t\t\t\t}\n\t\t\t\tpolygon = this.polygonPool.obtain();\n\t\t\t\tpolygon.length = 0;\n\t\t\t\tpolygon.push(x1);\n\t\t\t\tpolygon.push(y1);\n\t\t\t\tpolygon.push(x2);\n\t\t\t\tpolygon.push(y2);\n\t\t\t\tpolygon.push(x3);\n\t\t\t\tpolygon.push(y3);\n\t\t\t\tpolygonIndices = this.polygonIndicesPool.obtain();\n\t\t\t\tpolygonIndices.length = 0;\n\t\t\t\tpolygonIndices.push(t1);\n\t\t\t\tpolygonIndices.push(t2);\n\t\t\t\tpolygonIndices.push(t3);\n\t\t\t\tlastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3);\n\t\t\t\tfanBaseIndex = t1;\n\t\t\t}\n\t\t}\n\n\t\tif (polygon.length > 0) {\n\t\t\tconvexPolygons.push(polygon);\n\t\t\tconvexPolygonsIndices.push(polygonIndices);\n\t\t}\n\n\t\t// Go through the list of polygons and try to merge the remaining triangles with the found triangle fans.\n\t\tfor (let i = 0, n = convexPolygons.length; i < n; i++) {\n\t\t\tpolygonIndices = convexPolygonsIndices[i];\n\t\t\tif (polygonIndices.length == 0) continue;\n\t\t\tlet firstIndex = polygonIndices[0];\n\t\t\tlet lastIndex = polygonIndices[polygonIndices.length - 1];\n\n\t\t\tpolygon = convexPolygons[i];\n\t\t\tlet o = polygon.length - 4;\n\t\t\tlet prevPrevX = polygon[o], prevPrevY = polygon[o + 1];\n\t\t\tlet prevX = polygon[o + 2], prevY = polygon[o + 3];\n\t\t\tlet firstX = polygon[0], firstY = polygon[1];\n\t\t\tlet secondX = polygon[2], secondY = polygon[3];\n\t\t\tlet winding = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY);\n\n\t\t\tfor (let ii = 0; ii < n; ii++) {\n\t\t\t\tif (ii == i) continue;\n\t\t\t\tlet otherIndices = convexPolygonsIndices[ii];\n\t\t\t\tif (otherIndices.length != 3) continue;\n\t\t\t\tlet otherFirstIndex = otherIndices[0];\n\t\t\t\tlet otherSecondIndex = otherIndices[1];\n\t\t\t\tlet otherLastIndex = otherIndices[2];\n\n\t\t\t\tlet otherPoly = convexPolygons[ii];\n\t\t\t\tlet x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1];\n\n\t\t\t\tif (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex) continue;\n\t\t\t\tlet winding1 = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3);\n\t\t\t\tlet winding2 = Triangulator.winding(x3, y3, firstX, firstY, secondX, secondY);\n\t\t\t\tif (winding1 == winding && winding2 == winding) {\n\t\t\t\t\totherPoly.length = 0;\n\t\t\t\t\totherIndices.length = 0;\n\t\t\t\t\tpolygon.push(x3);\n\t\t\t\t\tpolygon.push(y3);\n\t\t\t\t\tpolygonIndices.push(otherLastIndex);\n\t\t\t\t\tprevPrevX = prevX;\n\t\t\t\t\tprevPrevY = prevY;\n\t\t\t\t\tprevX = x3;\n\t\t\t\t\tprevY = y3;\n\t\t\t\t\tii = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove empty polygons that resulted from the merge step above.\n\t\tfor (let i = convexPolygons.length - 1; i >= 0; i--) {\n\t\t\tpolygon = convexPolygons[i];\n\t\t\tif (polygon.length == 0) {\n\t\t\t\tconvexPolygons.splice(i, 1);\n\t\t\t\tthis.polygonPool.free(polygon);\n\t\t\t\tpolygonIndices = convexPolygonsIndices[i]\n\t\t\t\tconvexPolygonsIndices.splice(i, 1)\n\t\t\t\tthis.polygonIndicesPool.free(polygonIndices);\n\t\t\t}\n\t\t}\n\n\t\treturn convexPolygons;\n\t}\n\n\tprivate static isConcave(index: number, vertexCount: number, vertices: NumberArrayLike, indices: NumberArrayLike): boolean {\n\t\tlet previous = indices[(vertexCount + index - 1) % vertexCount] << 1;\n\t\tlet current = indices[index] << 1;\n\t\tlet next = indices[(index + 1) % vertexCount] << 1;\n\t\treturn !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next],\n\t\t\tvertices[next + 1]);\n\t}\n\n\tprivate static positiveArea(p1x: number, p1y: number, p2x: number, p2y: number, p3x: number, p3y: number): boolean {\n\t\treturn p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0;\n\t}\n\n\tprivate static winding(p1x: number, p1y: number, p2x: number, p2y: number, p3x: number, p3y: number): number {\n\t\tlet px = p2x - p1x, py = p2y - p1y;\n\t\treturn p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1;\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { ClippingAttachment } from \"./attachments/ClippingAttachment\";\nimport { Slot } from \"./Slot\";\nimport { Triangulator } from \"./Triangulator\";\nimport { Utils, Color, NumberArrayLike } from \"./Utils\";\n\nexport class SkeletonClipping {\n\tprivate triangulator = new Triangulator();\n\tprivate clippingPolygon = new Array();\n\tprivate clipOutput = new Array();\n\tclippedVertices = new Array();\n\tclippedTriangles = new Array();\n\tprivate scratch = new Array();\n\n\tprivate clipAttachment: ClippingAttachment;\n\tprivate clippingPolygons: Array>;\n\n\tclipStart(slot: Slot, clip: ClippingAttachment): number {\n\t\tif (this.clipAttachment) return 0;\n\t\tthis.clipAttachment = clip;\n\n\t\tlet n = clip.worldVerticesLength;\n\t\tlet vertices = Utils.setArraySize(this.clippingPolygon, n);\n\t\tclip.computeWorldVertices(slot, 0, n, vertices, 0, 2);\n\t\tlet clippingPolygon = this.clippingPolygon;\n\t\tSkeletonClipping.makeClockwise(clippingPolygon);\n\t\tlet clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon));\n\t\tfor (let i = 0, n = clippingPolygons.length; i < n; i++) {\n\t\t\tlet polygon = clippingPolygons[i];\n\t\t\tSkeletonClipping.makeClockwise(polygon);\n\t\t\tpolygon.push(polygon[0]);\n\t\t\tpolygon.push(polygon[1]);\n\t\t}\n\n\t\treturn clippingPolygons.length;\n\t}\n\n\tclipEndWithSlot(slot: Slot) {\n\t\tif (this.clipAttachment && this.clipAttachment.endSlot == slot.data) this.clipEnd();\n\t}\n\n\tclipEnd() {\n\t\tif (!this.clipAttachment) return;\n\t\tthis.clipAttachment = null;\n\t\tthis.clippingPolygons = null;\n\t\tthis.clippedVertices.length = 0;\n\t\tthis.clippedTriangles.length = 0;\n\t\tthis.clippingPolygon.length = 0;\n\t}\n\n\tisClipping(): boolean {\n\t\treturn this.clipAttachment != null;\n\t}\n\n\tclipTriangles(vertices: NumberArrayLike, verticesLength: number, triangles: NumberArrayLike, trianglesLength: number, uvs: NumberArrayLike,\n\t\tlight: Color, dark: Color, twoColor: boolean) {\n\n\t\tlet clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;\n\t\tlet clippedTriangles = this.clippedTriangles;\n\t\tlet polygons = this.clippingPolygons;\n\t\tlet polygonsCount = this.clippingPolygons.length;\n\t\tlet vertexSize = twoColor ? 12 : 8;\n\n\t\tlet index = 0;\n\t\tclippedVertices.length = 0;\n\t\tclippedTriangles.length = 0;\n\t\touter:\n\t\tfor (let i = 0; i < trianglesLength; i += 3) {\n\t\t\tlet vertexOffset = triangles[i] << 1;\n\t\t\tlet x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];\n\t\t\tlet u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];\n\n\t\t\tvertexOffset = triangles[i + 1] << 1;\n\t\t\tlet x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];\n\t\t\tlet u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];\n\n\t\t\tvertexOffset = triangles[i + 2] << 1;\n\t\t\tlet x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];\n\t\t\tlet u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];\n\n\t\t\tfor (let p = 0; p < polygonsCount; p++) {\n\t\t\t\tlet s = clippedVertices.length;\n\t\t\t\tif (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {\n\t\t\t\t\tlet clipOutputLength = clipOutput.length;\n\t\t\t\t\tif (clipOutputLength == 0) continue;\n\t\t\t\t\tlet d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;\n\t\t\t\t\tlet d = 1 / (d0 * d2 + d1 * (y1 - y3));\n\n\t\t\t\t\tlet clipOutputCount = clipOutputLength >> 1;\n\t\t\t\t\tlet clipOutputItems = this.clipOutput;\n\t\t\t\t\tlet clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);\n\t\t\t\t\tfor (let ii = 0; ii < clipOutputLength; ii += 2) {\n\t\t\t\t\t\tlet x = clipOutputItems[ii], y = clipOutputItems[ii + 1];\n\t\t\t\t\t\tclippedVerticesItems[s] = x;\n\t\t\t\t\t\tclippedVerticesItems[s + 1] = y;\n\t\t\t\t\t\tclippedVerticesItems[s + 2] = light.r;\n\t\t\t\t\t\tclippedVerticesItems[s + 3] = light.g;\n\t\t\t\t\t\tclippedVerticesItems[s + 4] = light.b;\n\t\t\t\t\t\tclippedVerticesItems[s + 5] = light.a;\n\t\t\t\t\t\tlet c0 = x - x3, c1 = y - y3;\n\t\t\t\t\t\tlet a = (d0 * c0 + d1 * c1) * d;\n\t\t\t\t\t\tlet b = (d4 * c0 + d2 * c1) * d;\n\t\t\t\t\t\tlet c = 1 - a - b;\n\t\t\t\t\t\tclippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;\n\t\t\t\t\t\tclippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;\n\t\t\t\t\t\tif (twoColor) {\n\t\t\t\t\t\t\tclippedVerticesItems[s + 8] = dark.r;\n\t\t\t\t\t\t\tclippedVerticesItems[s + 9] = dark.g;\n\t\t\t\t\t\t\tclippedVerticesItems[s + 10] = dark.b;\n\t\t\t\t\t\t\tclippedVerticesItems[s + 11] = dark.a;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ts += vertexSize;\n\t\t\t\t\t}\n\n\t\t\t\t\ts = clippedTriangles.length;\n\t\t\t\t\tlet clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));\n\t\t\t\t\tclipOutputCount--;\n\t\t\t\t\tfor (let ii = 1; ii < clipOutputCount; ii++) {\n\t\t\t\t\t\tclippedTrianglesItems[s] = index;\n\t\t\t\t\t\tclippedTrianglesItems[s + 1] = (index + ii);\n\t\t\t\t\t\tclippedTrianglesItems[s + 2] = (index + ii + 1);\n\t\t\t\t\t\ts += 3;\n\t\t\t\t\t}\n\t\t\t\t\tindex += clipOutputCount + 1;\n\n\t\t\t\t} else {\n\t\t\t\t\tlet clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize);\n\t\t\t\t\tclippedVerticesItems[s] = x1;\n\t\t\t\t\tclippedVerticesItems[s + 1] = y1;\n\t\t\t\t\tclippedVerticesItems[s + 2] = light.r;\n\t\t\t\t\tclippedVerticesItems[s + 3] = light.g;\n\t\t\t\t\tclippedVerticesItems[s + 4] = light.b;\n\t\t\t\t\tclippedVerticesItems[s + 5] = light.a;\n\t\t\t\t\tif (!twoColor) {\n\t\t\t\t\t\tclippedVerticesItems[s + 6] = u1;\n\t\t\t\t\t\tclippedVerticesItems[s + 7] = v1;\n\n\t\t\t\t\t\tclippedVerticesItems[s + 8] = x2;\n\t\t\t\t\t\tclippedVerticesItems[s + 9] = y2;\n\t\t\t\t\t\tclippedVerticesItems[s + 10] = light.r;\n\t\t\t\t\t\tclippedVerticesItems[s + 11] = light.g;\n\t\t\t\t\t\tclippedVerticesItems[s + 12] = light.b;\n\t\t\t\t\t\tclippedVerticesItems[s + 13] = light.a;\n\t\t\t\t\t\tclippedVerticesItems[s + 14] = u2;\n\t\t\t\t\t\tclippedVerticesItems[s + 15] = v2;\n\n\t\t\t\t\t\tclippedVerticesItems[s + 16] = x3;\n\t\t\t\t\t\tclippedVerticesItems[s + 17] = y3;\n\t\t\t\t\t\tclippedVerticesItems[s + 18] = light.r;\n\t\t\t\t\t\tclippedVerticesItems[s + 19] = light.g;\n\t\t\t\t\t\tclippedVerticesItems[s + 20] = light.b;\n\t\t\t\t\t\tclippedVerticesItems[s + 21] = light.a;\n\t\t\t\t\t\tclippedVerticesItems[s + 22] = u3;\n\t\t\t\t\t\tclippedVerticesItems[s + 23] = v3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclippedVerticesItems[s + 6] = u1;\n\t\t\t\t\t\tclippedVerticesItems[s + 7] = v1;\n\t\t\t\t\t\tclippedVerticesItems[s + 8] = dark.r;\n\t\t\t\t\t\tclippedVerticesItems[s + 9] = dark.g;\n\t\t\t\t\t\tclippedVerticesItems[s + 10] = dark.b;\n\t\t\t\t\t\tclippedVerticesItems[s + 11] = dark.a;\n\n\t\t\t\t\t\tclippedVerticesItems[s + 12] = x2;\n\t\t\t\t\t\tclippedVerticesItems[s + 13] = y2;\n\t\t\t\t\t\tclippedVerticesItems[s + 14] = light.r;\n\t\t\t\t\t\tclippedVerticesItems[s + 15] = light.g;\n\t\t\t\t\t\tclippedVerticesItems[s + 16] = light.b;\n\t\t\t\t\t\tclippedVerticesItems[s + 17] = light.a;\n\t\t\t\t\t\tclippedVerticesItems[s + 18] = u2;\n\t\t\t\t\t\tclippedVerticesItems[s + 19] = v2;\n\t\t\t\t\t\tclippedVerticesItems[s + 20] = dark.r;\n\t\t\t\t\t\tclippedVerticesItems[s + 21] = dark.g;\n\t\t\t\t\t\tclippedVerticesItems[s + 22] = dark.b;\n\t\t\t\t\t\tclippedVerticesItems[s + 23] = dark.a;\n\n\t\t\t\t\t\tclippedVerticesItems[s + 24] = x3;\n\t\t\t\t\t\tclippedVerticesItems[s + 25] = y3;\n\t\t\t\t\t\tclippedVerticesItems[s + 26] = light.r;\n\t\t\t\t\t\tclippedVerticesItems[s + 27] = light.g;\n\t\t\t\t\t\tclippedVerticesItems[s + 28] = light.b;\n\t\t\t\t\t\tclippedVerticesItems[s + 29] = light.a;\n\t\t\t\t\t\tclippedVerticesItems[s + 30] = u3;\n\t\t\t\t\t\tclippedVerticesItems[s + 31] = v3;\n\t\t\t\t\t\tclippedVerticesItems[s + 32] = dark.r;\n\t\t\t\t\t\tclippedVerticesItems[s + 33] = dark.g;\n\t\t\t\t\t\tclippedVerticesItems[s + 34] = dark.b;\n\t\t\t\t\t\tclippedVerticesItems[s + 35] = dark.a;\n\t\t\t\t\t}\n\n\t\t\t\t\ts = clippedTriangles.length;\n\t\t\t\t\tlet clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3);\n\t\t\t\t\tclippedTrianglesItems[s] = index;\n\t\t\t\t\tclippedTrianglesItems[s + 1] = (index + 1);\n\t\t\t\t\tclippedTrianglesItems[s + 2] = (index + 2);\n\t\t\t\t\tindex += 3;\n\t\t\t\t\tcontinue outer;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping\n\t * area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. */\n\tclip(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, clippingArea: Array, output: Array) {\n\t\tlet originalOutput = output;\n\t\tlet clipped = false;\n\n\t\t// Avoid copy at the end.\n\t\tlet input: Array = null;\n\t\tif (clippingArea.length % 4 >= 2) {\n\t\t\tinput = output;\n\t\t\toutput = this.scratch;\n\t\t} else\n\t\t\tinput = this.scratch;\n\n\t\tinput.length = 0;\n\t\tinput.push(x1);\n\t\tinput.push(y1);\n\t\tinput.push(x2);\n\t\tinput.push(y2);\n\t\tinput.push(x3);\n\t\tinput.push(y3);\n\t\tinput.push(x1);\n\t\tinput.push(y1);\n\t\toutput.length = 0;\n\n\t\tlet clippingVertices = clippingArea;\n\t\tlet clippingVerticesLast = clippingArea.length - 4;\n\t\tfor (let i = 0; ; i += 2) {\n\t\t\tlet edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];\n\t\t\tlet edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3];\n\t\t\tlet deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2;\n\n\t\t\tlet inputVertices = input;\n\t\t\tlet inputVerticesLength = input.length - 2, outputStart = output.length;\n\t\t\tfor (let ii = 0; ii < inputVerticesLength; ii += 2) {\n\t\t\t\tlet inputX = inputVertices[ii], inputY = inputVertices[ii + 1];\n\t\t\t\tlet inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3];\n\t\t\t\tlet side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;\n\t\t\t\tif (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {\n\t\t\t\t\tif (side2) { // v1 inside, v2 inside\n\t\t\t\t\t\toutput.push(inputX2);\n\t\t\t\t\t\toutput.push(inputY2);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// v1 inside, v2 outside\n\t\t\t\t\tlet c0 = inputY2 - inputY, c2 = inputX2 - inputX;\n\t\t\t\t\tlet s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY);\n\t\t\t\t\tif (Math.abs(s) > 0.000001) {\n\t\t\t\t\t\tlet ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s;\n\t\t\t\t\t\toutput.push(edgeX + (edgeX2 - edgeX) * ua);\n\t\t\t\t\t\toutput.push(edgeY + (edgeY2 - edgeY) * ua);\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput.push(edgeX);\n\t\t\t\t\t\toutput.push(edgeY);\n\t\t\t\t\t}\n\t\t\t\t} else if (side2) { // v1 outside, v2 inside\n\t\t\t\t\tlet c0 = inputY2 - inputY, c2 = inputX2 - inputX;\n\t\t\t\t\tlet s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY);\n\t\t\t\t\tif (Math.abs(s) > 0.000001) {\n\t\t\t\t\t\tlet ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s;\n\t\t\t\t\t\toutput.push(edgeX + (edgeX2 - edgeX) * ua);\n\t\t\t\t\t\toutput.push(edgeY + (edgeY2 - edgeY) * ua);\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput.push(edgeX);\n\t\t\t\t\t\toutput.push(edgeY);\n\t\t\t\t\t}\n\t\t\t\t\toutput.push(inputX2);\n\t\t\t\t\toutput.push(inputY2);\n\t\t\t\t}\n\t\t\t\tclipped = true;\n\t\t\t}\n\n\t\t\tif (outputStart == output.length) { // All edges outside.\n\t\t\t\toriginalOutput.length = 0;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\toutput.push(output[0]);\n\t\t\toutput.push(output[1]);\n\n\t\t\tif (i == clippingVerticesLast) break;\n\t\t\tlet temp = output;\n\t\t\toutput = input;\n\t\t\toutput.length = 0;\n\t\t\tinput = temp;\n\t\t}\n\n\t\tif (originalOutput != output) {\n\t\t\toriginalOutput.length = 0;\n\t\t\tfor (let i = 0, n = output.length - 2; i < n; i++)\n\t\t\t\toriginalOutput[i] = output[i];\n\t\t} else\n\t\t\toriginalOutput.length = originalOutput.length - 2;\n\n\t\treturn clipped;\n\t}\n\n\tpublic static makeClockwise(polygon: NumberArrayLike) {\n\t\tlet vertices = polygon;\n\t\tlet verticeslength = polygon.length;\n\n\t\tlet area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;\n\t\tfor (let i = 0, n = verticeslength - 3; i < n; i += 2) {\n\t\t\tp1x = vertices[i];\n\t\t\tp1y = vertices[i + 1];\n\t\t\tp2x = vertices[i + 2];\n\t\t\tp2y = vertices[i + 3];\n\t\t\tarea += p1x * p2y - p2x * p1y;\n\t\t}\n\t\tif (area < 0) return;\n\n\t\tfor (let i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {\n\t\t\tlet x = vertices[i], y = vertices[i + 1];\n\t\t\tlet other = lastX - i;\n\t\t\tvertices[i] = vertices[other];\n\t\t\tvertices[i + 1] = vertices[other + 1];\n\t\t\tvertices[other] = x;\n\t\t\tvertices[other + 1] = y;\n\t\t}\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Animation, Timeline, AttachmentTimeline, RGBATimeline, RGBTimeline, AlphaTimeline, RGBA2Timeline, RGB2Timeline, RotateTimeline, TranslateTimeline, TranslateXTimeline, TranslateYTimeline, ScaleTimeline, ScaleXTimeline, ScaleYTimeline, ShearTimeline, ShearXTimeline, ShearYTimeline, IkConstraintTimeline, TransformConstraintTimeline, PathConstraintPositionTimeline, PathConstraintSpacingTimeline, PathConstraintMixTimeline, DeformTimeline, DrawOrderTimeline, EventTimeline, CurveTimeline1, CurveTimeline2, CurveTimeline } from \"./Animation\";\nimport { VertexAttachment, Attachment } from \"./attachments/Attachment\";\nimport { AttachmentLoader } from \"./attachments/AttachmentLoader\";\nimport { MeshAttachment } from \"./attachments/MeshAttachment\";\nimport { BoneData, TransformMode } from \"./BoneData\";\nimport { EventData } from \"./EventData\";\nimport { Event } from \"./Event\";\nimport { IkConstraintData } from \"./IkConstraintData\";\nimport { PathConstraintData, PositionMode, SpacingMode, RotateMode } from \"./PathConstraintData\";\nimport { SkeletonData } from \"./SkeletonData\";\nimport { Skin } from \"./Skin\";\nimport { SlotData, BlendMode } from \"./SlotData\";\nimport { TransformConstraintData } from \"./TransformConstraintData\";\nimport { Utils, Color, NumberArrayLike } from \"./Utils\";\n\n/** Loads skeleton data in the Spine JSON format.\n *\n * See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and\n * [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine\n * Runtimes Guide. */\nexport class SkeletonJson {\n\tattachmentLoader: AttachmentLoader;\n\n\t/** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at\n\t * runtime than were used in Spine.\n\t *\n\t * See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */\n\tscale = 1;\n\tprivate linkedMeshes = new Array();\n\n\tconstructor(attachmentLoader: AttachmentLoader) {\n\t\tthis.attachmentLoader = attachmentLoader;\n\t}\n\n\treadSkeletonData(json: string | any): SkeletonData {\n\t\tlet scale = this.scale;\n\t\tlet skeletonData = new SkeletonData();\n\t\tlet root = typeof (json) === \"string\" ? JSON.parse(json) : json;\n\n\t\t// Skeleton\n\t\tlet skeletonMap = root.skeleton;\n\t\tif (skeletonMap) {\n\t\t\tskeletonData.hash = skeletonMap.hash;\n\t\t\tskeletonData.version = skeletonMap.spine;\n\t\t\tskeletonData.x = skeletonMap.x;\n\t\t\tskeletonData.y = skeletonMap.y;\n\t\t\tskeletonData.width = skeletonMap.width;\n\t\t\tskeletonData.height = skeletonMap.height;\n\t\t\tskeletonData.fps = skeletonMap.fps;\n\t\t\tskeletonData.imagesPath = skeletonMap.images;\n\t\t}\n\n\t\t// Bones\n\t\tif (root.bones) {\n\t\t\tfor (let i = 0; i < root.bones.length; i++) {\n\t\t\t\tlet boneMap = root.bones[i];\n\n\t\t\t\tlet parent: BoneData = null;\n\t\t\t\tlet parentName: string = getValue(boneMap, \"parent\", null);\n\t\t\t\tif (parentName) parent = skeletonData.findBone(parentName);\n\t\t\t\tlet data = new BoneData(skeletonData.bones.length, boneMap.name, parent);\n\t\t\t\tdata.length = getValue(boneMap, \"length\", 0) * scale;\n\t\t\t\tdata.x = getValue(boneMap, \"x\", 0) * scale;\n\t\t\t\tdata.y = getValue(boneMap, \"y\", 0) * scale;\n\t\t\t\tdata.rotation = getValue(boneMap, \"rotation\", 0);\n\t\t\t\tdata.scaleX = getValue(boneMap, \"scaleX\", 1);\n\t\t\t\tdata.scaleY = getValue(boneMap, \"scaleY\", 1);\n\t\t\t\tdata.shearX = getValue(boneMap, \"shearX\", 0);\n\t\t\t\tdata.shearY = getValue(boneMap, \"shearY\", 0);\n\t\t\t\tdata.transformMode = Utils.enumValue(TransformMode, getValue(boneMap, \"transform\", \"Normal\"));\n\t\t\t\tdata.skinRequired = getValue(boneMap, \"skin\", false);\n\n\t\t\t\tlet color = getValue(boneMap, \"color\", null);\n\t\t\t\tif (color) data.color.setFromString(color);\n\n\t\t\t\tskeletonData.bones.push(data);\n\t\t\t}\n\t\t}\n\n\t\t// Slots.\n\t\tif (root.slots) {\n\t\t\tfor (let i = 0; i < root.slots.length; i++) {\n\t\t\t\tlet slotMap = root.slots[i];\n\t\t\t\tlet boneData = skeletonData.findBone(slotMap.bone);\n\t\t\t\tlet data = new SlotData(skeletonData.slots.length, slotMap.name, boneData);\n\n\t\t\t\tlet color: string = getValue(slotMap, \"color\", null);\n\t\t\t\tif (color) data.color.setFromString(color);\n\n\t\t\t\tlet dark: string = getValue(slotMap, \"dark\", null);\n\t\t\t\tif (dark) data.darkColor = Color.fromString(dark);\n\n\t\t\t\tdata.attachmentName = getValue(slotMap, \"attachment\", null);\n\t\t\t\tdata.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, \"blend\", \"normal\"));\n\t\t\t\tskeletonData.slots.push(data);\n\t\t\t}\n\t\t}\n\n\t\t// IK constraints\n\t\tif (root.ik) {\n\t\t\tfor (let i = 0; i < root.ik.length; i++) {\n\t\t\t\tlet constraintMap = root.ik[i];\n\t\t\t\tlet data = new IkConstraintData(constraintMap.name);\n\t\t\t\tdata.order = getValue(constraintMap, \"order\", 0);\n\t\t\t\tdata.skinRequired = getValue(constraintMap, \"skin\", false);\n\n\t\t\t\tfor (let ii = 0; ii < constraintMap.bones.length; ii++)\n\t\t\t\t\tdata.bones.push(skeletonData.findBone(constraintMap.bones[ii]));\n\n\t\t\t\tdata.target = skeletonData.findBone(constraintMap.target);\n\n\t\t\t\tdata.mix = getValue(constraintMap, \"mix\", 1);\n\t\t\t\tdata.softness = getValue(constraintMap, \"softness\", 0) * scale;\n\t\t\t\tdata.bendDirection = getValue(constraintMap, \"bendPositive\", true) ? 1 : -1;\n\t\t\t\tdata.compress = getValue(constraintMap, \"compress\", false);\n\t\t\t\tdata.stretch = getValue(constraintMap, \"stretch\", false);\n\t\t\t\tdata.uniform = getValue(constraintMap, \"uniform\", false);\n\n\t\t\t\tskeletonData.ikConstraints.push(data);\n\t\t\t}\n\t\t}\n\n\t\t// Transform constraints.\n\t\tif (root.transform) {\n\t\t\tfor (let i = 0; i < root.transform.length; i++) {\n\t\t\t\tlet constraintMap = root.transform[i];\n\t\t\t\tlet data = new TransformConstraintData(constraintMap.name);\n\t\t\t\tdata.order = getValue(constraintMap, \"order\", 0);\n\t\t\t\tdata.skinRequired = getValue(constraintMap, \"skin\", false);\n\n\t\t\t\tfor (let ii = 0; ii < constraintMap.bones.length; ii++)\n\t\t\t\t\tdata.bones.push(skeletonData.findBone(constraintMap.bones[ii]));\n\n\t\t\t\tlet targetName: string = constraintMap.target;\n\t\t\t\tdata.target = skeletonData.findBone(targetName);\n\n\t\t\t\tdata.local = getValue(constraintMap, \"local\", false);\n\t\t\t\tdata.relative = getValue(constraintMap, \"relative\", false);\n\t\t\t\tdata.offsetRotation = getValue(constraintMap, \"rotation\", 0);\n\t\t\t\tdata.offsetX = getValue(constraintMap, \"x\", 0) * scale;\n\t\t\t\tdata.offsetY = getValue(constraintMap, \"y\", 0) * scale;\n\t\t\t\tdata.offsetScaleX = getValue(constraintMap, \"scaleX\", 0);\n\t\t\t\tdata.offsetScaleY = getValue(constraintMap, \"scaleY\", 0);\n\t\t\t\tdata.offsetShearY = getValue(constraintMap, \"shearY\", 0);\n\n\t\t\t\tdata.mixRotate = getValue(constraintMap, \"mixRotate\", 1);\n\t\t\t\tdata.mixX = getValue(constraintMap, \"mixX\", 1);\n\t\t\t\tdata.mixY = getValue(constraintMap, \"mixY\", data.mixX);\n\t\t\t\tdata.mixScaleX = getValue(constraintMap, \"mixScaleX\", 1);\n\t\t\t\tdata.mixScaleY = getValue(constraintMap, \"mixScaleY\", data.mixScaleX);\n\t\t\t\tdata.mixShearY = getValue(constraintMap, \"mixShearY\", 1);\n\n\t\t\t\tskeletonData.transformConstraints.push(data);\n\t\t\t}\n\t\t}\n\n\t\t// Path constraints.\n\t\tif (root.path) {\n\t\t\tfor (let i = 0; i < root.path.length; i++) {\n\t\t\t\tlet constraintMap = root.path[i];\n\t\t\t\tlet data = new PathConstraintData(constraintMap.name);\n\t\t\t\tdata.order = getValue(constraintMap, \"order\", 0);\n\t\t\t\tdata.skinRequired = getValue(constraintMap, \"skin\", false);\n\n\t\t\t\tfor (let ii = 0; ii < constraintMap.bones.length; ii++)\n\t\t\t\t\tdata.bones.push(skeletonData.findBone(constraintMap.bones[ii]));\n\n\t\t\t\tlet targetName: string = constraintMap.target;\n\t\t\t\tdata.target = skeletonData.findSlot(targetName);\n\n\t\t\t\tdata.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, \"positionMode\", \"Percent\"));\n\t\t\t\tdata.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, \"spacingMode\", \"Length\"));\n\t\t\t\tdata.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, \"rotateMode\", \"Tangent\"));\n\t\t\t\tdata.offsetRotation = getValue(constraintMap, \"rotation\", 0);\n\t\t\t\tdata.position = getValue(constraintMap, \"position\", 0);\n\t\t\t\tif (data.positionMode == PositionMode.Fixed) data.position *= scale;\n\t\t\t\tdata.spacing = getValue(constraintMap, \"spacing\", 0);\n\t\t\t\tif (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale;\n\t\t\t\tdata.mixRotate = getValue(constraintMap, \"mixRotate\", 1);\n\t\t\t\tdata.mixX = getValue(constraintMap, \"mixX\", 1);\n\t\t\t\tdata.mixY = getValue(constraintMap, \"mixY\", data.mixX);\n\n\t\t\t\tskeletonData.pathConstraints.push(data);\n\t\t\t}\n\t\t}\n\n\t\t// Skins.\n\t\tif (root.skins) {\n\t\t\tfor (let i = 0; i < root.skins.length; i++) {\n\t\t\t\tlet skinMap = root.skins[i]\n\t\t\t\tlet skin = new Skin(skinMap.name);\n\n\t\t\t\tif (skinMap.bones) {\n\t\t\t\t\tfor (let ii = 0; ii < skinMap.bones.length; ii++)\n\t\t\t\t\t\tskin.bones.push(skeletonData.findBone(skinMap.bones[ii]));\n\t\t\t\t}\n\n\t\t\t\tif (skinMap.ik) {\n\t\t\t\t\tfor (let ii = 0; ii < skinMap.ik.length; ii++)\n\t\t\t\t\t\tskin.constraints.push(skeletonData.findIkConstraint(skinMap.ik[ii]));\n\t\t\t\t}\n\n\t\t\t\tif (skinMap.transform) {\n\t\t\t\t\tfor (let ii = 0; ii < skinMap.transform.length; ii++)\n\t\t\t\t\t\tskin.constraints.push(skeletonData.findTransformConstraint(skinMap.transform[ii]));\n\t\t\t\t}\n\n\t\t\t\tif (skinMap.path) {\n\t\t\t\t\tfor (let ii = 0; ii < skinMap.path.length; ii++)\n\t\t\t\t\t\tskin.constraints.push(skeletonData.findPathConstraint(skinMap.path[ii]));\n\t\t\t\t}\n\n\t\t\t\tfor (let slotName in skinMap.attachments) {\n\t\t\t\t\tlet slot = skeletonData.findSlot(slotName);\n\t\t\t\t\tlet slotMap = skinMap.attachments[slotName];\n\t\t\t\t\tfor (let entryName in slotMap) {\n\t\t\t\t\t\tlet attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);\n\t\t\t\t\t\tif (attachment) skin.setAttachment(slot.index, entryName, attachment);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tskeletonData.skins.push(skin);\n\t\t\t\tif (skin.name == \"default\") skeletonData.defaultSkin = skin;\n\t\t\t}\n\t\t}\n\n\t\t// Linked meshes.\n\t\tfor (let i = 0, n = this.linkedMeshes.length; i < n; i++) {\n\t\t\tlet linkedMesh = this.linkedMeshes[i];\n\t\t\tlet skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);\n\t\t\tlet parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);\n\t\t\tlinkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;\n\t\t\tlinkedMesh.mesh.setParentMesh(parent);\n\t\t\tlinkedMesh.mesh.updateUVs();\n\t\t}\n\t\tthis.linkedMeshes.length = 0;\n\n\t\t// Events.\n\t\tif (root.events) {\n\t\t\tfor (let eventName in root.events) {\n\t\t\t\tlet eventMap = root.events[eventName];\n\t\t\t\tlet data = new EventData(eventName);\n\t\t\t\tdata.intValue = getValue(eventMap, \"int\", 0);\n\t\t\t\tdata.floatValue = getValue(eventMap, \"float\", 0);\n\t\t\t\tdata.stringValue = getValue(eventMap, \"string\", \"\");\n\t\t\t\tdata.audioPath = getValue(eventMap, \"audio\", null);\n\t\t\t\tif (data.audioPath) {\n\t\t\t\t\tdata.volume = getValue(eventMap, \"volume\", 1);\n\t\t\t\t\tdata.balance = getValue(eventMap, \"balance\", 0);\n\t\t\t\t}\n\t\t\t\tskeletonData.events.push(data);\n\t\t\t}\n\t\t}\n\n\t\t// Animations.\n\t\tif (root.animations) {\n\t\t\tfor (let animationName in root.animations) {\n\t\t\t\tlet animationMap = root.animations[animationName];\n\t\t\t\tthis.readAnimation(animationMap, animationName, skeletonData);\n\t\t\t}\n\t\t}\n\n\t\treturn skeletonData;\n\t}\n\n\treadAttachment(map: any, skin: Skin, slotIndex: number, name: string, skeletonData: SkeletonData): Attachment {\n\t\tlet scale = this.scale;\n\t\tname = getValue(map, \"name\", name);\n\n\t\tswitch (getValue(map, \"type\", \"region\")) {\n\t\t\tcase \"region\": {\n\t\t\t\tlet path = getValue(map, \"path\", name);\n\t\t\t\tlet region = this.attachmentLoader.newRegionAttachment(skin, name, path);\n\t\t\t\tif (!region) return null;\n\t\t\t\tregion.path = path;\n\t\t\t\tregion.x = getValue(map, \"x\", 0) * scale;\n\t\t\t\tregion.y = getValue(map, \"y\", 0) * scale;\n\t\t\t\tregion.scaleX = getValue(map, \"scaleX\", 1);\n\t\t\t\tregion.scaleY = getValue(map, \"scaleY\", 1);\n\t\t\t\tregion.rotation = getValue(map, \"rotation\", 0);\n\t\t\t\tregion.width = map.width * scale;\n\t\t\t\tregion.height = map.height * scale;\n\n\t\t\t\tlet color: string = getValue(map, \"color\", null);\n\t\t\t\tif (color) region.color.setFromString(color);\n\n\t\t\t\tregion.updateOffset();\n\t\t\t\treturn region;\n\t\t\t}\n\t\t\tcase \"boundingbox\": {\n\t\t\t\tlet box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);\n\t\t\t\tif (!box) return null;\n\t\t\t\tthis.readVertices(map, box, map.vertexCount << 1);\n\t\t\t\tlet color: string = getValue(map, \"color\", null);\n\t\t\t\tif (color) box.color.setFromString(color);\n\t\t\t\treturn box;\n\t\t\t}\n\t\t\tcase \"mesh\":\n\t\t\tcase \"linkedmesh\": {\n\t\t\t\tlet path = getValue(map, \"path\", name);\n\t\t\t\tlet mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);\n\t\t\t\tif (!mesh) return null;\n\t\t\t\tmesh.path = path;\n\n\t\t\t\tlet color = getValue(map, \"color\", null);\n\t\t\t\tif (color) mesh.color.setFromString(color);\n\n\t\t\t\tmesh.width = getValue(map, \"width\", 0) * scale;\n\t\t\t\tmesh.height = getValue(map, \"height\", 0) * scale;\n\n\t\t\t\tlet parent: string = getValue(map, \"parent\", null);\n\t\t\t\tif (parent) {\n\t\t\t\t\tthis.linkedMeshes.push(new LinkedMesh(mesh, getValue(map, \"skin\", null), slotIndex, parent, getValue(map, \"deform\", true)));\n\t\t\t\t\treturn mesh;\n\t\t\t\t}\n\n\t\t\t\tlet uvs: Array = map.uvs;\n\t\t\t\tthis.readVertices(map, mesh, uvs.length);\n\t\t\t\tmesh.triangles = map.triangles;\n\t\t\t\tmesh.regionUVs = uvs;\n\t\t\t\tmesh.updateUVs();\n\n\t\t\t\tmesh.edges = getValue(map, \"edges\", null);\n\t\t\t\tmesh.hullLength = getValue(map, \"hull\", 0) * 2;\n\t\t\t\treturn mesh;\n\t\t\t}\n\t\t\tcase \"path\": {\n\t\t\t\tlet path = this.attachmentLoader.newPathAttachment(skin, name);\n\t\t\t\tif (!path) return null;\n\t\t\t\tpath.closed = getValue(map, \"closed\", false);\n\t\t\t\tpath.constantSpeed = getValue(map, \"constantSpeed\", true);\n\n\t\t\t\tlet vertexCount = map.vertexCount;\n\t\t\t\tthis.readVertices(map, path, vertexCount << 1);\n\n\t\t\t\tlet lengths: Array = Utils.newArray(vertexCount / 3, 0);\n\t\t\t\tfor (let i = 0; i < map.lengths.length; i++)\n\t\t\t\t\tlengths[i] = map.lengths[i] * scale;\n\t\t\t\tpath.lengths = lengths;\n\n\t\t\t\tlet color: string = getValue(map, \"color\", null);\n\t\t\t\tif (color) path.color.setFromString(color);\n\t\t\t\treturn path;\n\t\t\t}\n\t\t\tcase \"point\": {\n\t\t\t\tlet point = this.attachmentLoader.newPointAttachment(skin, name);\n\t\t\t\tif (!point) return null;\n\t\t\t\tpoint.x = getValue(map, \"x\", 0) * scale;\n\t\t\t\tpoint.y = getValue(map, \"y\", 0) * scale;\n\t\t\t\tpoint.rotation = getValue(map, \"rotation\", 0);\n\n\t\t\t\tlet color = getValue(map, \"color\", null);\n\t\t\t\tif (color) point.color.setFromString(color);\n\t\t\t\treturn point;\n\t\t\t}\n\t\t\tcase \"clipping\": {\n\t\t\t\tlet clip = this.attachmentLoader.newClippingAttachment(skin, name);\n\t\t\t\tif (!clip) return null;\n\n\t\t\t\tlet end = getValue(map, \"end\", null);\n\t\t\t\tif (end) clip.endSlot = skeletonData.findSlot(end);\n\n\t\t\t\tlet vertexCount = map.vertexCount;\n\t\t\t\tthis.readVertices(map, clip, vertexCount << 1);\n\n\t\t\t\tlet color: string = getValue(map, \"color\", null);\n\t\t\t\tif (color) clip.color.setFromString(color);\n\t\t\t\treturn clip;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\treadVertices(map: any, attachment: VertexAttachment, verticesLength: number) {\n\t\tlet scale = this.scale;\n\t\tattachment.worldVerticesLength = verticesLength;\n\t\tlet vertices: Array = map.vertices;\n\t\tif (verticesLength == vertices.length) {\n\t\t\tlet scaledVertices = Utils.toFloatArray(vertices);\n\t\t\tif (scale != 1) {\n\t\t\t\tfor (let i = 0, n = vertices.length; i < n; i++)\n\t\t\t\t\tscaledVertices[i] *= scale;\n\t\t\t}\n\t\t\tattachment.vertices = scaledVertices;\n\t\t\treturn;\n\t\t}\n\t\tlet weights = new Array();\n\t\tlet bones = new Array();\n\t\tfor (let i = 0, n = vertices.length; i < n;) {\n\t\t\tlet boneCount = vertices[i++];\n\t\t\tbones.push(boneCount);\n\t\t\tfor (let nn = i + boneCount * 4; i < nn; i += 4) {\n\t\t\t\tbones.push(vertices[i]);\n\t\t\t\tweights.push(vertices[i + 1] * scale);\n\t\t\t\tweights.push(vertices[i + 2] * scale);\n\t\t\t\tweights.push(vertices[i + 3]);\n\t\t\t}\n\t\t}\n\t\tattachment.bones = bones;\n\t\tattachment.vertices = Utils.toFloatArray(weights);\n\t}\n\n\treadAnimation(map: any, name: string, skeletonData: SkeletonData) {\n\t\tlet scale = this.scale;\n\t\tlet timelines = new Array();\n\n\t\t// Slot timelines.\n\t\tif (map.slots) {\n\t\t\tfor (let slotName in map.slots) {\n\t\t\t\tlet slotMap = map.slots[slotName];\n\t\t\t\tlet slotIndex = skeletonData.findSlotIndex(slotName);\n\t\t\t\tfor (let timelineName in slotMap) {\n\t\t\t\t\tlet timelineMap = slotMap[timelineName];\n\t\t\t\t\tif (!timelineMap) continue;\n\t\t\t\t\tif (timelineName == \"attachment\") {\n\t\t\t\t\t\tlet timeline = new AttachmentTimeline(timelineMap.length, slotIndex);\n\t\t\t\t\t\tfor (let frame = 0; frame < timelineMap.length; frame++) {\n\t\t\t\t\t\t\tlet keyMap = timelineMap[frame];\n\t\t\t\t\t\t\ttimeline.setFrame(frame, getValue(keyMap, \"time\", 0), keyMap.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\n\t\t\t\t\t} else if (timelineName == \"rgba\") {\n\t\t\t\t\t\tlet timeline = new RGBATimeline(timelineMap.length, timelineMap.length << 2, slotIndex);\n\t\t\t\t\t\tlet keyMap = timelineMap[0];\n\t\t\t\t\t\tlet time = getValue(keyMap, \"time\", 0);\n\t\t\t\t\t\tlet color = Color.fromString(keyMap.color);\n\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, color.r, color.g, color.b, color.a);\n\t\t\t\t\t\t\tlet nextMap = timelineMap[frame + 1];\n\t\t\t\t\t\t\tif (!nextMap) {\n\t\t\t\t\t\t\t\ttimeline.shrink(bezier);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\t\t\t\t\t\tlet newColor = Color.fromString(nextMap.color);\n\t\t\t\t\t\t\tlet curve = keyMap.curve;\n\t\t\t\t\t\t\tif (curve) {\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tcolor = newColor;\n\t\t\t\t\t\t\tkeyMap = nextMap;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttimelines.push(timeline);\n\n\t\t\t\t\t} else if (timelineName == \"rgb\") {\n\t\t\t\t\t\tlet timeline = new RGBTimeline(timelineMap.length, timelineMap.length * 3, slotIndex);\n\t\t\t\t\t\tlet keyMap = timelineMap[0];\n\t\t\t\t\t\tlet time = getValue(keyMap, \"time\", 0);\n\t\t\t\t\t\tlet color = Color.fromString(keyMap.color);\n\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, color.r, color.g, color.b);\n\t\t\t\t\t\t\tlet nextMap = timelineMap[frame + 1];\n\t\t\t\t\t\t\tif (!nextMap) {\n\t\t\t\t\t\t\t\ttimeline.shrink(bezier);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\t\t\t\t\t\tlet newColor = Color.fromString(nextMap.color);\n\t\t\t\t\t\t\tlet curve = keyMap.curve;\n\t\t\t\t\t\t\tif (curve) {\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tcolor = newColor;\n\t\t\t\t\t\t\tkeyMap = nextMap;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttimelines.push(timeline);\n\n\t\t\t\t\t} else if (timelineName == \"alpha\") {\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, new AlphaTimeline(timelineMap.length, timelineMap.length, slotIndex), 0, 1));\n\t\t\t\t\t} else if (timelineName == \"rgba2\") {\n\t\t\t\t\t\tlet timeline = new RGBA2Timeline(timelineMap.length, timelineMap.length * 7, slotIndex);\n\n\t\t\t\t\t\tlet keyMap = timelineMap[0];\n\t\t\t\t\t\tlet time = getValue(keyMap, \"time\", 0);\n\t\t\t\t\t\tlet color = Color.fromString(keyMap.light);\n\t\t\t\t\t\tlet color2 = Color.fromString(keyMap.dark);\n\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);\n\t\t\t\t\t\t\tlet nextMap = timelineMap[frame + 1];\n\t\t\t\t\t\t\tif (!nextMap) {\n\t\t\t\t\t\t\t\ttimeline.shrink(bezier);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\t\t\t\t\t\tlet newColor = Color.fromString(nextMap.light);\n\t\t\t\t\t\t\tlet newColor2 = Color.fromString(nextMap.dark);\n\t\t\t\t\t\t\tlet curve = keyMap.curve;\n\t\t\t\t\t\t\tif (curve) {\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tcolor = newColor;\n\t\t\t\t\t\t\tcolor2 = newColor2;\n\t\t\t\t\t\t\tkeyMap = nextMap;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttimelines.push(timeline);\n\n\t\t\t\t\t} else if (timelineName == \"rgb2\") {\n\t\t\t\t\t\tlet timeline = new RGB2Timeline(timelineMap.length, timelineMap.length * 6, slotIndex);\n\n\t\t\t\t\t\tlet keyMap = timelineMap[0];\n\t\t\t\t\t\tlet time = getValue(keyMap, \"time\", 0);\n\t\t\t\t\t\tlet color = Color.fromString(keyMap.light);\n\t\t\t\t\t\tlet color2 = Color.fromString(keyMap.dark);\n\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);\n\t\t\t\t\t\t\tlet nextMap = timelineMap[frame + 1];\n\t\t\t\t\t\t\tif (!nextMap) {\n\t\t\t\t\t\t\t\ttimeline.shrink(bezier);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\t\t\t\t\t\tlet newColor = Color.fromString(nextMap.light);\n\t\t\t\t\t\t\tlet newColor2 = Color.fromString(nextMap.dark);\n\t\t\t\t\t\t\tlet curve = keyMap.curve;\n\t\t\t\t\t\t\tif (curve) {\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tcolor = newColor;\n\t\t\t\t\t\t\tcolor2 = newColor2;\n\t\t\t\t\t\t\tkeyMap = nextMap;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Bone timelines.\n\t\tif (map.bones) {\n\t\t\tfor (let boneName in map.bones) {\n\t\t\t\tlet boneMap = map.bones[boneName];\n\t\t\t\tlet boneIndex = skeletonData.findBoneIndex(boneName);\n\t\t\t\tfor (let timelineName in boneMap) {\n\t\t\t\t\tlet timelineMap = boneMap[timelineName];\n\t\t\t\t\tif (timelineMap.length == 0) continue;\n\n\t\t\t\t\tif (timelineName === \"rotate\") {\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, new RotateTimeline(timelineMap.length, timelineMap.length, boneIndex), 0, 1));\n\t\t\t\t\t} else if (timelineName === \"translate\") {\n\t\t\t\t\t\tlet timeline = new TranslateTimeline(timelineMap.length, timelineMap.length << 1, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline2(timelineMap, timeline, \"x\", \"y\", 0, scale));\n\t\t\t\t\t} else if (timelineName === \"translatex\") {\n\t\t\t\t\t\tlet timeline = new TranslateXTimeline(timelineMap.length, timelineMap.length, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, timeline, 0, scale));\n\t\t\t\t\t} else if (timelineName === \"translatey\") {\n\t\t\t\t\t\tlet timeline = new TranslateYTimeline(timelineMap.length, timelineMap.length, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, timeline, 0, scale));\n\t\t\t\t\t} else if (timelineName === \"scale\") {\n\t\t\t\t\t\tlet timeline = new ScaleTimeline(timelineMap.length, timelineMap.length << 1, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline2(timelineMap, timeline, \"x\", \"y\", 1, 1));\n\t\t\t\t\t} else if (timelineName === \"scalex\") {\n\t\t\t\t\t\tlet timeline = new ScaleXTimeline(timelineMap.length, timelineMap.length, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, timeline, 1, 1));\n\t\t\t\t\t} else if (timelineName === \"scaley\") {\n\t\t\t\t\t\tlet timeline = new ScaleYTimeline(timelineMap.length, timelineMap.length, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, timeline, 1, 1));\n\t\t\t\t\t} else if (timelineName === \"shear\") {\n\t\t\t\t\t\tlet timeline = new ShearTimeline(timelineMap.length, timelineMap.length << 1, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline2(timelineMap, timeline, \"x\", \"y\", 0, 1));\n\t\t\t\t\t} else if (timelineName === \"shearx\") {\n\t\t\t\t\t\tlet timeline = new ShearXTimeline(timelineMap.length, timelineMap.length, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, timeline, 0, 1));\n\t\t\t\t\t} else if (timelineName === \"sheary\") {\n\t\t\t\t\t\tlet timeline = new ShearYTimeline(timelineMap.length, timelineMap.length, boneIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, timeline, 0, 1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// IK constraint timelines.\n\t\tif (map.ik) {\n\t\t\tfor (let constraintName in map.ik) {\n\t\t\t\tlet constraintMap = map.ik[constraintName];\n\t\t\t\tlet keyMap = constraintMap[0];\n\t\t\t\tif (!keyMap) continue;\n\n\t\t\t\tlet constraint = skeletonData.findIkConstraint(constraintName);\n\t\t\t\tlet constraintIndex = skeletonData.ikConstraints.indexOf(constraint);\n\t\t\t\tlet timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, constraintIndex);\n\n\t\t\t\tlet time = getValue(keyMap, \"time\", 0);\n\t\t\t\tlet mix = getValue(keyMap, \"mix\", 1);\n\t\t\t\tlet softness = getValue(keyMap, \"softness\", 0) * scale;\n\n\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\ttimeline.setFrame(frame, time, mix, softness, getValue(keyMap, \"bendPositive\", true) ? 1 : -1, getValue(keyMap, \"compress\", false), getValue(keyMap, \"stretch\", false));\n\t\t\t\t\tlet nextMap = constraintMap[frame + 1];\n\t\t\t\t\tif (!nextMap) {\n\t\t\t\t\t\ttimeline.shrink(bezier);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\t\t\t\tlet mix2 = getValue(nextMap, \"mix\", 1);\n\t\t\t\t\tlet softness2 = getValue(nextMap, \"softness\", 0) * scale;\n\t\t\t\t\tlet curve = keyMap.curve;\n\t\t\t\t\tif (curve) {\n\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);\n\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);\n\t\t\t\t\t}\n\n\t\t\t\t\ttime = time2;\n\t\t\t\t\tmix = mix2;\n\t\t\t\t\tsoftness = softness2;\n\t\t\t\t\tkeyMap = nextMap;\n\t\t\t\t}\n\t\t\t\ttimelines.push(timeline);\n\t\t\t}\n\t\t}\n\n\t\t// Transform constraint timelines.\n\t\tif (map.transform) {\n\t\t\tfor (let constraintName in map.transform) {\n\t\t\t\tlet timelineMap = map.transform[constraintName];\n\t\t\t\tlet keyMap = timelineMap[0];\n\t\t\t\tif (!keyMap) continue;\n\n\t\t\t\tlet constraint = skeletonData.findTransformConstraint(constraintName);\n\t\t\t\tlet constraintIndex = skeletonData.transformConstraints.indexOf(constraint);\n\t\t\t\tlet timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length << 2, constraintIndex);\n\n\t\t\t\tlet time = getValue(keyMap, \"time\", 0);\n\t\t\t\tlet mixRotate = getValue(keyMap, \"mixRotate\", 1);\n\t\t\t\tlet mixX = getValue(keyMap, \"mixX\", 1);\n\t\t\t\tlet mixY = getValue(keyMap, \"mixY\", mixX);\n\t\t\t\tlet mixScaleX = getValue(keyMap, \"mixScaleX\", 1);\n\t\t\t\tlet mixScaleY = getValue(keyMap, \"mixScaleY\", mixScaleX);\n\t\t\t\tlet mixShearY = getValue(keyMap, \"mixShearY\", 1);\n\n\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\ttimeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);\n\t\t\t\t\tlet nextMap = timelineMap[frame + 1];\n\t\t\t\t\tif (!nextMap) {\n\t\t\t\t\t\ttimeline.shrink(bezier);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\t\t\t\tlet mixRotate2 = getValue(nextMap, \"mixRotate\", 1);\n\t\t\t\t\tlet mixX2 = getValue(nextMap, \"mixX\", 1);\n\t\t\t\t\tlet mixY2 = getValue(nextMap, \"mixY\", mixX2);\n\t\t\t\t\tlet mixScaleX2 = getValue(nextMap, \"mixScaleX\", 1);\n\t\t\t\t\tlet mixScaleY2 = getValue(nextMap, \"mixScaleY\", mixScaleX2);\n\t\t\t\t\tlet mixShearY2 = getValue(nextMap, \"mixShearY\", 1);\n\t\t\t\t\tlet curve = keyMap.curve;\n\t\t\t\t\tif (curve) {\n\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);\n\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);\n\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);\n\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);\n\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);\n\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1);\n\t\t\t\t\t}\n\n\t\t\t\t\ttime = time2;\n\t\t\t\t\tmixRotate = mixRotate2;\n\t\t\t\t\tmixX = mixX2;\n\t\t\t\t\tmixY = mixY2;\n\t\t\t\t\tmixScaleX = mixScaleX2;\n\t\t\t\t\tmixScaleY = mixScaleY2;\n\t\t\t\t\tmixScaleX = mixScaleX2;\n\t\t\t\t\tkeyMap = nextMap;\n\t\t\t\t}\n\t\t\t\ttimelines.push(timeline);\n\t\t\t}\n\t\t}\n\n\t\t// Path constraint timelines.\n\t\tif (map.path) {\n\t\t\tfor (let constraintName in map.path) {\n\t\t\t\tlet constraintMap = map.path[constraintName];\n\t\t\t\tlet constraint = skeletonData.findPathConstraint(constraintName);\n\t\t\t\tlet constraintIndex = skeletonData.pathConstraints.indexOf(constraint);\n\t\t\t\tfor (let timelineName in constraintMap) {\n\t\t\t\t\tlet timelineMap = constraintMap[timelineName];\n\t\t\t\t\tlet keyMap = timelineMap[0];\n\t\t\t\t\tif (!keyMap) continue;\n\n\t\t\t\t\tif (timelineName === \"position\") {\n\t\t\t\t\t\tlet timeline = new PathConstraintPositionTimeline(timelineMap.length, timelineMap.length, constraintIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, timeline, 0, constraint.positionMode == PositionMode.Fixed ? scale : 1));\n\t\t\t\t\t} else if (timelineName === \"spacing\") {\n\t\t\t\t\t\tlet timeline = new PathConstraintSpacingTimeline(timelineMap.length, timelineMap.length, constraintIndex);\n\t\t\t\t\t\ttimelines.push(readTimeline1(timelineMap, timeline, 0, constraint.spacingMode == SpacingMode.Length || constraint.spacingMode == SpacingMode.Fixed ? scale : 1));\n\t\t\t\t\t} else if (timelineName === \"mix\") {\n\t\t\t\t\t\tlet timeline = new PathConstraintMixTimeline(timelineMap.size, timelineMap.size * 3, constraintIndex);\n\t\t\t\t\t\tlet time = getValue(keyMap, \"time\", 0);\n\t\t\t\t\t\tlet mixRotate = getValue(keyMap, \"mixRotate\", 1);\n\t\t\t\t\t\tlet mixX = getValue(keyMap, \"mixX\", 1);\n\t\t\t\t\t\tlet mixY = getValue(keyMap, \"mixY\", mixX);\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, mixRotate, mixX, mixY);\n\t\t\t\t\t\t\tlet nextMap = timelineMap[frame + 1];\n\t\t\t\t\t\t\tif (!nextMap) {\n\t\t\t\t\t\t\t\ttimeline.shrink(bezier);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\t\t\t\t\t\tlet mixRotate2 = getValue(nextMap, \"mixRotate\", 1);\n\t\t\t\t\t\t\tlet mixX2 = getValue(nextMap, \"mixX\", 1);\n\t\t\t\t\t\t\tlet mixY2 = getValue(nextMap, \"mixY\", mixX2);\n\t\t\t\t\t\t\tlet curve = keyMap.curve;\n\t\t\t\t\t\t\tif (curve) {\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);\n\t\t\t\t\t\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tmixRotate = mixRotate2;\n\t\t\t\t\t\t\tmixX = mixX2;\n\t\t\t\t\t\t\tmixY = mixY2;\n\t\t\t\t\t\t\tkeyMap = nextMap;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Deform timelines.\n\t\tif (map.deform) {\n\t\t\tfor (let deformName in map.deform) {\n\t\t\t\tlet deformMap = map.deform[deformName];\n\t\t\t\tlet skin = skeletonData.findSkin(deformName);\n\t\t\t\tfor (let slotName in deformMap) {\n\t\t\t\t\tlet slotMap = deformMap[slotName];\n\t\t\t\t\tlet slotIndex = skeletonData.findSlotIndex(slotName);\n\t\t\t\t\tfor (let timelineName in slotMap) {\n\t\t\t\t\t\tlet timelineMap = slotMap[timelineName];\n\t\t\t\t\t\tlet keyMap = timelineMap[0];\n\t\t\t\t\t\tif (!keyMap) continue;\n\n\t\t\t\t\t\tlet attachment = skin.getAttachment(slotIndex, timelineName);\n\t\t\t\t\t\tlet weighted = attachment.bones;\n\t\t\t\t\t\tlet vertices = attachment.vertices;\n\t\t\t\t\t\tlet deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;\n\n\t\t\t\t\t\tlet timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment);\n\t\t\t\t\t\tlet time = getValue(keyMap, \"time\", 0);\n\t\t\t\t\t\tfor (let frame = 0, bezier = 0; ; frame++) {\n\t\t\t\t\t\t\tlet deform: NumberArrayLike;\n\t\t\t\t\t\t\tlet verticesValue: Array = getValue(keyMap, \"vertices\", null);\n\t\t\t\t\t\t\tif (!verticesValue)\n\t\t\t\t\t\t\t\tdeform = weighted ? Utils.newFloatArray(deformLength) : vertices;\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tdeform = Utils.newFloatArray(deformLength);\n\t\t\t\t\t\t\t\tlet start = getValue(keyMap, \"offset\", 0);\n\t\t\t\t\t\t\t\tUtils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);\n\t\t\t\t\t\t\t\tif (scale != 1) {\n\t\t\t\t\t\t\t\t\tfor (let i = start, n = i + verticesValue.length; i < n; i++)\n\t\t\t\t\t\t\t\t\t\tdeform[i] *= scale;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!weighted) {\n\t\t\t\t\t\t\t\t\tfor (let i = 0; i < deformLength; i++)\n\t\t\t\t\t\t\t\t\t\tdeform[i] += vertices[i];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttimeline.setFrame(frame, time, deform);\n\t\t\t\t\t\t\tlet nextMap = timelineMap[frame + 1];\n\t\t\t\t\t\t\tif (!nextMap) {\n\t\t\t\t\t\t\t\ttimeline.shrink(bezier);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\t\t\t\t\t\tlet curve = keyMap.curve;\n\t\t\t\t\t\t\tif (curve) bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);\n\t\t\t\t\t\t\ttime = time2;\n\t\t\t\t\t\t\tkeyMap = nextMap;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimelines.push(timeline);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Draw order timelines.\n\t\tif (map.drawOrder) {\n\t\t\tlet timeline = new DrawOrderTimeline(map.drawOrder.length);\n\t\t\tlet slotCount = skeletonData.slots.length;\n\t\t\tlet frame = 0;\n\t\t\tfor (let i = 0; i < map.drawOrder.length; i++, frame++) {\n\t\t\t\tlet drawOrderMap = map.drawOrder[i];\n\t\t\t\tlet drawOrder: Array = null;\n\t\t\t\tlet offsets = getValue(drawOrderMap, \"offsets\", null);\n\t\t\t\tif (offsets) {\n\t\t\t\t\tdrawOrder = Utils.newArray(slotCount, -1);\n\t\t\t\t\tlet unchanged = Utils.newArray(slotCount - offsets.length, 0);\n\t\t\t\t\tlet originalIndex = 0, unchangedIndex = 0;\n\t\t\t\t\tfor (let ii = 0; ii < offsets.length; ii++) {\n\t\t\t\t\t\tlet offsetMap = offsets[ii];\n\t\t\t\t\t\tlet slotIndex = skeletonData.findSlotIndex(offsetMap.slot);\n\t\t\t\t\t\t// Collect unchanged items.\n\t\t\t\t\t\twhile (originalIndex != slotIndex)\n\t\t\t\t\t\t\tunchanged[unchangedIndex++] = originalIndex++;\n\t\t\t\t\t\t// Set changed items.\n\t\t\t\t\t\tdrawOrder[originalIndex + offsetMap.offset] = originalIndex++;\n\t\t\t\t\t}\n\t\t\t\t\t// Collect remaining unchanged items.\n\t\t\t\t\twhile (originalIndex < slotCount)\n\t\t\t\t\t\tunchanged[unchangedIndex++] = originalIndex++;\n\t\t\t\t\t// Fill in unchanged items.\n\t\t\t\t\tfor (let ii = slotCount - 1; ii >= 0; ii--)\n\t\t\t\t\t\tif (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex];\n\t\t\t\t}\n\t\t\t\ttimeline.setFrame(frame, getValue(drawOrderMap, \"time\", 0), drawOrder);\n\t\t\t}\n\t\t\ttimelines.push(timeline);\n\t\t}\n\n\t\t// Event timelines.\n\t\tif (map.events) {\n\t\t\tlet timeline = new EventTimeline(map.events.length);\n\t\t\tlet frame = 0;\n\t\t\tfor (let i = 0; i < map.events.length; i++, frame++) {\n\t\t\t\tlet eventMap = map.events[i];\n\t\t\t\tlet eventData = skeletonData.findEvent(eventMap.name);\n\t\t\t\tlet event = new Event(Utils.toSinglePrecision(getValue(eventMap, \"time\", 0)), eventData);\n\t\t\t\tevent.intValue = getValue(eventMap, \"int\", eventData.intValue);\n\t\t\t\tevent.floatValue = getValue(eventMap, \"float\", eventData.floatValue);\n\t\t\t\tevent.stringValue = getValue(eventMap, \"string\", eventData.stringValue);\n\t\t\t\tif (event.data.audioPath) {\n\t\t\t\t\tevent.volume = getValue(eventMap, \"volume\", 1);\n\t\t\t\t\tevent.balance = getValue(eventMap, \"balance\", 0);\n\t\t\t\t}\n\t\t\t\ttimeline.setFrame(frame, event);\n\t\t\t}\n\t\t\ttimelines.push(timeline);\n\t\t}\n\n\t\tlet duration = 0;\n\t\tfor (let i = 0, n = timelines.length; i < n; i++)\n\t\t\tduration = Math.max(duration, timelines[i].getDuration());\n\t\tskeletonData.animations.push(new Animation(name, timelines, duration));\n\t}\n}\n\nclass LinkedMesh {\n\tparent: string; skin: string;\n\tslotIndex: number;\n\tmesh: MeshAttachment;\n\tinheritDeform: boolean;\n\n\tconstructor(mesh: MeshAttachment, skin: string, slotIndex: number, parent: string, inheritDeform: boolean) {\n\t\tthis.mesh = mesh;\n\t\tthis.skin = skin;\n\t\tthis.slotIndex = slotIndex;\n\t\tthis.parent = parent;\n\t\tthis.inheritDeform = inheritDeform;\n\t}\n}\n\nfunction readTimeline1(keys: any[], timeline: CurveTimeline1, defaultValue: number, scale: number) {\n\tlet keyMap = keys[0];\n\tlet time = getValue(keyMap, \"time\", 0);\n\tlet value = getValue(keyMap, \"value\", defaultValue) * scale;\n\tlet bezier = 0;\n\tfor (let frame = 0; ; frame++) {\n\t\ttimeline.setFrame(frame, time, value);\n\t\tlet nextMap = keys[frame + 1];\n\t\tif (!nextMap) {\n\t\t\ttimeline.shrink(bezier);\n\t\t\treturn timeline;\n\t\t}\n\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\tlet value2 = getValue(nextMap, \"value\", defaultValue) * scale;\n\t\tif (keyMap.curve) bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);\n\t\ttime = time2;\n\t\tvalue = value2;\n\t\tkeyMap = nextMap;\n\t}\n}\n\nfunction readTimeline2(keys: any[], timeline: CurveTimeline2, name1: string, name2: string, defaultValue: number, scale: number) {\n\tlet keyMap = keys[0];\n\tlet time = getValue(keyMap, \"time\", 0);\n\tlet value1 = getValue(keyMap, name1, defaultValue) * scale;\n\tlet value2 = getValue(keyMap, name2, defaultValue) * scale;\n\tlet bezier = 0;\n\tfor (let frame = 0; ; frame++) {\n\t\ttimeline.setFrame(frame, time, value1, value2);\n\t\tlet nextMap = keys[frame + 1];\n\t\tif (!nextMap) {\n\t\t\ttimeline.shrink(bezier);\n\t\t\treturn timeline;\n\t\t}\n\t\tlet time2 = getValue(nextMap, \"time\", 0);\n\t\tlet nvalue1 = getValue(nextMap, name1, defaultValue) * scale;\n\t\tlet nvalue2 = getValue(nextMap, name2, defaultValue) * scale;\n\t\tlet curve = keyMap.curve;\n\t\tif (curve) {\n\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);\n\t\t\tbezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);\n\t\t}\n\t\ttime = time2;\n\t\tvalue1 = nvalue1;\n\t\tvalue2 = nvalue2;\n\t\tkeyMap = nextMap;\n\t}\n}\n\nfunction readCurve(curve: any, timeline: CurveTimeline, bezier: number, frame: number, value: number, time1: number, time2: number,\n\tvalue1: number, value2: number, scale: number) {\n\tif (curve == \"stepped\") {\n\t\ttimeline.setStepped(frame);\n\t\treturn bezier;\n\t}\n\tlet i = value << 2;\n\tlet cx1 = curve[i];\n\tlet cy1 = curve[i + 1] * scale;\n\tlet cx2 = curve[i + 2];\n\tlet cy2 = curve[i + 3] * scale;\n\ttimeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);\n\treturn bezier + 1;\n}\n\nfunction getValue(map: any, property: string, defaultValue: any) {\n\treturn map[property] !== undefined ? map[property] : defaultValue;\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n(() => {\n\tif (typeof Math.fround === \"undefined\") {\n\t\tMath.fround = (function (array) {\n\t\t\treturn function (x: number) {\n\t\t\t\treturn array[0] = x, array[0];\n\t\t\t};\n\t\t})(new Float32Array(1));\n\t}\n})();\n\nexport { }", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Skeleton } from \"../Skeleton\";\nimport { Vector2, Color, MathUtils } from \"../Utils\";\nimport { VertexEffect } from \"../VertexEffect\";\n\nexport class JitterEffect implements VertexEffect {\n\tjitterX = 0;\n\tjitterY = 0;\n\n\tconstructor(jitterX: number, jitterY: number) {\n\t\tthis.jitterX = jitterX;\n\t\tthis.jitterY = jitterY;\n\t}\n\n\tbegin(skeleton: Skeleton): void {\n\t}\n\n\ttransform(position: Vector2, uv: Vector2, light: Color, dark: Color): void {\n\t\tposition.x += MathUtils.randomTriangular(-this.jitterX, this.jitterY);\n\t\tposition.y += MathUtils.randomTriangular(-this.jitterX, this.jitterY);\n\t}\n\n\tend(): void {\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Skeleton } from \"../Skeleton\";\nimport { PowOut, Vector2, Color, MathUtils } from \"../Utils\";\nimport { VertexEffect } from \"../VertexEffect\";\n\nexport class SwirlEffect implements VertexEffect {\n\tstatic interpolation = new PowOut(2);\n\tcenterX = 0;\n\tcenterY = 0;\n\tradius = 0;\n\tangle = 0;\n\tprivate worldX = 0;\n\tprivate worldY = 0;\n\n\tconstructor(radius: number) {\n\t\tthis.radius = radius;\n\t}\n\n\tbegin(skeleton: Skeleton): void {\n\t\tthis.worldX = skeleton.x + this.centerX;\n\t\tthis.worldY = skeleton.y + this.centerY;\n\t}\n\n\ttransform(position: Vector2, uv: Vector2, light: Color, dark: Color): void {\n\t\tlet radAngle = this.angle * MathUtils.degreesToRadians;\n\t\tlet x = position.x - this.worldX;\n\t\tlet y = position.y - this.worldY;\n\t\tlet dist = Math.sqrt(x * x + y * y);\n\t\tif (dist < this.radius) {\n\t\t\tlet theta = SwirlEffect.interpolation.apply(0, radAngle, (this.radius - dist) / this.radius);\n\t\t\tlet cos = Math.cos(theta);\n\t\t\tlet sin = Math.sin(theta);\n\t\t\tposition.x = cos * x - sin * y + this.worldX;\n\t\t\tposition.y = sin * x + cos * y + this.worldY;\n\t\t}\n\t}\n\n\tend(): void {\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Texture, TextureFilter, TextureWrap } from \"spine-core\";\n\nexport class CanvasTexture extends Texture {\n\tconstructor(image: HTMLImageElement) {\n\t\tsuper(image);\n\t}\n\n\tsetFilters(minFilter: TextureFilter, magFilter: TextureFilter) { }\n\tsetWraps(uWrap: TextureWrap, vWrap: TextureWrap) { }\n\tdispose() { }\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { AssetManagerBase, Downloader } from \"spine-core\";\nimport { CanvasTexture } from \"./CanvasTexture\";\n\nexport class AssetManager extends AssetManagerBase {\n\tconstructor(pathPrefix: string = \"\", downloader: Downloader = null) {\n\t\tsuper((image: HTMLImageElement) => { return new CanvasTexture(image); }, pathPrefix, downloader);\n\t}\n}\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated January 1, 2020. Replaces all prior versions.\n *\n * Copyright (c) 2013-2020, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport { Utils, Color, Skeleton, RegionAttachment, TextureAtlasRegion, BlendMode, MeshAttachment, Slot } from \"spine-core\";\nimport { CanvasTexture } from \"./CanvasTexture\";\n\nexport class SkeletonRenderer {\n\tstatic QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];\n\tstatic VERTEX_SIZE = 2 + 2 + 4;\n\n\tprivate ctx: CanvasRenderingContext2D;\n\n\tpublic triangleRendering = false;\n\tpublic debugRendering = false;\n\tprivate vertices = Utils.newFloatArray(8 * 1024);\n\tprivate tempColor = new Color();\n\n\tconstructor(context: CanvasRenderingContext2D) {\n\t\tthis.ctx = context;\n\t}\n\n\tdraw(skeleton: Skeleton) {\n\t\tif (this.triangleRendering) this.drawTriangles(skeleton);\n\t\telse this.drawImages(skeleton);\n\t}\n\n\tprivate drawImages(skeleton: Skeleton) {\n\t\tlet ctx = this.ctx;\n\t\tlet color = this.tempColor;\n\t\tlet skeletonColor = skeleton.color;\n\t\tlet drawOrder = skeleton.drawOrder;\n\n\t\tif (this.debugRendering) ctx.strokeStyle = \"green\";\n\n\t\tfor (let i = 0, n = drawOrder.length; i < n; i++) {\n\t\t\tlet slot = drawOrder[i];\n\t\t\tlet bone = slot.bone;\n\t\t\tif (!bone.active) continue;\n\n\t\t\tlet attachment = slot.getAttachment();\n\t\t\tif (!(attachment instanceof RegionAttachment)) continue;\n\t\t\tlet region: TextureAtlasRegion = attachment.region;\n\t\t\tlet image: HTMLImageElement = (region.page.texture).getImage() as HTMLImageElement;\n\n\t\t\tlet slotColor = slot.color;\n\t\t\tlet regionColor = attachment.color;\n\t\t\tcolor.set(skeletonColor.r * slotColor.r * regionColor.r,\n\t\t\t\tskeletonColor.g * slotColor.g * regionColor.g,\n\t\t\t\tskeletonColor.b * slotColor.b * regionColor.b,\n\t\t\t\tskeletonColor.a * slotColor.a * regionColor.a);\n\n\t\t\tctx.save();\n\t\t\tctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);\n\t\t\tctx.translate(attachment.offset[0], attachment.offset[1]);\n\t\t\tctx.rotate(attachment.rotation * Math.PI / 180);\n\n\t\t\tlet atlasScale = attachment.width / region.originalWidth;\n\t\t\tctx.scale(atlasScale * attachment.scaleX, atlasScale * attachment.scaleY);\n\n\t\t\tlet w = region.width, h = region.height;\n\t\t\tctx.translate(w / 2, h / 2);\n\t\t\tif (attachment.region.degrees == 90) {\n\t\t\t\tlet t = w;\n\t\t\t\tw = h;\n\t\t\t\th = t;\n\t\t\t\tctx.rotate(-Math.PI / 2);\n\t\t\t}\n\t\t\tctx.scale(1, -1);\n\t\t\tctx.translate(-w / 2, -h / 2);\n\n\t\t\tif (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) {\n\t\t\t\tctx.globalAlpha = color.a;\n\t\t\t\t// experimental tinting via compositing, doesn't work\n\t\t\t\t// ctx.globalCompositeOperation = \"source-atop\";\n\t\t\t\t// ctx.fillStyle = \"rgba(\" + (color.r * 255 | 0) + \", \" + (color.g * 255 | 0) + \", \" + (color.b * 255 | 0) + \", \" + color.a + \")\";\n\t\t\t\t// ctx.fillRect(0, 0, w, h);\n\t\t\t}\n\t\t\tctx.drawImage(image, region.x, region.y, w, h, 0, 0, w, h);\n\t\t\tif (this.debugRendering) ctx.strokeRect(0, 0, w, h);\n\t\t\tctx.restore();\n\t\t}\n\t}\n\n\tprivate drawTriangles(skeleton: Skeleton) {\n\t\tlet ctx = this.ctx;\n\t\tlet color = this.tempColor;\n\t\tlet skeletonColor = skeleton.color;\n\t\tlet drawOrder = skeleton.drawOrder;\n\n\t\tlet blendMode: BlendMode = null;\n\t\tlet vertices: ArrayLike = this.vertices;\n\t\tlet triangles: Array = null;\n\n\t\tfor (let i = 0, n = drawOrder.length; i < n; i++) {\n\t\t\tlet slot = drawOrder[i];\n\t\t\tlet attachment = slot.getAttachment();\n\n\t\t\tlet texture: HTMLImageElement;\n\t\t\tlet region: TextureAtlasRegion;\n\t\t\tif (attachment instanceof RegionAttachment) {\n\t\t\t\tlet regionAttachment = attachment;\n\t\t\t\tvertices = this.computeRegionVertices(slot, regionAttachment, false);\n\t\t\t\ttriangles = SkeletonRenderer.QUAD_TRIANGLES;\n\t\t\t\tregion = regionAttachment.region;\n\t\t\t\ttexture = (region.page.texture).getImage() as HTMLImageElement;\n\t\t\t} else if (attachment instanceof MeshAttachment) {\n\t\t\t\tlet mesh = attachment;\n\t\t\t\tvertices = this.computeMeshVertices(slot, mesh, false);\n\t\t\t\ttriangles = mesh.triangles;\n\t\t\t\ttexture = (mesh.region.renderObject).page.texture.getImage() as HTMLImageElement;\n\t\t\t} else\n\t\t\t\tcontinue;\n\n\t\t\tif (texture) {\n\t\t\t\tif (slot.data.blendMode != blendMode) blendMode = slot.data.blendMode;\n\n\t\t\t\tlet slotColor = slot.color;\n\t\t\t\tlet attachmentColor = attachment.color;\n\t\t\t\tcolor.set(skeletonColor.r * slotColor.r * attachmentColor.r,\n\t\t\t\t\tskeletonColor.g * slotColor.g * attachmentColor.g,\n\t\t\t\t\tskeletonColor.b * slotColor.b * attachmentColor.b,\n\t\t\t\t\tskeletonColor.a * slotColor.a * attachmentColor.a);\n\n\t\t\t\tif (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) {\n\t\t\t\t\tctx.globalAlpha = color.a;\n\t\t\t\t\t// experimental tinting via compositing, doesn't work\n\t\t\t\t\t// ctx.globalCompositeOperation = \"source-atop\";\n\t\t\t\t\t// ctx.fillStyle = \"rgba(\" + (color.r * 255 | 0) + \", \" + (color.g * 255 | 0) + \", \" + (color.b * 255 | 0) + \", \" + color.a + \")\";\n\t\t\t\t\t// ctx.fillRect(0, 0, w, h);\n\t\t\t\t}\n\n\t\t\t\tfor (var j = 0; j < triangles.length; j += 3) {\n\t\t\t\t\tlet t1 = triangles[j] * 8, t2 = triangles[j + 1] * 8, t3 = triangles[j + 2] * 8;\n\n\t\t\t\t\tlet x0 = vertices[t1], y0 = vertices[t1 + 1], u0 = vertices[t1 + 6], v0 = vertices[t1 + 7];\n\t\t\t\t\tlet x1 = vertices[t2], y1 = vertices[t2 + 1], u1 = vertices[t2 + 6], v1 = vertices[t2 + 7];\n\t\t\t\t\tlet x2 = vertices[t3], y2 = vertices[t3 + 1], u2 = vertices[t3 + 6], v2 = vertices[t3 + 7];\n\n\t\t\t\t\tthis.drawTriangle(texture, x0, y0, u0, v0, x1, y1, u1, v1, x2, y2, u2, v2);\n\n\t\t\t\t\tif (this.debugRendering) {\n\t\t\t\t\t\tctx.strokeStyle = \"green\";\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t\t\t\tctx.lineTo(x2, y2);\n\t\t\t\t\t\tctx.lineTo(x0, y0);\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.ctx.globalAlpha = 1;\n\t}\n\n\t// Adapted from http://extremelysatisfactorytotalitarianism.com/blog/?p=2120\n\t// Apache 2 licensed\n\tprivate drawTriangle(img: HTMLImageElement, x0: number, y0: number, u0: number, v0: number,\n\t\tx1: number, y1: number, u1: number, v1: number,\n\t\tx2: number, y2: number, u2: number, v2: number) {\n\t\tlet ctx = this.ctx;\n\n\t\tu0 *= img.width;\n\t\tv0 *= img.height;\n\t\tu1 *= img.width;\n\t\tv1 *= img.height;\n\t\tu2 *= img.width;\n\t\tv2 *= img.height;\n\n\t\tctx.beginPath();\n\t\tctx.moveTo(x0, y0);\n\t\tctx.lineTo(x1, y1);\n\t\tctx.lineTo(x2, y2);\n\t\tctx.closePath();\n\n\t\tx1 -= x0;\n\t\ty1 -= y0;\n\t\tx2 -= x0;\n\t\ty2 -= y0;\n\n\t\tu1 -= u0;\n\t\tv1 -= v0;\n\t\tu2 -= u0;\n\t\tv2 -= v0;\n\n\t\tvar det = 1 / (u1 * v2 - u2 * v1),\n\n\t\t\t// linear transformation\n\t\t\ta = (v2 * x1 - v1 * x2) * det,\n\t\t\tb = (v2 * y1 - v1 * y2) * det,\n\t\t\tc = (u1 * x2 - u2 * x1) * det,\n\t\t\td = (u1 * y2 - u2 * y1) * det,\n\n\t\t\t// translation\n\t\t\te = x0 - a * u0 - c * v0,\n\t\t\tf = y0 - b * u0 - d * v0;\n\n\t\tctx.save();\n\t\tctx.transform(a, b, c, d, e, f);\n\t\tctx.clip();\n\t\tctx.drawImage(img, 0, 0);\n\t\tctx.restore();\n\t}\n\n\tprivate computeRegionVertices(slot: Slot, region: RegionAttachment, pma: boolean) {\n\t\tlet skeletonColor = slot.bone.skeleton.color;\n\t\tlet slotColor = slot.color;\n\t\tlet regionColor = region.color;\n\t\tlet alpha = skeletonColor.a * slotColor.a * regionColor.a;\n\t\tlet multiplier = pma ? alpha : 1;\n\t\tlet color = this.tempColor;\n\t\tcolor.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier,\n\t\t\tskeletonColor.g * slotColor.g * regionColor.g * multiplier,\n\t\t\tskeletonColor.b * slotColor.b * regionColor.b * multiplier,\n\t\t\talpha);\n\n\t\tregion.computeWorldVertices(slot.bone, this.vertices, 0, SkeletonRenderer.VERTEX_SIZE);\n\n\t\tlet vertices = this.vertices;\n\t\tlet uvs = region.uvs;\n\n\t\tvertices[RegionAttachment.C1R] = color.r;\n\t\tvertices[RegionAttachment.C1G] = color.g;\n\t\tvertices[RegionAttachment.C1B] = color.b;\n\t\tvertices[RegionAttachment.C1A] = color.a;\n\t\tvertices[RegionAttachment.U1] = uvs[0];\n\t\tvertices[RegionAttachment.V1] = uvs[1];\n\n\t\tvertices[RegionAttachment.C2R] = color.r;\n\t\tvertices[RegionAttachment.C2G] = color.g;\n\t\tvertices[RegionAttachment.C2B] = color.b;\n\t\tvertices[RegionAttachment.C2A] = color.a;\n\t\tvertices[RegionAttachment.U2] = uvs[2];\n\t\tvertices[RegionAttachment.V2] = uvs[3];\n\n\t\tvertices[RegionAttachment.C3R] = color.r;\n\t\tvertices[RegionAttachment.C3G] = color.g;\n\t\tvertices[RegionAttachment.C3B] = color.b;\n\t\tvertices[RegionAttachment.C3A] = color.a;\n\t\tvertices[RegionAttachment.U3] = uvs[4];\n\t\tvertices[RegionAttachment.V3] = uvs[5];\n\n\t\tvertices[RegionAttachment.C4R] = color.r;\n\t\tvertices[RegionAttachment.C4G] = color.g;\n\t\tvertices[RegionAttachment.C4B] = color.b;\n\t\tvertices[RegionAttachment.C4A] = color.a;\n\t\tvertices[RegionAttachment.U4] = uvs[6];\n\t\tvertices[RegionAttachment.V4] = uvs[7];\n\n\t\treturn vertices;\n\t}\n\n\tprivate computeMeshVertices(slot: Slot, mesh: MeshAttachment, pma: boolean) {\n\t\tlet skeletonColor = slot.bone.skeleton.color;\n\t\tlet slotColor = slot.color;\n\t\tlet regionColor = mesh.color;\n\t\tlet alpha = skeletonColor.a * slotColor.a * regionColor.a;\n\t\tlet multiplier = pma ? alpha : 1;\n\t\tlet color = this.tempColor;\n\t\tcolor.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier,\n\t\t\tskeletonColor.g * slotColor.g * regionColor.g * multiplier,\n\t\t\tskeletonColor.b * slotColor.b * regionColor.b * multiplier,\n\t\t\talpha);\n\n\t\tlet vertexCount = mesh.worldVerticesLength / 2;\n\t\tlet vertices = this.vertices;\n\t\tif (vertices.length < mesh.worldVerticesLength) this.vertices = vertices = Utils.newFloatArray(mesh.worldVerticesLength);\n\t\tmesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, SkeletonRenderer.VERTEX_SIZE);\n\n\t\tlet uvs = mesh.uvs;\n\t\tfor (let i = 0, u = 0, v = 2; i < vertexCount; i++) {\n\t\t\tvertices[v++] = color.r;\n\t\t\tvertices[v++] = color.g;\n\t\t\tvertices[v++] = color.b;\n\t\t\tvertices[v++] = color.a;\n\t\t\tvertices[v++] = uvs[u++];\n\t\t\tvertices[v++] = uvs[u++];\n\t\t\tv += 2;\n\t\t}\n\n\t\treturn vertices;\n\t}\n}"], - "mappings": "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", + "sourcesContent": ["export * from \"./AssetManager\";\nexport * from \"./CanvasTexture\";\nexport * from \"./SkeletonRenderer\";\n\nexport * from \"@esotericsoftware/spine-core\"\n\n// Before modularization, we would expose spine-core on the global\n// `spine` object, and spine-canvas on the global `spine.canvas` object.\n// This was used by clients when including spine-canvas via @@ -46,72 +45,71 @@ new spine.SpinePlayer("player-container", { `.trim(); - private prefix: string = - ` + private prefix: string = + ` `.trim() - private postfix: string = ``; - private code: any; - private player: HTMLIFrameElement; + private postfix: string = ``; + private code: any; + private player: HTMLIFrameElement; - constructor (parent: HTMLElement) { - this.render(parent); - } + constructor(parent: HTMLElement) { + this.render(parent); + } - private render (parent: HTMLElement) { - let dom = /*html*/` + private render(parent: HTMLElement) { + let dom = /*html*/`

`; - parent.innerHTML = dom; - let codeElement = parent.getElementsByClassName("spine-player-editor-code")[0]; - this.player = parent.getElementsByClassName("spine-player-editor-player")[0] as HTMLIFrameElement; + parent.innerHTML = dom; + let codeElement = parent.getElementsByClassName("spine-player-editor-code")[0]; + this.player = parent.getElementsByClassName("spine-player-editor-player")[0] as HTMLIFrameElement; - requestAnimationFrame(() => { - this.code = CodeMirror(codeElement, { - lineNumbers: true, - tabSize: 3, - indentUnit: 3, - indentWithTabs: true, - scrollBarStyle: "native", - mode: "htmlmixed", - theme: "monokai" - }); - this.code.on("change", () => { - this.startPlayer(); - }); + requestAnimationFrame(() => { + this.code = CodeMirror(codeElement, { + lineNumbers: true, + tabSize: 3, + indentUnit: 3, + indentWithTabs: true, + scrollBarStyle: "native", + mode: "htmlmixed", + theme: "monokai" + }); + this.code.on("change", () => { + this.startPlayer(); + }); - this.setCode(SpinePlayerEditor.DEFAULT_CODE); - }) - } + this.setCode(SpinePlayerEditor.DEFAULT_CODE); + }) + } - setPreAndPostfix (prefix: string, postfix: string) { - this.prefix = prefix; - this.postfix = postfix; - this.startPlayer() - } + setPreAndPostfix(prefix: string, postfix: string) { + this.prefix = prefix; + this.postfix = postfix; + this.startPlayer() + } - setCode (code: string) { - this.code.setValue(code); - this.startPlayer(); - } + setCode(code: string) { + this.code.setValue(code); + this.startPlayer(); + } - private timerId = 0; - startPlayer () { - clearTimeout(this.timerId); - this.timerId = setTimeout(() => { - let code = this.code.getDoc().getValue(); - code = this.prefix + code + this.postfix; - code = window.btoa(code); - this.player.src = ""; - this.player.src = "data:text/html;base64," + code; - }, 500); - } + private timerId = 0; + startPlayer() { + clearTimeout(this.timerId); + this.timerId = setTimeout(() => { + let code = this.code.getDoc().getValue(); + code = this.prefix + code + this.postfix; + code = window.btoa(code); + this.player.src = ""; + this.player.src = "data:text/html;base64," + code; + }, 500); } } diff --git a/spine-ts/spine-player/src/index.ts b/spine-ts/spine-player/src/index.ts new file mode 100644 index 000000000..b5060fc76 --- /dev/null +++ b/spine-ts/spine-player/src/index.ts @@ -0,0 +1,27 @@ +export * from './Player'; +export * from './PlayerEditor'; + +export * from "@esotericsoftware/spine-core"; +export * from "@esotericsoftware/spine-webgl"; + +// Before modularization, we would expose spine-core on the global +// `spine` object, and spine-webgl on the global `spine.webgl` object. +// This was used by clients when including spine-webgl via