UNPKG

ngx-spine

Version:

[![Build Status](https://travis-ci.org/PoiScript/ngx-spine.svg?branch=master)](https://travis-ci.org/PoiScript/ngx-spine)

733 lines 75.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /****************************************************************************** * Spine Runtimes License Agreement * Last updated May 1, 2019. Replaces all prior versions. * * Copyright (c) 2013-2019, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS * INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Utils, MathUtils } from "./Utils"; import { SpacingMode, RotateMode, PositionMode } from "./PathConstraintData"; import { PathAttachment } from "./attachments/PathAttachment"; var PathConstraint = /** @class */ (function () { function PathConstraint(data, skeleton) { this.position = 0; this.spacing = 0; this.rotateMix = 0; this.translateMix = 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 == null) throw new Error("data cannot be null."); if (skeleton == null) throw new Error("skeleton cannot be null."); this.data = data; this.bones = new Array(); for (var 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.rotateMix = data.rotateMix; this.translateMix = data.translateMix; } /** * @return {?} */ PathConstraint.prototype.isActive = /** * @return {?} */ function () { return this.active; }; /** * @return {?} */ PathConstraint.prototype.apply = /** * @return {?} */ function () { this.update(); }; /** * @return {?} */ PathConstraint.prototype.update = /** * @return {?} */ function () { /** @type {?} */ var attachment = this.target.getAttachment(); if (!(attachment instanceof PathAttachment)) return; /** @type {?} */ var rotateMix = this.rotateMix; /** @type {?} */ var translateMix = this.translateMix; /** @type {?} */ var translate = translateMix > 0; /** @type {?} */ var rotate = rotateMix > 0; if (!translate && !rotate) return; /** @type {?} */ var data = this.data; /** @type {?} */ var percentSpacing = data.spacingMode == SpacingMode.Percent; /** @type {?} */ var rotateMode = data.rotateMode; /** @type {?} */ var tangents = rotateMode == RotateMode.Tangent; /** @type {?} */ var scale = rotateMode == RotateMode.ChainScale; /** @type {?} */ var boneCount = this.bones.length; /** @type {?} */ var spacesCount = tangents ? boneCount : boneCount + 1; /** @type {?} */ var bones = this.bones; /** @type {?} */ var spaces = Utils.setArraySize(this.spaces, spacesCount); /** @type {?} */ var lengths = null; /** @type {?} */ var spacing = this.spacing; if (scale || !percentSpacing) { if (scale) lengths = Utils.setArraySize(this.lengths, boneCount); /** @type {?} */ var lengthSpacing = data.spacingMode == SpacingMode.Length; for (var i = 0, n = spacesCount - 1; i < n;) { /** @type {?} */ var bone = bones[i]; /** @type {?} */ var setupLength = bone.data.length; if (setupLength < PathConstraint.epsilon) { if (scale) lengths[i] = 0; spaces[++i] = 0; } else if (percentSpacing) { if (scale) { /** @type {?} */ var x = setupLength * bone.a; /** @type {?} */ var y = setupLength * bone.c; /** @type {?} */ var length_1 = Math.sqrt(x * x + y * y); lengths[i] = length_1; } spaces[++i] = spacing; } else { /** @type {?} */ var x = setupLength * bone.a; /** @type {?} */ var y = setupLength * bone.c; /** @type {?} */ var length_2 = Math.sqrt(x * x + y * y); if (scale) lengths[i] = length_2; spaces[++i] = ((lengthSpacing ? setupLength + spacing : spacing) * length_2) / setupLength; } } } else { for (var i = 1; i < spacesCount; i++) spaces[i] = spacing; } /** @type {?} */ var positions = this.computeWorldPositions((/** @type {?} */ (attachment)), spacesCount, tangents, data.positionMode == PositionMode.Percent, percentSpacing); /** @type {?} */ var boneX = positions[0]; /** @type {?} */ var boneY = positions[1]; /** @type {?} */ var offsetRotation = data.offsetRotation; /** @type {?} */ var tip = false; if (offsetRotation == 0) tip = rotateMode == RotateMode.Chain; else { tip = false; /** @type {?} */ var p = this.target.bone; offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad; } for (var i = 0, p = 3; i < boneCount; i++, p += 3) { /** @type {?} */ var bone = bones[i]; bone.worldX += (boneX - bone.worldX) * translateMix; bone.worldY += (boneY - bone.worldY) * translateMix; /** @type {?} */ var x = positions[p]; /** @type {?} */ var y = positions[p + 1]; /** @type {?} */ var dx = x - boneX; /** @type {?} */ var dy = y - boneY; if (scale) { /** @type {?} */ var length_3 = lengths[i]; if (length_3 != 0) { /** @type {?} */ var s = (Math.sqrt(dx * dx + dy * dy) / length_3 - 1) * rotateMix + 1; bone.a *= s; bone.c *= s; } } boneX = x; boneY = y; if (rotate) { /** @type {?} */ var a = bone.a; /** @type {?} */ var b = bone.b; /** @type {?} */ var c = bone.c; /** @type {?} */ var d = bone.d; /** @type {?} */ var r = 0; /** @type {?} */ var cos = 0; /** @type {?} */ var 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); /** @type {?} */ var length_4 = bone.data.length; boneX += (length_4 * (cos * a - sin * c) - dx) * rotateMix; boneY += (length_4 * (sin * a + cos * c) - dy) * rotateMix; } else { r += offsetRotation; } if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) // r += MathUtils.PI2; r *= rotateMix; 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.appliedValid = false; } }; /** * @param {?} path * @param {?} spacesCount * @param {?} tangents * @param {?} percentPosition * @param {?} percentSpacing * @return {?} */ PathConstraint.prototype.computeWorldPositions = /** * @param {?} path * @param {?} spacesCount * @param {?} tangents * @param {?} percentPosition * @param {?} percentSpacing * @return {?} */ function (path, spacesCount, tangents, percentPosition, percentSpacing) { /** @type {?} */ var target = this.target; /** @type {?} */ var position = this.position; /** @type {?} */ var spaces = this.spaces; /** @type {?} */ var out = Utils.setArraySize(this.positions, spacesCount * 3 + 2); /** @type {?} */ var world = null; /** @type {?} */ var closed = path.closed; /** @type {?} */ var verticesLength = path.worldVerticesLength; /** @type {?} */ var curveCount = verticesLength / 6; /** @type {?} */ var prevCurve = PathConstraint.NONE; if (!path.constantSpeed) { /** @type {?} */ var lengths = path.lengths; curveCount -= closed ? 1 : 2; /** @type {?} */ var pathLength_1 = lengths[curveCount]; if (percentPosition) position *= pathLength_1; if (percentSpacing) { for (var i = 1; i < spacesCount; i++) spaces[i] *= pathLength_1; } world = Utils.setArraySize(this.world, 8); for (var i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { /** @type {?} */ var space = spaces[i]; position += space; /** @type {?} */ var p = position; if (closed) { p %= pathLength_1; if (p < 0) p += pathLength_1; 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 > pathLength_1) { if (prevCurve != PathConstraint.AFTER) { prevCurve = PathConstraint.AFTER; path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2); } this.addAfterPosition(p - pathLength_1, world, 0, out, o); continue; } // Determine curve containing position. for (;; curve++) { /** @type {?} */ var length_5 = lengths[curve]; if (p > length_5) continue; if (curve == 0) p /= length_5; else { /** @type {?} */ var prev = lengths[curve - 1]; p = (p - prev) / (length_5 - prev); } break; } if (curve != prevCurve) { prevCurve = curve; if (closed && 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; } // World vertices. if (closed) { 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); } // Curve lengths. /** @type {?} */ var curves = Utils.setArraySize(this.curves, curveCount); /** @type {?} */ var pathLength = 0; /** @type {?} */ var x1 = world[0]; /** @type {?} */ var y1 = world[1]; /** @type {?} */ var cx1 = 0; /** @type {?} */ var cy1 = 0; /** @type {?} */ var cx2 = 0; /** @type {?} */ var cy2 = 0; /** @type {?} */ var x2 = 0; /** @type {?} */ var y2 = 0; /** @type {?} */ var tmpx = 0; /** @type {?} */ var tmpy = 0; /** @type {?} */ var dddfx = 0; /** @type {?} */ var dddfy = 0; /** @type {?} */ var ddfx = 0; /** @type {?} */ var ddfy = 0; /** @type {?} */ var dfx = 0; /** @type {?} */ var dfy = 0; for (var 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 (percentPosition) position *= pathLength; else position *= pathLength / path.lengths[curveCount - 1]; if (percentSpacing) { for (var i = 1; i < spacesCount; i++) spaces[i] *= pathLength; } /** @type {?} */ var segments = this.segments; /** @type {?} */ var curveLength = 0; for (var i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { /** @type {?} */ var space = spaces[i]; position += space; /** @type {?} */ var p = position; if (closed) { 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; } // Determine curve containing position. for (;; curve++) { /** @type {?} */ var length_6 = curves[curve]; if (p > length_6) continue; if (curve == 0) p /= length_6; else { /** @type {?} */ var prev = curves[curve - 1]; p = (p - prev) / (length_6 - prev); } break; } // Curve segment lengths. if (curve != prevCurve) { prevCurve = curve; /** @type {?} */ var 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) * 0.006; dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006; 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; } // Weight by segment length. p *= curveLength; for (;; segment++) { /** @type {?} */ var length_7 = segments[segment]; if (p > length_7) continue; if (segment == 0) p /= length_7; else { /** @type {?} */ var prev = segments[segment - 1]; p = segment + (p - prev) / (length_7 - prev); } break; } this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0)); } return out; }; /** * @param {?} p * @param {?} temp * @param {?} i * @param {?} out * @param {?} o * @return {?} */ PathConstraint.prototype.addBeforePosition = /** * @param {?} p * @param {?} temp * @param {?} i * @param {?} out * @param {?} o * @return {?} */ function (p, temp, i, out, o) { /** @type {?} */ var x1 = temp[i]; /** @type {?} */ var y1 = temp[i + 1]; /** @type {?} */ var dx = temp[i + 2] - x1; /** @type {?} */ var dy = temp[i + 3] - y1; /** @type {?} */ var r = Math.atan2(dy, dx); out[o] = x1 + p * Math.cos(r); out[o + 1] = y1 + p * Math.sin(r); out[o + 2] = r; }; /** * @param {?} p * @param {?} temp * @param {?} i * @param {?} out * @param {?} o * @return {?} */ PathConstraint.prototype.addAfterPosition = /** * @param {?} p * @param {?} temp * @param {?} i * @param {?} out * @param {?} o * @return {?} */ function (p, temp, i, out, o) { /** @type {?} */ var x1 = temp[i + 2]; /** @type {?} */ var y1 = temp[i + 3]; /** @type {?} */ var dx = x1 - temp[i]; /** @type {?} */ var dy = y1 - temp[i + 1]; /** @type {?} */ var r = Math.atan2(dy, dx); out[o] = x1 + p * Math.cos(r); out[o + 1] = y1 + p * Math.sin(r); out[o + 2] = r; }; /** * @param {?} p * @param {?} x1 * @param {?} y1 * @param {?} cx1 * @param {?} cy1 * @param {?} cx2 * @param {?} cy2 * @param {?} x2 * @param {?} y2 * @param {?} out * @param {?} o * @param {?} tangents * @return {?} */ PathConstraint.prototype.addCurvePosition = /** * @param {?} p * @param {?} x1 * @param {?} y1 * @param {?} cx1 * @param {?} cy1 * @param {?} cx2 * @param {?} cy2 * @param {?} x2 * @param {?} y2 * @param {?} out * @param {?} o * @param {?} tangents * @return {?} */ function (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; } /** @type {?} */ var tt = p * p; /** @type {?} */ var ttt = tt * p; /** @type {?} */ var u = 1 - p; /** @type {?} */ var uu = u * u; /** @type {?} */ var uuu = uu * u; /** @type {?} */ var ut = u * p; /** @type {?} */ var ut3 = ut * 3; /** @type {?} */ var uut3 = u * ut3; /** @type {?} */ var utt3 = ut3 * p; /** @type {?} */ var x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt; /** @type {?} */ var y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; out[o] = x; out[o + 1] = y; if (tangents) { if (p < 0.001) 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)); } }; PathConstraint.NONE = -1; PathConstraint.BEFORE = -2; PathConstraint.AFTER = -3; PathConstraint.epsilon = 0.00001; return PathConstraint; }()); export { PathConstraint }; if (false) { /** @type {?} */ PathConstraint.NONE; /** @type {?} */ PathConstraint.BEFORE; /** @type {?} */ PathConstraint.AFTER; /** @type {?} */ PathConstraint.epsilon; /** @type {?} */ PathConstraint.prototype.data; /** @type {?} */ PathConstraint.prototype.bones; /** @type {?} */ PathConstraint.prototype.target; /** @type {?} */ PathConstraint.prototype.position; /** @type {?} */ PathConstraint.prototype.spacing; /** @type {?} */ PathConstraint.prototype.rotateMix; /** @type {?} */ PathConstraint.prototype.translateMix; /** @type {?} */ PathConstraint.prototype.spaces; /** @type {?} */ PathConstraint.prototype.positions; /** @type {?} */ PathConstraint.prototype.world; /** @type {?} */ PathConstraint.prototype.curves; /** @type {?} */ PathConstraint.prototype.lengths; /** @type {?} */ PathConstraint.prototype.segments; /** @type {?} */ PathConstraint.prototype.active; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aENvbnN0cmFpbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvY29yZS9QYXRoQ29uc3RyYWludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLEVBRUwsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ2IsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFJOUQ7SUFtQkUsd0JBQVksSUFBd0IsRUFBRSxRQUFrQjtRQVh4RCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixXQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM3QixjQUFTLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNoQyxVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM1QixXQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM3QixZQUFPLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM5QixhQUFRLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUMvQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxRCxJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxL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