diff --git a/examples/export/runtimes.sh b/examples/export/runtimes.sh index 0db4a1051..126d3cb00 100755 --- a/examples/export/runtimes.sh +++ b/examples/export/runtimes.sh @@ -152,6 +152,10 @@ cp -f ../vine/export/vine.json ../../spine-starling/spine-starling-example/src/ cp -f ../vine/export/vine.atlas ../../spine-starling/spine-starling-example/src/ cp -f ../vine/export/vine.png ../../spine-starling/spine-starling-example/src/ +cp -f ../stretchyman/export/stretchyman.json ../../spine-starling/spine-starling-example/src/ +cp -f ../stretchyman/export/stretchyman.atlas ../../spine-starling/spine-starling-example/src/ +cp -f ../stretchyman/export/stretchyman.png ../../spine-starling/spine-starling-example/src/ + echo "spine-ts" rm -f ../../spine-ts/webgl/example/assets/* diff --git a/spine-as3/spine-as3/src/spine/Bone.as b/spine-as3/spine-as3/src/spine/Bone.as index 575c65b80..efc5dd5d8 100644 --- a/spine-as3/spine-as3/src/spine/Bone.as +++ b/spine-as3/spine-as3/src/spine/Bone.as @@ -44,7 +44,14 @@ public class Bone implements Updatable { public var scaleY:Number; public var shearX:Number; public var shearY:Number; - public var appliedRotation:Number; + public var ax:Number; + public var ay:Number; + public var arotation:Number; + public var ascaleX:Number; + public var ascaleY:Number; + public var ashearX:Number; + public var ashearY:Number; + public var appliedValid:Boolean; internal var _a:Number; internal var _b:Number; @@ -52,8 +59,6 @@ public class Bone implements Updatable { internal var _d:Number; internal var _worldX:Number; internal var _worldY:Number; - internal var _worldSignX:Number; - internal var _worldSignY:Number; internal var _sorted:Boolean; @@ -79,14 +84,26 @@ public class Bone implements Updatable { /** Computes the world SRT using the parent bone and the specified local SRT. */ public function updateWorldTransformWith (x:Number, y:Number, rotation:Number, scaleX:Number, scaleY:Number, shearX:Number, shearY:Number) : void { - appliedRotation = rotation; - - var rotationY:Number = rotation + 90 + shearY; - var la:Number = MathUtils.cosDeg(rotation + shearX) * scaleX, lb:Number = MathUtils.cosDeg(rotationY) * scaleY; - var lc:Number = MathUtils.sinDeg(rotation + shearX) * scaleX, ld:Number = MathUtils.sinDeg(rotationY) * scaleY; + ax = x; + ay = y; + arotation = rotation; + ascaleX = scaleX; + ascaleY = scaleY; + ashearX = shearX; + ashearY = shearY; + appliedValid = true; + + var rotationY:Number = 0, la:Number = 0, lb:Number = 0, lc:Number = 0, ld:Number = 0; + var sin:Number = 0, cos:Number = 0; + var s:Number = 0; var parent:Bone = _parent; if (!parent) { // Root bone. + rotationY = rotation + 90 + shearY; + la = MathUtils.cosDeg(rotation + shearX) * scaleX; + lb = MathUtils.cosDeg(rotationY) * scaleY; + lc = MathUtils.sinDeg(rotation + shearX) * scaleX; + ld = MathUtils.sinDeg(rotationY) * scaleY; var skeleton:Skeleton = _skeleton; if (skeleton.flipX) { x = -x; @@ -102,91 +119,103 @@ public class Bone implements Updatable { _b = lb; _c = lc; _d = ld; - _worldX = x; - _worldY = y; - _worldSignX = scaleX < 0 ? -1 : 1; - _worldSignY = scaleY < 0 ? -1 : 1; + _worldX = x + skeleton.x; + _worldY = y + skeleton.y; return; } var pa:Number = parent._a, pb:Number = parent._b, pc:Number = parent._c, pd:Number = parent._d; _worldX = pa * x + pb * y + parent._worldX; - _worldY = pc * x + pd * y + parent._worldY; - _worldSignX = parent._worldSignX * (scaleX < 0 ? -1 : 1); - _worldSignY = parent._worldSignY * (scaleY < 0 ? -1 : 1); + _worldY = pc * x + pd * y + parent._worldY; - if (data.inheritRotation && data.inheritScale) { + switch (_data.transformMode) { + case TransformMode.normal: { + rotationY = rotation + 90 + shearY; + la = MathUtils.cosDeg(rotation + shearX) * scaleX; + lb = MathUtils.cosDeg(rotationY) * scaleY; + lc = MathUtils.sinDeg(rotation + shearX) * scaleX; + ld = MathUtils.sinDeg(rotationY) * scaleY; _a = pa * la + pb * lc; _b = pa * lb + pb * ld; _c = pc * la + pd * lc; _d = pc * lb + pd * ld; - } else { - if (data.inheritRotation) { // No scale inheritance. - pa = 1; - pb = 0; - pc = 0; - pd = 1; - do { - var cos:Number = MathUtils.cosDeg(parent.appliedRotation), sin:Number = MathUtils.sinDeg(parent.appliedRotation); - var temp:Number = pa * cos + pb * sin; - pb = pb * cos - pa * sin; - pa = temp; - temp = pc * cos + pd * sin; - pd = pd * cos - pc * sin; - pc = temp; - - if (!parent.data.inheritRotation) break; - parent = parent.parent; - } while (parent != null); - _a = pa * la + pb * lc; - _b = pa * lb + pb * ld; - _c = pc * la + pd * lc; - _d = pc * lb + pd * ld; - } else if (data.inheritScale) { // No rotation inheritance. - pa = 1; - pb = 0; - pc = 0; - pd = 1; - do { - cos = MathUtils.cosDeg(parent.appliedRotation), sin = MathUtils.sinDeg(parent.appliedRotation); - var psx:Number = parent.scaleX, psy:Number = parent.scaleY; - var za:Number = cos * psx, zb:Number = sin * psy, zc:Number = sin * psx, zd:Number = cos * psy; - temp = pa * za + pb * zc; - pb = pb * zd - pa * zb; - pa = temp; - temp = pc * za + pd * zc; - pd = pd * zd - pc * zb; - pc = temp; - - if (psx >= 0) sin = -sin; - temp = pa * cos + pb * sin; - pb = pb * cos - pa * sin; - pa = temp; - temp = pc * cos + pd * sin; - pd = pd * cos - pc * sin; - pc = temp; - - if (!parent.data.inheritScale) break; - parent = parent.parent; - } while (parent != null); - _a = pa * la + pb * lc; - _b = pa * lb + pb * ld; - _c = pc * la + pd * lc; - _d = pc * lb + pd * ld; + return; + } + case TransformMode.onlyTranslation: { + rotationY = rotation + 90 + shearY; + _a = MathUtils.cosDeg(rotation + shearX) * scaleX; + _b = MathUtils.cosDeg(rotationY) * scaleY; + _c = MathUtils.sinDeg(rotation + shearX) * scaleX; + _d = MathUtils.sinDeg(rotationY) * scaleY; + break; + } + case TransformMode.noRotationOrReflection: { + var psx:Number = Math.sqrt(pa * pa + pc * pc); + var psy:Number = 0; + var prx:Number = 0; + if (psx > 0.0001) { + psy = Math.abs((pa * pd - pb * pc) / psx); + prx = Math.atan2(pc, pa) * MathUtils.radDeg; } else { - _a = la; - _b = lb; - _c = lc; - _d = ld; + psx = 0; + psy = Math.sqrt(pb * pb + pd * pd); + prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg; } - if (_skeleton.flipX) { - _a = -_a; + cos = MathUtils.cosDeg(prx); + sin = MathUtils.sinDeg(prx); + pa = cos * psx; + pb = -sin * psy; + pc = sin * psx; + pd = cos * psy; + var rx:Number = rotation + shearX - prx; + var ry:Number = rotation + shearY - prx + 90; + la = MathUtils.cosDeg(rx) * scaleX; + lb = MathUtils.cosDeg(ry) * scaleY; + lc = MathUtils.sinDeg(rx) * scaleX; + ld = MathUtils.sinDeg(ry) * scaleY; + _a = pa * la + pb * lc; + _b = pa * lb + pb * ld; + _c = pc * la + pd * lc; + _d = pc * lb + pd * ld; + + break; + } + case TransformMode.noScale: + case TransformMode.noScaleOrReflection: { + cos = MathUtils.cosDeg(rotation); + sin = MathUtils.sinDeg(rotation); + var za:Number = pa * cos + pb * sin; + var zc:Number = pc * cos + pd * sin; + s = Math.sqrt(za * za + zc * zc); + if (s > 0.00001) s = 1 / s; + za *= s; + zc *= s; + s = Math.sqrt(za * za + zc * zc); + var r:Number = Math.PI / 2 + Math.atan2(zc, za); + var zb:Number = Math.cos(r) * s; + var zd:Number = Math.sin(r) * s; + la = MathUtils.cosDeg(shearX) * scaleX; + lb = MathUtils.cosDeg(90 + shearY) * scaleY; + lc = MathUtils.sinDeg(shearX) * scaleX; + ld = MathUtils.sinDeg(90 + shearY) * scaleY; + _a = za * la + zb * lc; + _b = za * lb + zb * ld; + _c = zc * la + zd * lc; + _d = zc * lb + zd * ld; + if (_data.transformMode != TransformMode.noScaleOrReflection ? pa * pd - pb * pc < 0 : skeleton.flipX != skeleton.flipY) { _b = -_b; - } - if (_skeleton.flipY != yDown) { - _c = -_c; _d = -_d; } + return; + } + } + if (_skeleton.flipX) { + _a = -_a; + _b = -_b; + } + if (_skeleton.flipY != yDown) { + _c = -_c; + _d = -_d; } } @@ -240,14 +269,6 @@ public class Bone implements Updatable { return _worldY; } - public function get worldSignX () : Number { - return _worldSignX; - } - - public function get worldSignY () : Number { - return _worldSignY; - } - public function get worldRotationX () : Number { return Math.atan2(_c, _a) * MathUtils.radDeg; } @@ -257,23 +278,23 @@ public class Bone implements Updatable { } public function get worldScaleX () : Number { - return Math.sqrt(_a * _a + _b * _b) * _worldSignX; + return Math.sqrt(_a * _a + _c * _c); } public function get worldScaleY () : Number { - return Math.sqrt(_c * _c + _d * _d) * _worldSignY; + return Math.sqrt(_b * _b + _d * _d); } public function worldToLocalRotationX () : Number { var parent:Bone = _parent; - if (parent == null) return rotation; + if (parent == null) return arotation; var pa:Number = parent.a, pb:Number = parent.b, pc:Number = parent.c, pd:Number = parent.d, a:Number = this.a, c:Number = this.c; return Math.atan2(pa * c - pc * a, pd * a - pb * c) * MathUtils.radDeg; } public function worldToLocalRotationY () : Number { var parent:Bone = _parent; - if (parent == null) return rotation; + if (parent == null) return arotation; var pa:Number = parent.a, pb:Number = parent.b, pc:Number = parent.c, pd:Number = parent.d, b:Number = this.b, d:Number = this.d; return Math.atan2(pa * d - pc * b, pd * b - pb * d) * MathUtils.radDeg; } @@ -285,31 +306,31 @@ public class Bone implements Updatable { this._b = cos * b - sin * d; this._c = sin * a + cos * c; this._d = sin * b + cos * d; + this.appliedValid = false; } - /** Computes the local transform from the world transform. This can be useful to perform processing on the local transform - * after the world transform has been modified directly (eg, by a constraint). + /** Computes the individual applied transform values from the world transform. This can be useful to perform processing using + * the applied transform after the world transform has been modified directly (eg, by a constraint). *

- * Some redundant information is lost by the world transform, such as -1,-1 scale versus 180 rotation. The computed local - * transform values may differ from the original values but are functionally the same. */ - public function updateLocalTransform () : void { + * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. */ + public function updateAppliedTransform () : void { + appliedValid = true; var parent:Bone = this.parent; if (parent == null) { - x = worldX; - y = worldY; - rotation = Math.atan2(c, a) * MathUtils.radDeg; - scaleX = Math.sqrt(a * a + c * c); - scaleY = Math.sqrt(b * b + d * d); - var det:Number = a * d - b * c; - shearX = 0; - shearY = Math.atan2(a * b + c * d, det) * MathUtils.radDeg; + ax = worldX; + ay = worldY; + arotation = Math.atan2(c, a) * MathUtils.radDeg; + ascaleX = Math.sqrt(a * a + c * c); + ascaleY = Math.sqrt(b * b + d * d); + ashearX = 0; + ashearY = Math.atan2(a * b + c * d, a * d - b * c) * MathUtils.radDeg; return; } var pa:Number = parent.a, pb:Number = parent.b, pc:Number = parent.c, pd:Number = parent.d; var pid:Number = 1 / (pa * pd - pb * pc); var dx:Number = worldX - parent.worldX, dy:Number = worldY - parent.worldY; - x = (dx * pd * pid - dy * pb * pid); - y = (dy * pa * pid - dx * pc * pid); + ax = (dx * pd * pid - dy * pb * pid); + ay = (dy * pa * pid - dx * pc * pid); var ia:Number = pid * pd; var id:Number = pid * pa; var ib:Number = pid * pb; @@ -318,20 +339,19 @@ public class Bone implements Updatable { var rb:Number = ia * b - ib * d; var rc:Number = id * c - ic * a; var rd:Number = id * d - ic * b; - shearX = 0; - scaleX = Math.sqrt(ra * ra + rc * rc); + ashearX = 0; + ascaleX = Math.sqrt(ra * ra + rc * rc); if (scaleX > 0.0001) { - det = ra * rd - rb * rc; - scaleY = det / scaleX; - shearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg; - rotation = Math.atan2(rc, ra) * MathUtils.radDeg; + var det:Number = ra * rd - rb * rc; + ascaleY = det /ascaleX; + ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg; + arotation = Math.atan2(rc, ra) * MathUtils.radDeg; } else { - scaleX = 0; - scaleY = Math.sqrt(rb * rb + rd * rd); - shearY = 0; - rotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg; - } - appliedRotation = rotation; + ascaleX = 0; + ascaleY = Math.sqrt(rb * rb + rd * rd); + ashearY = 0; + arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg; + } } public function worldToLocal (world:Vector.) : void { diff --git a/spine-as3/spine-as3/src/spine/BoneData.as b/spine-as3/spine-as3/src/spine/BoneData.as index 71bffeae7..c188fc339 100644 --- a/spine-as3/spine-as3/src/spine/BoneData.as +++ b/spine-as3/spine-as3/src/spine/BoneData.as @@ -42,8 +42,7 @@ public class BoneData { public var scaleY:Number = 1; public var shearX:Number; public var shearY:Number; - public var inheritRotation:Boolean = true; - public var inheritScale:Boolean = true; + public var transformMode:TransformMode = TransformMode.normal; /** @param parent May be null. */ public function BoneData (index:int, name:String, parent:BoneData) { diff --git a/spine-as3/spine-as3/src/spine/Constraint.as b/spine-as3/spine-as3/src/spine/Constraint.as new file mode 100644 index 000000000..14a2995af --- /dev/null +++ b/spine-as3/spine-as3/src/spine/Constraint.as @@ -0,0 +1,37 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "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 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. + *****************************************************************************/ + +package spine { + +public interface Constraint extends Updatable { + function getOrder () : Number; +} + +} diff --git a/spine-as3/spine-as3/src/spine/IkConstraint.as b/spine-as3/spine-as3/src/spine/IkConstraint.as index cdfb52611..b5d9cdf5e 100644 --- a/spine-as3/spine-as3/src/spine/IkConstraint.as +++ b/spine-as3/spine-as3/src/spine/IkConstraint.as @@ -30,14 +30,12 @@ package spine { -public class IkConstraint implements Updatable { +public class IkConstraint implements Constraint { internal var _data:IkConstraintData; public var bones:Vector.; public var target:Bone; public var mix:Number; public var bendDirection:int; - - public var level:int; public function IkConstraint (data:IkConstraintData, skeleton:Skeleton) { if (data == null) throw new ArgumentError("data cannot be null."); @@ -66,6 +64,10 @@ public class IkConstraint implements Updatable { break; } } + + public function getOrder() : Number { + return _data.order; + } public function get data () : IkConstraintData { return _data; @@ -78,17 +80,18 @@ public class IkConstraint implements Updatable { /** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world * coordinate system. */ static public function apply1 (bone:Bone, targetX:Number, targetY:Number, alpha:Number) : void { - var pp:Bone = bone.parent; - var id:Number = 1 / (pp.a * pp.d - pp.b * pp.c); - var x:Number = targetX - pp.worldX, y:Number = targetY - pp.worldY; - var tx:Number = (x * pp.d - y * pp.b) * id - bone.x, ty:Number = (y * pp.a - x * pp.c) * id - bone.y; - var rotationIK:Number = Math.atan2(ty, tx) * MathUtils.radDeg - bone.shearX - bone.rotation; - if (bone.scaleX < 0) rotationIK += 180; + if (!bone.appliedValid) bone.updateAppliedTransform(); + var p:Bone = bone.parent; + var id:Number = 1 / (p.a * p.d - p.b * p.c); + var x:Number = targetX - p.worldX, y:Number = targetY - p.worldY; + var tx:Number = (x * p.d - y * p.b) * id - bone.ax, ty:Number = (y * p.a - x * p.c) * id - bone.ay; + var rotationIK:Number = Math.atan2(ty, tx) * MathUtils.radDeg - bone.ashearX - bone.arotation; + if (bone.ascaleX < 0) rotationIK += 180; if (rotationIK > 180) rotationIK -= 360; else if (rotationIK < -180) rotationIK += 360; - bone.updateWorldTransformWith(bone.x, bone.y, bone.rotation + rotationIK * alpha, bone.scaleX, bone.scaleY, bone.shearX, - bone.shearY); + bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, bone.ascaleX, bone.ascaleY, bone.ashearX, + bone.ashearY); } /** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The @@ -99,7 +102,9 @@ public class IkConstraint implements Updatable { child.updateWorldTransform(); return; } - var px:Number = parent.x, py:Number = parent.y, psx:Number = parent.scaleX, psy:Number = parent.scaleY, csx:Number = child.scaleX;; + if (!parent.appliedValid) parent.updateAppliedTransform(); + if (!child.appliedValid) child.updateAppliedTransform(); + var px:Number = parent.ax, py:Number = parent.ay, psx:Number = parent.ascaleX, psy:Number = parent.ascaleY, csx:Number = child.ascaleX; var os1:int, os2:int, s2:int; if (psx < 0) { psx = -psx; @@ -118,14 +123,14 @@ public class IkConstraint implements Updatable { os2 = 180; } else os2 = 0; - var cx:Number = child.x, cy:Number, cwx:Number, cwy:Number, a:Number = parent.a, b:Number = parent.b, c:Number = parent.c, d:Number = parent.d; + var cx:Number = child.ax, cy:Number, cwx:Number, cwy:Number, a:Number = parent.a, b:Number = parent.b, c:Number = parent.c, d:Number = parent.d; var u:Boolean = Math.abs(psx - psy) <= 0.0001; if (!u) { cy = 0; cwx = a * cx + parent.worldX; cwy = c * cx + parent.worldY; } else { - cy = child.y; + cy = child.ay; cwx = a * cx + b * cy + parent.worldX; cwy = c * cx + d * cy + parent.worldY; } @@ -212,18 +217,18 @@ public class IkConstraint implements Updatable { } } var os:Number = Math.atan2(cy, cx) * s2; - var rotation:Number = parent.rotation; + var rotation:Number = 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, parent.scaleX, parent.scaleY, 0, 0); - rotation = child.rotation; - a2 = ((a2 + os) * MathUtils.radDeg - child.shearX) * s2 + os2 - rotation; + parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, parent.ascaleX, parent.ascaleY, 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.scaleX, child.scaleY, child.shearX, child.shearY); + child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); } } diff --git a/spine-as3/spine-as3/src/spine/IkConstraintData.as b/spine-as3/spine-as3/src/spine/IkConstraintData.as index 92dfcdf3b..63ed31361 100644 --- a/spine-as3/spine-as3/src/spine/IkConstraintData.as +++ b/spine-as3/spine-as3/src/spine/IkConstraintData.as @@ -32,6 +32,7 @@ package spine { public class IkConstraintData { internal var _name:String; + public var order:Number; public var bones:Vector. = new Vector.(); public var target:BoneData; public var bendDirection:int = 1; diff --git a/spine-as3/spine-as3/src/spine/PathConstraint.as b/spine-as3/spine-as3/src/spine/PathConstraint.as index e68ae6e9e..566b94555 100644 --- a/spine-as3/spine-as3/src/spine/PathConstraint.as +++ b/spine-as3/spine-as3/src/spine/PathConstraint.as @@ -31,7 +31,7 @@ package spine { import spine.attachments.PathAttachment; -public class PathConstraint implements Updatable { +public class PathConstraint implements Constraint { private static const NONE:int = -1, BEFORE:int = -2, AFTER:int = -3; internal var _data:PathConstraintData; @@ -100,16 +100,14 @@ public class PathConstraint implements Updatable { } var positions:Vector. = computeWorldPositions(attachment, spacesCount, tangents, - data.positionMode == PositionMode.percent, spacingMode == SpacingMode.percent); - var skeleton:Skeleton = target.skeleton; - var skeletonX:Number = skeleton.x, skeletonY:Number = skeleton.y; + data.positionMode == PositionMode.percent, spacingMode == SpacingMode.percent); var boneX:Number = positions[0], boneY:Number = positions[1], offsetRotation:Number = data.offsetRotation; var tip:Boolean = rotateMode == RotateMode.chain && offsetRotation == 0; var p:Number; for (i = 0, p = 3; i < boneCount; i++, p += 3) { bone = bones[i]; - bone._worldX += (boneX - skeletonX - bone.worldX) * translateMix; - bone._worldY += (boneY - skeletonY - bone.worldY) * translateMix; + bone._worldX += (boneX - bone.worldX) * translateMix; + bone._worldY += (boneY - bone.worldY) * translateMix; x = positions[p]; y = positions[p + 1]; var dx:Number = x - boneX, dy:Number = y - boneY; if (scale) { length = lengths[i]; @@ -149,6 +147,7 @@ public class PathConstraint implements Updatable { bone._c = sin * a + cos * c; bone._d = sin * b + cos * d; } + bone.appliedValid = false; } } @@ -394,7 +393,7 @@ public class PathConstraint implements Updatable { private function addCurvePosition (p:Number, x1:Number, y1:Number, cx1:Number, cy1:Number, cx2:Number, cy2:Number, x2:Number, y2:Number, out:Vector., o:int, tangents:Boolean) : void { - if (p == 0) p = 0.0001; + if (p == 0 || isNaN(p)) p = 0.0001; var tt:Number = p * p, ttt:Number = tt * p, u:Number = 1 - p, uu:Number = u * u, uuu:Number = uu * u; var ut:Number = u * p, ut3:Number = ut * 3, uut3:Number = u * ut3, utt3:Number = ut3 * p; var x:Number = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y:Number = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; @@ -410,6 +409,10 @@ public class PathConstraint implements Updatable { public function get data () : PathConstraintData { return _data; } + + public function getOrder () : Number { + return _data.order; + } public function toString () : String { return _data.name; diff --git a/spine-as3/spine-as3/src/spine/PathConstraintData.as b/spine-as3/spine-as3/src/spine/PathConstraintData.as index 5c9c0f049..a1d29cbdf 100644 --- a/spine-as3/spine-as3/src/spine/PathConstraintData.as +++ b/spine-as3/spine-as3/src/spine/PathConstraintData.as @@ -32,6 +32,7 @@ package spine { public dynamic class PathConstraintData { internal var _name:String; + public var order:Number; internal var _bones:Vector. = new Vector.(); public var target:SlotData; public var positionMode:PositionMode; diff --git a/spine-as3/spine-as3/src/spine/Skeleton.as b/spine-as3/spine-as3/src/spine/Skeleton.as index dd755a8b0..61478f883 100644 --- a/spine-as3/spine-as3/src/spine/Skeleton.as +++ b/spine-as3/spine-as3/src/spine/Skeleton.as @@ -38,10 +38,11 @@ public class Skeleton { public var bones:Vector.; public var slots:Vector.; public var drawOrder:Vector.; - public var ikConstraints:Vector., ikConstraintsSorted:Vector.; + public var ikConstraints:Vector.; public var transformConstraints:Vector.; public var pathConstraints:Vector.; private var _updateCache:Vector. = new Vector.(); + private var _updateCacheReset:Vector. = new Vector.(); private var _skin:Skin; public var r:Number = 1, g:Number = 1, b:Number = 1, a:Number = 1; public var time:Number = 0; @@ -75,8 +76,7 @@ public class Skeleton { drawOrder[drawOrder.length] = slot; } - ikConstraints = new Vector.(); - ikConstraintsSorted = new Vector.(); + ikConstraints = new Vector.(); for each (var ikConstraintData:IkConstraintData in data.ikConstraints) ikConstraints.push(new IkConstraint(ikConstraintData, this)); @@ -98,103 +98,112 @@ public class Skeleton { updateCache.length = 0; var bones:Vector. = this.bones; - for (var i:int = 0, n:int = bones.length; i < n; i++) + var i:Number = 0; + var n:Number = 0; + for (i = 0, n = bones.length; i < n; i++) bones[i]._sorted = false; // IK first, lowest hierarchy depth first. - var ikConstraints:Vector. = this.ikConstraintsSorted; - ikConstraints.length = 0; - for each (var c:IkConstraint in this.ikConstraints) - ikConstraints.push(c); - var ikCount:int = ikConstraints.length; - var level:int; - for (i = 0, n = ikCount; i < n; i++) { - var ik:IkConstraint = ikConstraints[i]; - var bone:Bone = ik.bones[0].parent; - for (level = 0; bone != null; level++) - bone = bone.parent; - ik.level = level; - } - var ii:int; - for (i = 1; i < ikCount; i++) { - ik = ikConstraints[i]; - level = ik.level; - for (ii = i - 1; ii >= 0; ii--) { - var other:IkConstraint = ikConstraints[ii]; - if (other.level < level) break; - ikConstraints[ii + 1] = other; - } - ikConstraints[ii + 1] = ik; - } - for (i = 0, n = ikConstraints.length; i < n; i++) { - var ikConstraint:IkConstraint = ikConstraints[i]; - var target:Bone = ikConstraint.target; - sortBone(target); - - var constrained:Vector. = ikConstraint.bones; - var parent:Bone = constrained[0]; - sortBone(parent); - - updateCache.push(ikConstraint); - - sortReset(parent.children); - constrained[constrained.length - 1]._sorted = true; - } - - var pathConstraints:Vector. = this.pathConstraints; - for (i = 0, n = pathConstraints.length; i < n; i++) { - var pathConstraint:PathConstraint = pathConstraints[i]; - - var slot:Slot = pathConstraint.target; - var slotIndex:int = slot.data.index; - var slotBone:Bone = slot.bone; - if (skin != null) sortPathConstraintAttachment(skin, slotIndex, slotBone); - if (_data.defaultSkin != null && _data.defaultSkin != skin) - sortPathConstraintAttachment(_data.defaultSkin, slotIndex, slotBone); - - var nn:int; - for (ii = 0, nn = _data.skins.length; ii < nn; ii++) - sortPathConstraintAttachment(_data.skins[ii], slotIndex, slotBone); - - var attachment:PathAttachment = slot.attachment as PathAttachment; - if (attachment != null) sortPathConstraintAttachment2(attachment, slotBone); - - constrained = pathConstraint.bones; - var boneCount:int = constrained.length; - for (ii = 0; ii < boneCount; ii++) - sortBone(constrained[ii]); - - updateCache.push(pathConstraint); - - for (ii = 0; ii < boneCount; ii++) - sortReset(constrained[ii].children); - for (ii = 0; ii < boneCount; ii++) - constrained[ii]._sorted = true; - } - + var ikConstraints:Vector. = this.ikConstraints; var transformConstraints:Vector. = this.transformConstraints; - for (i = 0, n = transformConstraints.length; i < n; i++) { - var transformConstraint:TransformConstraint = transformConstraints[i]; - - sortBone(transformConstraint.target); - - constrained = transformConstraint.bones; - boneCount = constrained.length; - for (ii = 0; ii < boneCount; ii++) - sortBone(constrained[ii]); - - updateCache.push(transformConstraint); - - for (ii = 0; ii < boneCount; ii++) - sortReset(constrained[ii].children); - for (ii = 0; ii < boneCount; ii++) - constrained[ii]._sorted = true; + var pathConstraints:Vector. = this.pathConstraints; + var ikCount:Number = ikConstraints.length, transformCount:Number = transformConstraints.length, pathCount:Number = pathConstraints.length; + var constraintCount:Number = ikCount + transformCount + pathCount; + + outer: + for (i = 0; i < constraintCount; i++) { + var ii:Number = 0; + for (ii = 0; ii < ikCount; ii++) { + var ikConstraint:IkConstraint = ikConstraints[ii]; + if (ikConstraint.data.order == i) { + sortIkConstraint(ikConstraint); + continue outer; + } + } + for (ii = 0; ii < transformCount; ii++) { + var transformConstraint:TransformConstraint = transformConstraints[ii]; + if (transformConstraint.data.order == i) { + sortTransformConstraint(transformConstraint); + continue outer; + } + } + for (ii = 0; ii < pathCount; ii++) { + var pathConstraint:PathConstraint = pathConstraints[ii]; + if (pathConstraint.data.order == i) { + sortPathConstraint(pathConstraint); + continue outer; + } + } } - + for (i = 0, n = bones.length; i < n; i++) sortBone(bones[i]); } + private function sortIkConstraint (constraint:IkConstraint): void { + var target:Bone = constraint.target; + sortBone(target); + + var constrained:Vector. = constraint.bones; + var parent:Bone = constrained[0]; + sortBone(parent); + + if (constrained.length > 1) { + var child:Bone = constrained[constrained.length - 1]; + if (!(_updateCache.indexOf(child) > -1)) _updateCacheReset.push(child); + } + + _updateCache.push(constraint); + + sortReset(parent.children); + constrained[constrained.length - 1]._sorted = true; + } + + private function sortPathConstraint (constraint:PathConstraint): void { + var slot:Slot = constraint.target; + var slotIndex:Number = slot.data.index; + var slotBone:Bone = slot.bone; + if (skin != null) sortPathConstraintAttachment(skin, slotIndex, slotBone); + if (data.defaultSkin != null && data.defaultSkin != skin) + sortPathConstraintAttachment(data.defaultSkin, slotIndex, slotBone); + var ii:Number = 0; + var nn:Number = 0; + for (ii = 0, nn = data.skins.length; ii < nn; ii++) + sortPathConstraintAttachment(data.skins[ii], slotIndex, slotBone); + + var attachment:Attachment = slot.attachment; + if (attachment is PathAttachment) sortPathConstraintAttachment2(attachment, slotBone); + + var constrained:Vector. = constraint.bones; + var boneCount:Number = constrained.length; + for (ii = 0; ii < boneCount; ii++) + sortBone(constrained[ii]); + + _updateCache.push(constraint); + + for (ii = 0; ii < boneCount; ii++) + sortReset(constrained[ii].children); + for (ii = 0; ii < boneCount; ii++) + constrained[ii]._sorted = true; + } + + private function sortTransformConstraint (constraint:TransformConstraint): void { + sortBone(constraint.target); + + var constrained:Vector. = constraint.bones; + var boneCount:Number = constrained.length; + var ii:Number = 0; + for (ii = 0; ii < boneCount; ii++) + sortBone(constrained[ii]); + + _updateCache.push(constraint); + + for (ii = 0; ii < boneCount; ii++) + sortReset(constrained[ii].children); + for (ii = 0; ii < boneCount; ii++) + constrained[ii]._sorted = true; + } + private function sortPathConstraintAttachment (skin:Skin, slotIndex:int, slotBone:Bone) : void { var dict:Dictionary = skin.attachments[slotIndex]; if (!dict) return; @@ -240,6 +249,17 @@ public class Skeleton { /** Updates the world transform for each bone and applies constraints. */ public function updateWorldTransform () : void { + var updateCacheReset:Vector. = this._updateCacheReset; + for each (var bone:Bone in updateCacheReset) { + 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; + bone.appliedValid = true; + } for each (var updatable:Updatable in _updateCache) updatable.update(); } diff --git a/spine-as3/spine-as3/src/spine/SkeletonData.as b/spine-as3/spine-as3/src/spine/SkeletonData.as index af7e85d0f..152397393 100644 --- a/spine-as3/spine-as3/src/spine/SkeletonData.as +++ b/spine-as3/spine-as3/src/spine/SkeletonData.as @@ -46,6 +46,9 @@ public class SkeletonData { public var width:Number, height:Number; public var version:String, hash:String; + public var fps:Number; + public var imagesPath:String; + public function SkeletonData () { } diff --git a/spine-as3/spine-as3/src/spine/SkeletonJson.as b/spine-as3/spine-as3/src/spine/SkeletonJson.as index 56683ea3d..4f9c3aa5f 100644 --- a/spine-as3/spine-as3/src/spine/SkeletonJson.as +++ b/spine-as3/spine-as3/src/spine/SkeletonJson.as @@ -89,7 +89,9 @@ public class SkeletonJson { skeletonData.hash = skeletonMap["hash"]; skeletonData.version = skeletonMap["spine"]; skeletonData.width = skeletonMap["width"] || 0; - skeletonData.height = skeletonMap["height"] || 0; + skeletonData.height = skeletonMap["height"] || 0; + skeletonData.fps = skeletonMap["fps"] || 0; + skeletonData.imagesPath = skeletonMap["images"]; } // Bones. @@ -110,8 +112,7 @@ public class SkeletonJson { boneData.scaleY = boneMap.hasOwnProperty("scaleY") ? boneMap["scaleY"] : 1; boneData.shearX = Number(boneMap["shearX"] || 0); boneData.shearY = Number(boneMap["shearY"] || 0); - boneData.inheritRotation = boneMap.hasOwnProperty("inheritRotation") ? Boolean(boneMap["inheritRotation"]) : true; - boneData.inheritScale = boneMap.hasOwnProperty("inheritScale") ? Boolean(boneMap["inheritScale"]) : true; + boneData.transformMode = TransformMode[boneMap["transform"] || "normal"]; skeletonData.bones.push(boneData); } @@ -139,6 +140,7 @@ public class SkeletonJson { // IK constraints. for each (var constraintMap:Object in root["ik"]) { var ikConstraintData:IkConstraintData = new IkConstraintData(constraintMap["name"]); + ikConstraintData.order = constraintMap["order"] || 0; for each (boneName in constraintMap["bones"]) { var bone:BoneData = skeletonData.findBone(boneName); @@ -158,6 +160,7 @@ public class SkeletonJson { // Transform constraints. for each (constraintMap in root["transform"]) { var transformConstraintData:TransformConstraintData = new TransformConstraintData(constraintMap["name"]); + transformConstraintData.order = constraintMap["order"] || 0; for each (boneName in constraintMap["bones"]) { bone = skeletonData.findBone(boneName); @@ -186,6 +189,7 @@ public class SkeletonJson { // Path constraints. for each (constraintMap in root["path"]) { var pathConstraintData:PathConstraintData = new PathConstraintData(constraintMap["name"]); + pathConstraintData.order = constraintMap["order"] || 0; for each (boneName in constraintMap["bones"]) { bone = skeletonData.findBone(boneName); diff --git a/spine-as3/spine-as3/src/spine/TransformConstraint.as b/spine-as3/spine-as3/src/spine/TransformConstraint.as index 0819358af..a5e40ebba 100644 --- a/spine-as3/spine-as3/src/spine/TransformConstraint.as +++ b/spine-as3/spine-as3/src/spine/TransformConstraint.as @@ -30,7 +30,7 @@ package spine { -public class TransformConstraint implements Updatable { +public class TransformConstraint implements Constraint { internal var _data:TransformConstraintData; internal var _bones:Vector.; public var target:Bone; @@ -65,8 +65,9 @@ public class TransformConstraint implements Updatable { var bones:Vector. = this._bones; for (var i:int = 0, n:int = bones.length; i < n; i++) { var bone:Bone = bones[i]; + var modified:Boolean = false; - if (rotateMix > 0) { + if (rotateMix != 0) { var a:Number = bone.a, b:Number = bone.b, c:Number = bone.c, d:Number = bone.d; var r:Number = Math.atan2(tc, ta) - Math.atan2(c, a) + data.offsetRotation * MathUtils.degRad; if (r > Math.PI) @@ -78,27 +79,30 @@ public class TransformConstraint implements Updatable { bone._b = cos * b - sin * d; bone._c = sin * a + cos * c; bone._d = sin * b + cos * d; + modified = true; } - if (translateMix > 0) { + if (translateMix != 0) { _temp[0] = data.offsetX; _temp[1] = data.offsetY; target.localToWorld(_temp); bone._worldX += (_temp[0] - bone.worldX) * translateMix; bone._worldY += (_temp[1] - bone.worldY) * translateMix; + modified = true; } if (scaleMix > 0) { - var bs:Number = Math.sqrt(bone.a * bone.a + bone.c * bone.c); + var s:Number = Math.sqrt(bone.a * bone.a + bone.c * bone.c); var ts:Number = Math.sqrt(ta * ta + tc * tc); - var s:Number = bs > 0.00001 ? (bs + (ts - bs + data.offsetScaleX) * scaleMix) / bs : 0; + if (s > 0.00001) s = (s + (ts - s + data.offsetScaleX) * scaleMix) / s; bone._a *= s; bone._c *= s; - bs = Math.sqrt(bone.b * bone.b + bone.d * bone.d); + s = Math.sqrt(bone.b * bone.b + bone.d * bone.d); ts = Math.sqrt(tb * tb + td * td); - s = bs > 0.00001 ? (bs + (ts - bs + data.offsetScaleY) * scaleMix) / bs : 0; + if (s > 0.00001) s = (s + (ts - s + data.offsetScaleY) * scaleMix) / s; bone._b *= s; bone._d *= s; + modified = true; } if (shearMix > 0) { @@ -112,9 +116,16 @@ public class TransformConstraint implements Updatable { s = Math.sqrt(b * b + d * d); bone._b = Math.cos(r) * s; bone._d = Math.sin(r) * s; + modified = true; } + + if (modified) bone.appliedValid = false; } } + + public function getOrder () : Number { + return _data.order; + } public function get data () : TransformConstraintData { return _data; diff --git a/spine-as3/spine-as3/src/spine/TransformConstraintData.as b/spine-as3/spine-as3/src/spine/TransformConstraintData.as index a9f36fd5f..52fdb9d2b 100644 --- a/spine-as3/spine-as3/src/spine/TransformConstraintData.as +++ b/spine-as3/spine-as3/src/spine/TransformConstraintData.as @@ -32,6 +32,7 @@ package spine { public class TransformConstraintData { internal var _name:String; + public var order:Number; internal var _bones:Vector. = new Vector.(); public var target:BoneData; public var rotateMix:Number; diff --git a/spine-as3/spine-as3/src/spine/TransformMode.as b/spine-as3/spine-as3/src/spine/TransformMode.as new file mode 100644 index 000000000..55a098015 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/TransformMode.as @@ -0,0 +1,41 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "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 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. + *****************************************************************************/ + +package spine { + +public class TransformMode { + public static const normal:TransformMode = new TransformMode(); + public static const onlyTranslation:TransformMode = new TransformMode(); + public static const noRotationOrReflection:TransformMode = new TransformMode(); + public static const noScale:TransformMode = new TransformMode(); + public static const noScaleOrReflection:TransformMode = new TransformMode(); +} + +} diff --git a/spine-as3/spine-as3/src/spine/attachments/VertexAttachment.as b/spine-as3/spine-as3/src/spine/attachments/VertexAttachment.as index 01c879e4c..2193558d8 100644 --- a/spine-as3/spine-as3/src/spine/attachments/VertexAttachment.as +++ b/spine-as3/spine-as3/src/spine/attachments/VertexAttachment.as @@ -53,8 +53,7 @@ public dynamic class VertexAttachment extends Attachment { * @param offset The worldVertices index to begin writing values. */ public function computeWorldVertices2 (slot:Slot, start:int, count:int, worldVertices:Vector., offset:int): void { count += offset; - var skeleton:Skeleton = slot.skeleton; - var x:Number = skeleton.x, y:Number = skeleton.y; + var skeleton:Skeleton = slot.skeleton; var deformArray:Vector. = slot.attachmentVertices; var vertices:Vector. = this.vertices; var bones:Vector. = this.bones; @@ -68,8 +67,8 @@ public dynamic class VertexAttachment extends Attachment { if (bones == null) { if (deformArray.length > 0) vertices = deformArray; bone = slot.bone; - x += bone.worldX; - y += bone.worldY; + var x:Number = bone.worldX; + var y:Number = bone.worldY; var a:Number = bone.a, bb:Number = bone.b, c:Number = bone.c, d:Number = bone.d; for (v = start, w = offset; w < count; v += 2, w += 2) { vx = vertices[v], vy = vertices[v + 1]; @@ -87,7 +86,7 @@ public dynamic class VertexAttachment extends Attachment { var skeletonBones:Vector. = skeleton.bones; if (deformArray.length == 0) { for (w = offset, b = skip * 3; w < count; w += 2) { - wx = x, wy = y; + wx = 0, wy = 0; n = bones[v++]; n += v; for (; v < n; v++, b += 3) { @@ -102,7 +101,7 @@ public dynamic class VertexAttachment extends Attachment { } else { deform = deformArray; for (w = offset, b = skip * 3, f = skip << 1; w < count; w += 2) { - wx = x; wy = y; + wx = 0; wy = 0; n = bones[v++]; n += v; for (; v < n; v++, b += 3, f += 2) { diff --git a/spine-starling/spine-starling-example/src/spine/examples/Main.as b/spine-starling/spine-starling-example/src/spine/examples/Main.as index b285720a8..838669a84 100644 --- a/spine-starling/spine-starling-example/src/spine/examples/Main.as +++ b/spine-starling/spine-starling-example/src/spine/examples/Main.as @@ -43,8 +43,9 @@ public class Main extends Sprite { // example = SpineboyExample; // example = GoblinsExample; // example = RaptorExample; - example = TankExample; + // example = TankExample; // example = VineExample; + example = StretchymanExample; _starling = new Starling(example, stage); _starling.enableErrorChecking = true; diff --git a/spine-starling/spine-starling-example/src/spine/examples/StretchymanExample.as b/spine-starling/spine-starling-example/src/spine/examples/StretchymanExample.as new file mode 100644 index 000000000..deb312e61 --- /dev/null +++ b/spine-starling/spine-starling-example/src/spine/examples/StretchymanExample.as @@ -0,0 +1,94 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "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 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. + *****************************************************************************/ + +package spine.examples { +import spine.animation.AnimationStateData; +import spine.*; +import spine.atlas.Atlas; +import spine.attachments.AtlasAttachmentLoader; +import spine.attachments.AttachmentLoader; +import spine.starling.SkeletonAnimation; +import spine.starling.StarlingTextureLoader; + +import starling.core.Starling; +import starling.display.Sprite; +import starling.events.Touch; +import starling.events.TouchEvent; +import starling.events.TouchPhase; + +public class StretchymanExample extends Sprite { + [Embed(source = "/stretchyman.json", mimeType = "application/octet-stream")] + static public const StretchymanJson:Class; + + [Embed(source = "/stretchyman.atlas", mimeType = "application/octet-stream")] + static public const StretchymanAtlas:Class; + + [Embed(source = "/stretchyman.png")] + static public const StretchymanAtlasTexture:Class; + + private var skeleton:SkeletonAnimation; + + public function StretchymanExample () { + var spineAtlas:Atlas = new Atlas(new StretchymanAtlas(), new StarlingTextureLoader(new StretchymanAtlasTexture())); + var attachmentLoader:AttachmentLoader = new AtlasAttachmentLoader(spineAtlas); + var json:SkeletonJson = new SkeletonJson(attachmentLoader); + json.scale = 0.4; + var skeletonData:SkeletonData = json.readSkeletonData(new StretchymanJson()); + + var stateData:AnimationStateData = new AnimationStateData(skeletonData); + + skeleton = new SkeletonAnimation(skeletonData, stateData); + skeleton.x = 100; + skeleton.y = 560; + + skeleton.state.timeScale = 0.1; + + skeleton.state.onStart.add(function (trackIndex:int) : void { + trace(trackIndex + " start: " + skeleton.state.getCurrent(trackIndex)); + }); + skeleton.state.onEnd.add(function (trackIndex:int) : void { + trace(trackIndex + " end: " + skeleton.state.getCurrent(trackIndex)); + }); + skeleton.state.onComplete.add(function (trackIndex:int, count:int) : void { + trace(trackIndex + " complete: " + skeleton.state.getCurrent(trackIndex) + ", " + count); + }); + skeleton.state.onEvent.add(function (trackIndex:int, event:Event) : void { + trace(trackIndex + " event: " + skeleton.state.getCurrent(trackIndex) + ", " + + event.data.name + ": " + event.intValue + ", " + event.floatValue + ", " + event.stringValue); + }); + + skeleton.skeleton.setToSetupPose(); + skeleton.state.setAnimationByName(0, "sneak", true); + + addChild(skeleton); + Starling.juggler.add(skeleton); + } +} +} diff --git a/spine-starling/spine-starling-example/src/stretchyman.atlas b/spine-starling/spine-starling-example/src/stretchyman.atlas new file mode 100644 index 000000000..b9072157f --- /dev/null +++ b/spine-starling/spine-starling-example/src/stretchyman.atlas @@ -0,0 +1,41 @@ + +stretchyman.png +size: 1024,256 +format: RGBA8888 +filter: Linear,Linear +repeat: none +back arm + rotate: true + xy: 679, 173 + size: 72, 202 + orig: 72, 202 + offset: 0, 0 + index: -1 +back leg + rotate: true + xy: 2, 2 + size: 100, 318 + orig: 100, 318 + offset: 0, 0 + index: -1 +body + rotate: true + xy: 2, 104 + size: 141, 452 + orig: 141, 452 + offset: 0, 0 + index: -1 +front arm + rotate: true + xy: 456, 100 + size: 145, 221 + orig: 145, 221 + offset: 0, 0 + index: -1 +head + rotate: true + xy: 322, 15 + size: 87, 102 + orig: 87, 102 + offset: 0, 0 + index: -1 diff --git a/spine-starling/spine-starling-example/src/stretchyman.json b/spine-starling/spine-starling-example/src/stretchyman.json new file mode 100644 index 000000000..1f852d0f2 --- /dev/null +++ b/spine-starling/spine-starling-example/src/stretchyman.json @@ -0,0 +1,773 @@ +{ +"skeleton": { + "hash": "+XkMq22e5sbHEXz5aRmd8uvTvH0", + "spine": "3.5.03-beta", + "width": 264.48, + "height": 570.1, + "fps": 30, + "images": "./images/" +}, +"bones": [ + { "name": "root" }, + { "name": "hip", "parent": "root", "x": 28.61, "y": 289.9 }, + { "name": "spine 1", "parent": "hip", "length": 34.66, "rotation": 86.68, "x": -4.48, "y": 12.66 }, + { "name": "spine 2", "parent": "spine 1", "length": 41.41, "rotation": 16.47, "x": 34.66 }, + { "name": "spine 3", "parent": "spine 2", "length": 34.44, "rotation": 16.17, "x": 41.41 }, + { "name": "spine 4", "parent": "spine 3", "length": 37.53, "rotation": -13.63, "x": 34.44 }, + { "name": "back arm 1", "parent": "spine 4", "length": 32.43, "rotation": -154.35, "x": 15.99, "y": -4.58, "transform": "noScale" }, + { "name": "back arm 2", "parent": "back arm 1", "length": 34.16, "rotation": 3.1, "x": 31.88, "y": 0.02 }, + { "name": "back arm 3", "parent": "back arm 2", "length": 31.26, "rotation": 9.59, "x": 34.16 }, + { "name": "back arm 4", "parent": "back arm 3", "length": 33.3, "rotation": 14.6, "x": 32.03, "y": 0.81 }, + { "name": "back arm 5", "parent": "back arm 4", "length": 37.41, "rotation": 11.3, "x": 33.81, "y": 0.02 }, + { + "name": "back foot 1", + "parent": "hip", + "length": 33.23, + "rotation": -6.55, + "x": -34, + "y": -279.68, + "transform": "onlyTranslation" + }, + { "name": "back foot 2", "parent": "back foot 1", "length": 32.28, "rotation": 4.34, "x": 33.23, "transform": "noScale" }, + { "name": "back foot 3", "parent": "back foot 2", "length": 15.87, "rotation": 10.06, "x": 32.28, "transform": "noScale" }, + { "name": "back leg 1", "parent": "hip", "length": 41, "rotation": -83.65, "x": 10.4, "y": 1.04, "color": "abe323ff" }, + { "name": "back leg 2", "parent": "back leg 1", "length": 41, "rotation": -4.07, "x": 34.56, "color": "abe323ff" }, + { "name": "back leg 3", "parent": "back leg 1", "length": 41, "rotation": -5.24, "x": 81.78, "y": -2.29, "color": "abe323ff" }, + { "name": "back leg 4", "parent": "back leg 1", "length": 41, "rotation": -16.6, "x": 121.2, "y": -11.27, "color": "abe323ff" }, + { "name": "back leg 5", "parent": "back leg 1", "length": 41, "rotation": -32.35, "x": 160.15, "y": -24.85, "color": "abe323ff" }, + { "name": "back leg 6", "parent": "back leg 1", "length": 41, "rotation": -30.76, "x": 197.04, "y": -39.98, "color": "abe323ff" }, + { "name": "back leg 7", "parent": "back leg 1", "length": 41, "rotation": -30.63, "x": 233.18, "y": -57.32, "color": "abe323ff" }, + { "name": "back leg 8", "parent": "back leg 1", "length": 41, "rotation": -33.78, "x": 267.28, "y": -77.39, "color": "abe323ff" }, + { "name": "back leg IK target", "parent": "root", "x": 46.15, "y": 8.68, "color": "ff3f00ff" }, + { "name": "back leg IK 1", "parent": "hip", "length": 140.17, "rotation": -88.1, "x": 9.62, "y": -0.38 }, + { "name": "back leg IK 2", "parent": "back leg IK 1", "length": 148.96, "rotation": -21.32, "x": 140.17 }, + { "name": "belly", "parent": "spine 1", "x": 35.94, "y": -37.69 }, + { "name": "butt", "parent": "hip", "x": -32.67, "y": -1.87 }, + { "name": "front arm 1", "parent": "spine 4", "length": 38.33, "rotation": 118.58, "x": 27.12, "y": 4.89, "transform": "noScale" }, + { "name": "front arm 2", "parent": "front arm 1", "length": 35.66, "rotation": -0.43, "x": 38.33 }, + { "name": "front arm 3", "parent": "front arm 2", "length": 32.65, "rotation": 14.45, "x": 35.66, "y": -0.01 }, + { "name": "front arm 4", "parent": "front arm 3", "length": 29.18, "rotation": 13.89, "x": 32.65 }, + { "name": "front arm 5", "parent": "front arm 4", "length": 46.32, "rotation": 16.09, "x": 29.18, "transform": "noScale" }, + { + "name": "front foot 1", + "parent": "hip", + "length": 26.29, + "rotation": -10.97, + "x": -77.04, + "y": -285.03, + "transform": "onlyTranslation" + }, + { "name": "front foot 2", "parent": "front foot 1", "length": 29.11, "rotation": 9.6, "x": 26.29 }, + { "name": "front foot 3", "parent": "front foot 2", "length": 23.48, "rotation": 8.91, "x": 29.11 }, + { "name": "front leg 1", "parent": "hip", "length": 37.2, "rotation": -88.96, "x": -23.56, "y": -1.99, "color": "abe323ff" }, + { "name": "front leg 2", "parent": "front leg 1", "length": 37.2, "rotation": 3.45, "x": 33.74, "color": "abe323ff" }, + { "name": "front leg 3", "parent": "front leg 1", "length": 37.2, "rotation": -6.11, "x": 74.4, "y": -1.07, "color": "abe323ff" }, + { + "name": "front leg 4", + "parent": "front leg 1", + "length": 37.2, + "rotation": -10.01, + "x": 111.39, + "y": -5.27, + "color": "abe323ff" + }, + { + "name": "front leg 5", + "parent": "front leg 1", + "length": 37.2, + "rotation": -28.39, + "x": 147.76, + "y": -14.98, + "color": "abe323ff" + }, + { + "name": "front leg 6", + "parent": "front leg 1", + "length": 37.2, + "rotation": -24.33, + "x": 182.41, + "y": -27.57, + "color": "abe323ff" + }, + { + "name": "front leg 7", + "parent": "front leg 1", + "length": 37.2, + "rotation": -22.99, + "x": 216.43, + "y": -42.55, + "color": "abe323ff" + }, + { "name": "front leg 8", "parent": "front leg 1", "length": 37.2, "rotation": -31.8, "x": 248.6, "y": -61.02, "color": "abe323ff" }, + { "name": "front leg IK target", "parent": "root", "x": -37.73, "y": 5.03, "color": "ff3f00ff" }, + { "name": "front leg IK 1", "parent": "hip", "length": 140.66, "rotation": -89.23, "x": -23.98, "y": 1.88 }, + { "name": "front leg IK 2", "parent": "front leg IK 1", "length": 155.95, "rotation": -21.49, "x": 140.66, "y": 0.02 }, + { "name": "neck 1", "parent": "spine 4", "length": 13.45, "rotation": -30.66, "x": 38.96, "y": -0.83 }, + { "name": "neck 2", "parent": "neck 1", "length": 14.13, "rotation": -11.41, "x": 13.45 }, + { "name": "head", "parent": "neck 2", "length": 89.05, "rotation": 6.98, "x": 15.81, "y": 0.22, "transform": "noScale" } +], +"slots": [ + { "name": "back arm", "bone": "root", "attachment": "back arm" }, + { "name": "back leg", "bone": "root", "attachment": "back leg" }, + { "name": "body", "bone": "root", "attachment": "body" }, + { "name": "head", "bone": "head", "attachment": "head" }, + { "name": "front arm", "bone": "root", "attachment": "front arm" }, + { "name": "back leg path", "bone": "hip", "attachment": "back leg path" }, + { "name": "front leg path", "bone": "hip", "attachment": "front leg path" } +], +"ik": [ + { + "name": "back leg IK", + "order": 0, + "bones": [ "back leg IK 1", "back leg IK 2" ], + "target": "back leg IK target", + "bendPositive": false + }, + { + "name": "front leg IK", + "order": 1, + "bones": [ "front leg IK 1", "front leg IK 2" ], + "target": "front leg IK target", + "bendPositive": false + } +], +"transform": [ + { + "name": "back foot position", + "order": 4, + "bones": [ "back foot 1" ], + "target": "back leg 8", + "rotation": 108.8, + "x": 41.2, + "y": -0.02, + "scaleX": 4.0E-4, + "scaleY": -3.0E-4, + "shearY": 0.1, + "rotateMix": 0, + "scaleMix": 0 + }, + { + "name": "front foot position", + "order": 5, + "bones": [ "front foot 1" ], + "target": "front leg 8", + "rotation": 101.55, + "x": 38.92, + "y": -0.02, + "scaleX": 4.0E-4, + "scaleY": -2.0E-4, + "shearY": 0.1, + "rotateMix": 0, + "scaleMix": 0 + } +], +"path": [ + { + "name": "back leg path", + "order": 2, + "bones": [ "back leg 1", "back leg 2", "back leg 3", "back leg 4", "back leg 5", "back leg 6", "back leg 7", "back leg 8" ], + "target": "back leg path", + "spacingMode": "percent", + "rotateMode": "chainScale", + "spacing": 0.125 + }, + { + "name": "front leg path", + "order": 3, + "bones": [ "front leg 1", "front leg 2", "front leg 3", "front leg 4", "front leg 5", "front leg 6", "front leg 7", "front leg 8" ], + "target": "front leg path", + "spacingMode": "percent", + "rotateMode": "chainScale", + "spacing": 0.125 + } +], +"skins": { + "default": { + "back arm": { + "back arm": { + "type": "mesh", + "uvs": [ 0.74522, 0.00989, 0.64111, 0.05762, 0.56303, 0.1559, 0.42508, 0.25885, 0.28974, 0.359, 0.22988, 0.49565, 0.21166, 0.60796, 0.21166, 0.69782, 0.16481, 0.78673, 0.14138, 0.84757, 0.02426, 0.88501, 0.05289, 0.9187, 0.37823, 0.98796, 0.60467, 0.98235, 0.6307, 0.9056, 0.73481, 0.87752, 0.6359, 0.81762, 0.55262, 0.74181, 0.38084, 0.69875, 0.37823, 0.60796, 0.39905, 0.50875, 0.51358, 0.38521, 0.66193, 0.2888, 0.85453, 0.18397, 0.97686, 0.0754, 0.9144, 0.00989 ], + "triangles": [ 11, 9, 12, 9, 8, 12, 12, 8, 18, 13, 12, 14, 12, 18, 17, 18, 8, 7, 14, 12, 17, 11, 10, 9, 14, 16, 15, 14, 17, 16, 7, 19, 18, 7, 6, 19, 6, 5, 19, 19, 5, 20, 5, 4, 20, 20, 4, 21, 4, 3, 21, 21, 3, 22, 3, 2, 22, 22, 2, 23, 2, 1, 23, 23, 1, 24, 1, 0, 24, 0, 25, 24 ], + "vertices": [ 1, 6, -7.67999, -11.47999, 1, 1, 6, 4.07999, -13.61999, 1, 1, 6, 23.47999, -9.35, 1, 1, 7, 13.43999, -9.22999, 1, 2, 7, 35.2, -9.61999, 0.50648, 8, -0.56999, -9.64999, 0.49349, 1, 8, 26.03, -6.38, 1, 1, 9, 14.14999, -6.11, 1, 2, 9, 31.53, -5.55999, 0.66491, 10, -3.32999, -5.03, 0.33507, 1, 10, 13.07999, -11.25, 1, 1, 10, 24.40999, -14.88, 1, 1, 10, 30.14999, -24.51, 1, 1, 10, 36.93, -23.53, 1, 1, 10, 54.06999, -2.32999, 1, 1, 10, 55.72999, 14.14, 1, 1, 10, 41.38999, 18.46999, 1, 1, 10, 37.27999, 26.87, 1, 1, 10, 24.64999, 21.67, 1, 1, 10, 9.17, 18.1, 1, 2, 9, 31.32999, 6.76999, 0.47879, 10, -1.11, 7.11, 0.52118, 1, 9, 13.77, 6.03999, 1, 2, 8, 24.97999, 6.17, 0.89217, 9, -5.46999, 6.96, 0.10781, 2, 7, 32.59999, 7.28, 0.59842, 8, -0.31999, 7.44, 0.40156, 1, 7, 11.06999, 8.84, 1, 1, 6, 17.88999, 11.86999, 1, 1, 6, -4.82, 9.44999, 1, 1, 6, -13.68, -0.68999, 1 ], + "hull": 26, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 32, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 46, 48, 48, 50, 0, 50, 2, 48, 4, 46, 6, 44, 8, 42, 10, 40, 12, 38, 14, 36 ], + "width": 72, + "height": 202 + } + }, + "back leg": { + "back leg": { + "type": "mesh", + "uvs": [ 0.502, 0.01179, 0.36075, 0.06379, 0.40569, 0.15045, 0.44743, 0.23916, 0.47953, 0.3299, 0.51163, 0.42268, 0.52126, 0.50629, 0.48274, 0.58888, 0.41211, 0.66025, 0.3126, 0.74182, 0.21629, 0.81625, 0.1232, 0.89272, 0.00763, 0.97428, 0.29655, 0.98958, 0.47407, 0.99221, 0.64004, 0.99467, 0.80988, 0.9896, 0.91291, 0.98652, 1, 0.95797, 0.83329, 0.94681, 0.71066, 0.9386, 0.57122, 0.9203, 0.41532, 0.89985, 0.3447, 0.89272, 0.36885, 0.87177, 0.42816, 0.82032, 0.502, 0.74793, 0.58225, 0.66942, 0.6593, 0.59092, 0.72992, 0.50527, 0.76524, 0.42166, 0.78129, 0.3248, 0.78771, 0.23406, 0.78771, 0.13924, 0.7235, 0.03728, 0.60152, 0.00567, 0.82116, 0.96897, 0.67872, 0.96396, 0.52111, 0.95739, 0.35935, 0.94213, 0.19388, 0.92921, 0.25375, 0.88158, 0.32792, 0.81839 ], + "triangles": [ 36, 20, 19, 17, 19, 18, 16, 37, 36, 17, 16, 36, 17, 36, 19, 38, 22, 21, 37, 21, 20, 38, 21, 37, 37, 20, 36, 15, 38, 37, 14, 38, 15, 15, 37, 16, 39, 23, 22, 40, 23, 39, 39, 22, 38, 13, 40, 39, 12, 40, 13, 14, 39, 38, 13, 39, 14, 9, 8, 26, 25, 42, 9, 10, 9, 42, 26, 25, 9, 24, 42, 25, 41, 10, 42, 41, 42, 24, 11, 10, 41, 23, 41, 24, 40, 11, 41, 40, 41, 23, 12, 11, 40, 26, 8, 27, 6, 5, 29, 28, 6, 29, 7, 6, 28, 27, 7, 28, 8, 7, 27, 29, 5, 30, 31, 5, 4, 30, 5, 31, 32, 4, 3, 31, 4, 32, 34, 1, 0, 34, 0, 35, 2, 1, 34, 2, 34, 33, 3, 2, 33, 32, 3, 33 ], + "vertices": [ 1, 14, -19.79, -5.65999, 1, 2, 14, -5.61, -22.28, 0.83363, 15, -41.06, -23.29999, 0.16636, 2, 14, 22.30999, -21.97999, 0.65187, 15, -13.17, -21.87999, 0.34812, 3, 14, 50.83, -22.1, 0.3172, 15, 15.32999, -20.86, 0.43086, 16, -19.67, -21.07999, 0.25192, 4, 14, 79.83999, -23.28, 0.1079, 15, 44.36999, -20.87999, 0.35416, 16, 9.3, -19.19, 0.31918, 17, -25.20999, -20.05999, 0.21871, 4, 15, 74.05, -20.97999, 0.16484, 16, 38.93, -17.34, 0.32776, 17, 4.09, -15.38, 0.29829, 18, -30.1, -17.14999, 0.20906, 3, 16, 65.52999, -17.61, 0.17521, 17, 30.6, -13.1, 0.39171, 18, -4.11, -11.42, 0.43303, 3, 17, 57.02999, -15.71, 0.19717, 18, 22.42, -10.52999, 0.52969, 19, -12.96, -9.8, 0.27311, 3, 18, 46.04, -13.46, 0.4099, 19, 10.82999, -10.17, 0.34746, 20, -24.93, -10.51, 0.2426, 3, 18, 73.37999, -18.69, 0.19431, 19, 38.58, -12.40999, 0.37176, 20, 2.89, -10.97999, 0.43389, 3, 19, 64.05999, -14.97999, 0.16663, 20, 28.47999, -11.93999, 0.56755, 21, -7.51999, -11.47999, 0.26578, 3, 20, 54.56999, -12.35999, 0.52113, 21, 18.54999, -10.93, 0.36166, 11, -3.07999, 24.95, 0.11716, 4, 20, 82.97, -14.35, 0.35144, 21, 47, -11.85999, 0.29521, 11, -13.06, -1.66999, 0.25117, 12, -46.29, 1.83, 0.10215, 1, 11, 16.36, -4.67, 1, 2, 11, 34.31, -4.36, 0.53486, 12, 0.74, -4.42999, 0.46513, 3, 11, 51.09, -4.07999, 0.14609, 12, 17.48999, -5.42, 0.54313, 13, -15.5, -2.75, 0.31075, 2, 12, 34.66999, -4.01, 0.40713, 13, 1.63999, -4.36, 0.59285, 2, 12, 45.08, -3.15, 0.25725, 13, 12.05, -5.34, 0.74273, 2, 12, 53.97999, 5.80999, 0.2531, 13, 22.37999, 1.92999, 0.74687, 2, 12, 37.18999, 9.56, 0.4029, 13, 6.5, 8.56, 0.59709, 3, 11, 57.06999, 14.15999, 0.1335, 12, 24.82999, 12.31999, 0.54644, 13, -5.17999, 13.43999, 0.32003, 4, 20, 47.09, 33.09999, 0.13131, 11, 42.63999, 19.06999, 0.26348, 12, 10.81, 18.30999, 0.49744, 13, -17.93, 21.78, 0.10773, 4, 20, 46.45, 16.09, 0.21157, 21, 9.35999, 17.2, 0.10678, 11, 26.5, 24.55999, 0.44949, 12, -4.84999, 25, 0.23209, 3, 20, 46.79999, 8.61999, 0.4011, 21, 9.98999, 9.75, 0.24542, 11, 19.23999, 26.37, 0.35346, 3, 20, 39.7, 8.6, 0.58249, 21, 2.9, 9.47, 0.3079, 11, 21.25, 33.16999, 0.10958, 3, 19, 59.15999, 5.88, 0.21953, 20, 22.27, 8.57999, 0.57946, 21, -14.51, 8.78999, 0.20099, 3, 18, 71.83, 0.46999, 0.21582, 19, 34.95999, 6.46999, 0.32262, 20, -1.91999, 7.61999, 0.46154, 3, 18, 45.79999, 3.95, 0.40553, 19, 8.69999, 7.11999, 0.386, 20, -28.15999, 6.61, 0.20844, 3, 17, 56.77999, 2.13, 0.25409, 18, 19.82999, 7.11999, 0.53004, 19, -17.45, 7.46, 0.21583, 3, 16, 66.18, 3.45, 0.22413, 17, 29.21999, 7.92, 0.34134, 18, -8.25, 9.23999, 0.4345, 4, 15, 76.59999, 4.5, 0.19362, 16, 39.77999, 8.26, 0.28885, 17, 2.48, 10.18, 0.33579, 18, -35.04999, 7.96999, 0.1817, 4, 14, 82.87999, 7.07999, 0.11658, 15, 46.16999, 9.56999, 0.35727, 16, 9.07999, 11.31999, 0.35745, 17, -28.35, 10.28999, 0.16868, 3, 14, 54.45, 12.1, 0.35356, 15, 17.56999, 13.46, 0.44494, 16, -19.70999, 13.31, 0.20148, 2, 14, 24.64999, 16.69, 0.65438, 15, -12.39, 16.85, 0.3456, 2, 14, -8.38, 15.21, 0.85329, 15, -45.34, 14.03999, 0.14668, 1, 14, -20.18, 4.55999, 1, 2, 12, 35.88, 2.52999, 0.40509, 13, 3.98, 1.86, 0.5949, 3, 11, 54.36999, 5.90999, 0.1392, 12, 21.51, 4.28999, 0.54493, 13, -9.85, 6.11, 0.31584, 2, 11, 37.77999, 7.63, 0.44938, 12, 5.09999, 7.26, 0.55061, 3, 20, 65.37999, 20.69, 0.11856, 11, 20.59, 11.34, 0.75133, 12, -11.76, 12.27, 0.13007, 3, 20, 65.41, 1.80999, 0.39678, 21, 24.29999, 0.23, 0.28257, 11, 2.05999, 14.97, 0.32062, 3, 20, 48, 0.07, 0.55395, 21, 6.92999, -0.31999, 0.33292, 11, 3.36999, 30.46999, 0.1131, 3, 19, 65.94999, -2.96, 0.19447, 20, 24.95, -1.57, 0.57381, 21, -15.98999, -0.41999, 0.2317 ], + "hull": 36, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 34, 36, 44, 46, 50, 52, 52, 54, 54, 56, 56, 58, 58, 60, 60, 62, 62, 64, 64, 66, 66, 68, 68, 70, 0, 70, 4, 66, 2, 68, 40, 42, 42, 44, 26, 28, 28, 30, 46, 48, 48, 50, 36, 38, 38, 40, 30, 32, 32, 34, 18, 52, 16, 54, 14, 56, 12, 58, 10, 60, 8, 62, 6, 64, 32, 72, 72, 38, 30, 74, 74, 40, 72, 74, 28, 76, 76, 42, 74, 76, 26, 78, 78, 44, 76, 78, 24, 80, 80, 46, 78, 80, 22, 82, 82, 48, 80, 82, 20, 84, 84, 50, 82, 84 ], + "width": 100, + "height": 318 + } + }, + "back leg path": { + "back leg path": { + "type": "path", + "lengths": [ 137.82, 291.73, 641.11 ], + "vertexCount": 9, + "vertices": [ 1, 23, -43.13999, 0.61, 1, 1, 23, -1.30999, 0.43, 1, 1, 23, 63.06999, -0.18, 1, 2, 23, 72.06999, 13.64999, 0.5, 24, -69.11, -16.06999, 0.5, 2, 23, 135.74, 0.27, 0.5, 24, -3.96, -2.01999, 0.5, 2, 23, 202.91998, -15.13, 0.5, 24, 65, 14.09, 0.5, 1, 24, 71.08999, -2.02999, 1, 1, 24, 149.06, -1.74, 1, 1, 23, 368.47, -1.80999, 1 ] + } + }, + "body": { + "body": { + "type": "mesh", + "uvs": [ 0.35966, 0.01351, 0.26863, 0.04108, 0.26204, 0.0954, 0.34119, 0.14478, 0.39791, 0.19457, 0.40451, 0.24271, 0.38076, 0.27893, 0.35969, 0.3004, 0.34119, 0.31925, 0.34988, 0.34325, 0.35834, 0.36658, 0.36551, 0.40163, 0.37233, 0.43498, 0.38396, 0.4944, 0.3956, 0.5597, 0.39883, 0.59858, 0.40141, 0.62955, 0.40215, 0.65661, 0.34609, 0.71563, 0.27077, 0.78175, 0.22009, 0.82127, 0.17617, 0.85552, 0.13115, 0.88832, 0.08238, 0.92385, 0.00341, 0.97959, 0.18836, 0.99126, 0.32172, 0.99284, 0.46265, 0.9945, 0.61643, 0.98608, 0.71617, 0.97182, 0.6185, 0.9582, 0.48967, 0.95042, 0.39458, 0.94083, 0.27771, 0.92903, 0.23407, 0.9232, 0.26691, 0.89774, 0.3068, 0.8668, 0.34202, 0.83414, 0.38369, 0.7955, 0.45642, 0.72873, 0.52707, 0.66845, 0.56032, 0.63344, 0.57541, 0.60108, 0.59357, 0.56214, 0.61643, 0.49731, 0.63513, 0.43962, 0.64344, 0.40462, 0.7708, 0.39011, 0.84584, 0.37024, 0.90982, 0.35331, 0.9674, 0.31914, 0.97301, 0.28585, 0.96448, 0.23351, 0.8952, 0.16809, 0.79345, 0.12642, 0.75178, 0.10878, 0.71799, 0.09448, 0.66816, 0.07236, 0.61342, 0.04807, 0.47867, 0.0141, 0.49845, 0.38826, 0.66315, 0.34728, 0.67333, 0.30664, 0.8188, 0.29655, 0.8097, 0.24505, 0.72828, 0.17901, 0.68147, 0.13901, 0.59191, 0.0971, 0.3904, 0.09012, 0.53695, 0.14981, 0.57562, 0.19616, 0.64483, 0.25076, 0.79855, 0.33476, 0.6175, 0.97166, 0.4773, 0.97061, 0.23795, 0.95673, 0.15271, 0.92355, 0.14158, 0.94886, 0.23861, 0.86092, 0.51732, 0.30353, 0.50695, 0.34527, 0.50634, 0.43735, 0.50334, 0.49589, 0.51085, 0.32558, 0.50355, 0.41057, 0.19542, 0.8924, 0.36492, 0.96409 ], + "triangles": [ 2, 1, 68, 68, 1, 58, 58, 1, 59, 1, 0, 59, 69, 67, 66, 3, 68, 69, 69, 68, 67, 3, 2, 68, 66, 56, 55, 66, 67, 56, 67, 57, 56, 67, 58, 57, 67, 68, 58, 5, 70, 71, 71, 70, 65, 5, 4, 70, 70, 66, 65, 4, 69, 70, 70, 69, 66, 4, 3, 69, 65, 54, 53, 65, 66, 54, 66, 55, 54, 46, 61, 47, 46, 80, 61, 80, 83, 61, 61, 62, 72, 61, 83, 62, 80, 9, 83, 9, 8, 83, 83, 79, 62, 8, 7, 83, 83, 7, 79, 71, 6, 5, 7, 6, 79, 79, 6, 62, 6, 71, 62, 47, 72, 48, 47, 61, 72, 48, 72, 49, 49, 72, 50, 72, 63, 50, 72, 62, 63, 50, 63, 51, 62, 64, 63, 63, 52, 51, 63, 64, 52, 71, 65, 64, 64, 53, 52, 64, 65, 53, 62, 71, 64, 26, 86, 27, 27, 74, 28, 27, 86, 74, 28, 73, 29, 28, 74, 73, 73, 30, 29, 74, 31, 73, 73, 31, 30, 86, 32, 74, 74, 32, 31, 25, 75, 26, 26, 75, 86, 24, 77, 25, 25, 77, 75, 24, 23, 77, 75, 33, 86, 86, 33, 32, 75, 77, 33, 77, 34, 33, 77, 76, 34, 77, 23, 76, 23, 22, 76, 76, 85, 34, 76, 22, 85, 34, 85, 35, 85, 78, 35, 22, 21, 85, 35, 78, 36, 85, 21, 78, 37, 36, 20, 21, 20, 78, 36, 78, 20, 20, 19, 37, 37, 19, 38, 19, 18, 38, 38, 18, 39, 18, 17, 39, 39, 17, 40, 41, 40, 16, 40, 17, 16, 42, 41, 15, 41, 16, 15, 43, 42, 14, 42, 15, 14, 14, 82, 43, 43, 82, 44, 14, 13, 82, 82, 81, 44, 44, 81, 45, 82, 13, 81, 13, 12, 81, 46, 45, 84, 12, 84, 81, 45, 81, 84, 12, 11, 84, 11, 60, 84, 84, 60, 46, 60, 80, 46, 11, 10, 60, 60, 10, 80, 10, 9, 80 ], + "vertices": [ 1, 5, 30.85, 2.44, 1, 2, 4, 60.41999, 12.40999, 0.24857, 5, 22.31999, 18.17, 0.75141, 2, 4, 39.47, 25.23999, 0.4433, 5, -1.05999, 25.70999, 0.55668, 3, 3, 48.02, 29.45999, 0.3743, 4, 14.53999, 26.45, 0.47619, 5, -25.56999, 21.01, 0.14949, 3, 2, 50.36, 32.58, 0.11242, 3, 24.29, 26.79, 0.6461, 4, -8.98999, 30.48999, 0.24145, 3, 35, -45.20999, -8.8, 0.1061, 2, 28.68, 30.38999, 0.49531, 3, 2.88, 30.84, 0.39855, 3, 35, -28.90999, -12.43999, 0.258, 2, 12.14999, 32.79, 0.60892, 3, -12.27999, 37.83, 0.13303, 3, 35, -18.5, -14.05, 0.28712, 2, 2.33999, 35.97, 0.51934, 26, -7.59, 18.95, 0.19349, 4, 35, -10.77999, -18.35, 0.28477, 25, -42.02999, 75.55999, 0.10294, 2, -6.36, 37.31, 0.37492, 26, -10.19999, 10.25, 0.23733, 3, 35, 0.92, -16.95, 0.34086, 2, -17.28, 35.45, 0.32139, 26, -8.19999, -0.66, 0.33772, 4, 35, 10.64, -16.30999, 0.3269, 36, -24.04999, -14.89, 0.16082, 2, -27.56999, 33.65999, 0.14431, 26, -6.36, -11.03999, 0.36794, 4, 35, 28.48999, -15.61999, 0.24235, 36, -9.53999, -15.10999, 0.27028, 37, -45.5, -19.11, 0.12131, 26, -3.64, -27.87, 0.36603, 4, 35, 41.59, -14.89, 0.2176, 36, 6.92, -15.34, 0.33285, 37, -26.85, -17.47999, 0.20376, 26, -1.29999, -43.27, 0.24577, 3, 36, 33.81999, -15.8, 0.47178, 37, 0, -15.85, 0.42625, 38, -31.79, -17.81999, 0.10193, 3, 36, 63.38, -16.47999, 0.21259, 37, 29.52, -14.21, 0.42737, 38, -2.42, -14.38, 0.36002, 3, 37, 49.77999, -15.51, 0.30177, 38, 14.85, -13.07999, 0.47126, 39, -21.13999, -15.63, 0.22694, 3, 37, 61.09, -13.39999, 0.15443, 38, 29.03, -11.64, 0.50848, 39, -3.25999, -12.44999, 0.33708, 2, 38, 41.22999, -10.78999, 0.28077, 39, 8.39999, -8.78999, 0.71921, 2, 39, 36.22999, -8.59, 0.56511, 40, -3.01999, -8.82999, 0.43487, 3, 39, 67.93, -10.06, 0.16322, 40, 28.68, -7.80999, 0.53711, 41, -8.10999, -7.69, 0.29965, 3, 40, 47.75999, -8.47, 0.402, 41, 10.97, -7.88999, 0.45129, 42, -26.34, -6.21, 0.14667, 3, 40, 64.61, -8.06, 0.25016, 41, 27.79999, -8.39999, 0.46039, 42, -12.76, -8.81, 0.28942, 4, 40, 79.12, -10.23999, 0.11857, 41, 42.33, -8.02999, 0.2698, 42, 4.53, -8.36999, 0.48104, 32, -1.54999, 35.59999, 0.13055, 2, 42, 20.84, -9.18999, 0.72798, 32, -5.36999, 19.54999, 0.272, 1, 32, -11.5, -7.28999, 1, 4, 42, 43.22999, 16.27, 0.27459, 32, 15.1, -7.51, 0.48157, 33, -12.28999, -5.53999, 0.12941, 34, -41.75999, 0.93999, 0.11439, 4, 42, 36.99, 33.93999, 0.18804, 32, 33.7, -4.57, 0.34251, 33, 6.53, -5.75, 0.18296, 34, -23.19, -2.18, 0.28646, 3, 32, 53.34999, -1.58, 0.21646, 33, 26.39999, -6.07999, 0.26515, 34, -3.60999, -5.59, 0.51836, 2, 33, 47.99, -1.75999, 0.15751, 34, 18.37, -4.65999, 0.84246, 1, 34, 33.15999, -0.10999, 1, 2, 33, 47.97, 10.84, 0.17386, 34, 20.30999, 7.78999, 0.82612, 4, 42, 9.82999, 48.43, 0.1757, 32, 53.27999, 18.69, 0.17037, 33, 29.72999, 13.92, 0.136, 34, 2.75999, 13.65999, 0.51789, 4, 42, 11.44999, 34.56999, 0.26313, 32, 39.25999, 20.54999, 0.23037, 33, 16.20999, 18.09, 0.15679, 34, -9.93999, 19.87999, 0.3497, 4, 42, 12.39999, 17.12999, 0.37055, 32, 22.1, 22.5, 0.30408, 33, -0.37, 22.87, 0.18234, 34, -25.59, 27.17, 0.14297, 3, 42, 12.34, 10.43, 0.44639, 32, 15.56, 23.90999, 0.2976, 33, -6.59, 25.36, 0.256, 5, 40, 75.94999, 9.06, 0.10561, 41, 38.15, 11.07999, 0.25494, 42, 1.64999, 10.97, 0.33577, 32, 17.97999, 34.75, 0.16322, 33, -2.38, 35.63999, 0.14041, 3, 40, 62.61, 10.93999, 0.26063, 41, 26.04, 10.61999, 0.4979, 42, -15.14, 10.14, 0.24143, 3, 40, 47.27, 9.67, 0.40347, 41, 9.52999, 10.18999, 0.4787, 42, -26.59, 11.93, 0.11781, 3, 39, 69.23, 6.96999, 0.16042, 40, 28.62999, 9.26, 0.53934, 41, -7.94, 9.38, 0.30019, 2, 39, 37.36, 8, 0.57647, 40, -3.21, 7.8, 0.4235, 2, 38, 45.47999, 7.09999, 0.29348, 39, 8.38, 9.60999, 0.70649, 3, 37, 62.84, 9, 0.15444, 38, 29.39999, 10.81999, 0.49323, 39, -8.11999, 9.48999, 0.35229, 3, 37, 52.13999, 9.27, 0.30575, 38, 12.84, 11.72999, 0.46742, 39, -26.12, 8.77, 0.22682, 3, 36, 66.66, 11.26, 0.21797, 37, 30.61, 13.68999, 0.42844, 38, -3.04999, 13.52999, 0.35357, 3, 36, 37.7, 16.76, 0.48245, 37, 1.30999, 16.92, 0.41751, 38, -32.49, 14.97, 0.10001, 4, 35, 44.34, 22.11, 0.23458, 36, 11.90999, 21.43, 0.43852, 37, -24.76, 19.55999, 0.20679, 2, -58.27999, -7.19, 0.12007, 4, 35, 28.54, 23.56999, 0.31079, 36, -3.75999, 23.82999, 0.19156, 25, -76.76, 29.21999, 0.21529, 2, -42.41999, -7.44999, 0.28229, 3, 35, 22.30999, 41.63999, 0.18196, 25, -69.83, 12.46, 0.43955, 2, -34.84, -25, 0.37847, 3, 35, 19.77, 51.41999, 0.1392, 25, -59.84, 2.51999, 0.47894, 2, -23.88999, -35.15999, 0.38183, 3, 35, 6.03, 61.52999, 0.10542, 25, -52.7, -5.88, 0.51007, 2, -17.1, -43.61, 0.38449, 2, 25, -37.15999, -13.13, 0.67426, 2, -1.22, -50.81999, 0.32572, 1, 25, -22.09, -13.05, 1, 2, 25, 1.45, -10.48999, 0.89017, 2, 37.38999, -48.18, 0.10981, 3, 25, 30.39999, 0.95999, 0.43018, 2, 66.34999, -36.72, 0.16236, 3, 19.96999, -44.2, 0.40742, 2, 3, 41.58, -34.52, 0.68164, 4, -9.43999, -33.20999, 0.31834, 2, 3, 50.68, -30.61, 0.51065, 4, 0.37999, -31.98999, 0.48932, 3, 3, 58.06, -27.44, 0.26484, 4, 8.35, -31, 0.61474, 5, -18.04, -36.27999, 0.12041, 3, 3, 69.4, -22.87999, 0.17395, 4, 20.5, -29.77, 0.5644, 5, -6.51999, -32.22, 0.26164, 2, 4, 33.86, -28.42, 0.29085, 5, 6.13, -27.76, 0.70914, 2, 4, 56.54999, -19.37, 0.1738, 5, 26.04999, -13.63, 0.82618, 5, 35, 20.79, 3.25999, 0.38866, 36, -12.72999, 4.03, 0.17697, 25, -69.83999, 50.18, 0.10104, 2, -36.22, 13.38, 0.1958, 26, 13.97, -19.23999, 0.13748, 4, 35, 2.68, 26.80999, 0.26409, 25, -50.86, 29.20999, 0.2337, 2, -16.38999, -8.72999, 0.34628, 26, 35.77999, -0.47999, 0.15591, 3, 35, -15.64999, 28.56999, 0.15678, 25, -33.52999, 28.78, 0.29159, 2, 2.01999, -9.1, 0.5516, 1, 25, -28.17, 8.36999, 1, 1, 25, -5.01, 10.98999, 1, 3, 25, 24.12, 24.17, 0.1205, 2, 60.06, -13.51, 0.21383, 3, 20.53, -20.15999, 0.66562, 2, 3, 39.63, -17.84, 0.59512, 4, -6.67, -16.64999, 0.40487, 3, 3, 60.95, -9.85999, 0.26251, 4, 16.02, -14.92, 0.55541, 5, -14.38, -18.84, 0.18206, 2, 4, 32.68, 8.3, 0.58728, 5, -3.66, 7.65, 0.41269, 2, 3, 39.52, 3.09999, 0.47135, 4, -0.94999, 3.49, 0.52863, 1, 3, 17.87999, 2.55999, 1, 2, 2, 27.01, -3.63, 0.67245, 3, -8.35999, -1.30999, 0.32754, 3, 35, -2.63, 46, 0.10031, 25, -45.40999, 10.26, 0.5261, 2, -9.64, -27.45999, 0.37354, 2, 33, 47.97999, 4.75, 0.16596, 34, 19.37, 1.76999, 0.83402, 4, 42, 19.54999, 50.47999, 0.12624, 32, 53.29999, 9.5, 0.16908, 33, 28.20999, 4.84999, 0.24845, 34, -0.12999, 4.94, 0.4562, 4, 42, 26.30999, 16.81999, 0.32785, 32, 18.95999, 9.25, 0.38306, 33, -5.67999, 10.34, 0.15879, 34, -32.77, 15.60999, 0.13026, 2, 42, 16.95999, -0.02999, 0.66864, 32, 4.23, 21.70999, 0.33134, 3, 42, 28.1, 2.84999, 0.4826, 32, 4.90999, 10.14, 0.31301, 33, -19.37999, 13.56999, 0.20437, 3, 40, 63.20999, -0.57999, 0.21067, 41, 25.95999, 0.77999, 0.49386, 42, -11.01, 1.48, 0.29543, 3, 35, -14.82999, 8.07999, 0.24447, 25, -33.34, 51.22999, 0.16324, 2, 2.58999, 13.52999, 0.59226, 4, 35, 3.36999, 4.96, 0.28615, 25, -51.81, 51.13, 0.16475, 2, -15.85999, 13.43999, 0.31891, 26, 13.85, -0.51999, 0.23014, 4, 35, 46.08, 3.57999, 0.24088, 36, 9.06, 3.08999, 0.4115, 37, -28.45999, 0.63999, 0.21862, 26, 17.5, -43.06999, 0.12895, 3, 36, 37.22, 1.25, 0.47743, 37, -0.07999, 1.25, 0.42162, 38, -36.25, -5.25, 0.10091, 4, 35, -5.23, 6.28999, 0.25593, 25, -43.09999, 51.31999, 0.15578, 2, -7.15999, 13.61999, 0.42092, 26, 14.15999, 8.17, 0.16733, 4, 35, 33.02999, 3.36999, 0.36684, 36, -3.96, 3.59999, 0.31093, 2, -45.31999, 9.81999, 0.17305, 26, 15.75, -30.13999, 0.14914, 4, 40, 77.5, -1.15999, 0.11479, 41, 40.22999, 0.94999, 0.26888, 42, 3.04999, 0.72, 0.44971, 32, 7.65999, 35.31999, 0.16659, 4, 42, 22.71999, 34.66999, 0.22089, 32, 37.18, 9.38, 0.26954, 33, 12.28999, 7.42999, 0.20635, 34, -15.46, 9.94999, 0.30316 ], + "hull": 60, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 24, 26, 26, 28, 32, 34, 34, 36, 36, 38, 46, 48, 48, 50, 54, 56, 56, 58, 58, 60, 60, 62, 66, 68, 76, 78, 78, 80, 80, 82, 86, 88, 88, 90, 90, 92, 92, 94, 98, 100, 100, 102, 102, 104, 104, 106, 106, 108, 116, 118, 0, 118, 92, 120, 120, 20, 28, 86, 82, 32, 34, 80, 78, 36, 76, 38, 12, 124, 102, 126, 126, 124, 126, 128, 128, 130, 130, 132, 132, 134, 112, 134, 134, 136, 136, 4, 2, 116, 6, 138, 138, 132, 8, 140, 140, 130, 10, 142, 142, 128, 128, 104, 130, 106, 132, 108, 122, 92, 100, 144, 144, 122, 126, 144, 144, 94, 112, 114, 114, 116, 108, 110, 110, 112, 16, 18, 18, 20, 20, 22, 22, 24, 12, 14, 14, 16, 122, 124, 94, 96, 96, 98, 56, 146, 146, 60, 54, 148, 148, 62, 146, 148, 50, 150, 150, 66, 46, 152, 152, 68, 154, 152, 154, 48, 42, 156, 156, 72, 14, 158, 158, 124, 18, 160, 160, 122, 160, 120, 24, 162, 162, 90, 26, 164, 164, 88, 162, 164, 16, 166, 160, 166, 166, 158, 166, 124, 162, 168, 168, 120, 168, 22, 168, 92, 38, 40, 40, 42, 72, 74, 74, 76, 40, 74, 42, 44, 44, 46, 152, 170, 170, 156, 44, 170, 68, 70, 70, 72, 170, 70, 62, 64, 64, 66, 148, 172, 172, 150, 64, 172, 50, 52, 52, 54, 172, 52, 154, 66, 150, 154, 28, 30, 30, 32, 82, 84, 84, 86, 30, 84 ], + "width": 141, + "height": 452 + } + }, + "front arm": { + "front arm": { + "type": "mesh", + "uvs": [ 0.714, 0.00566, 0.67107, 0.08129, 0.60221, 0.15433, 0.53632, 0.21682, 0.44558, 0.28704, 0.34898, 0.35134, 0.29096, 0.3894, 0.25238, 0.41472, 0.22423, 0.4427, 0.19483, 0.47193, 0.15998, 0.50657, 0.09138, 0.59567, 0.05498, 0.70865, 0.02988, 0.81366, 0.01048, 0.94262, 0.10494, 0.98984, 0.25391, 0.9742, 0.31482, 0.88906, 0.28834, 0.82868, 0.13606, 0.74572, 0.14334, 0.71487, 0.18317, 0.62253, 0.25217, 0.5422, 0.29537, 0.50981, 0.33787, 0.47794, 0.38451, 0.45012, 0.43581, 0.41953, 0.5471, 0.36549, 0.68845, 0.29831, 0.74855, 0.35527, 0.85873, 0.38229, 0.99674, 0.37644, 0.95353, 0.33244, 0.91355, 0.29171, 0.87464, 0.25208, 0.83758, 0.21434, 0.78082, 0.12598, 0.78194, 0.06829, 0.63219, 0.23719, 0.66924, 0.15783, 0.75532, 0.20966, 0.7161, 0.11136 ], + "triangles": [ 30, 29, 33, 30, 32, 31, 40, 41, 36, 39, 41, 40, 40, 36, 35, 38, 39, 40, 28, 38, 40, 34, 28, 40, 34, 40, 35, 28, 34, 33, 29, 28, 33, 30, 33, 32, 41, 1, 0, 37, 41, 0, 36, 41, 37, 39, 1, 41, 39, 2, 1, 19, 12, 20, 13, 12, 19, 18, 15, 19, 16, 18, 17, 15, 13, 19, 15, 14, 13, 15, 18, 16, 21, 10, 22, 11, 10, 21, 20, 11, 21, 12, 11, 20, 9, 8, 23, 22, 9, 23, 10, 9, 22, 26, 5, 4, 25, 5, 26, 6, 5, 25, 24, 6, 25, 7, 6, 24, 23, 7, 24, 8, 7, 23, 38, 2, 39, 3, 2, 38, 27, 3, 38, 27, 38, 28, 4, 3, 27, 26, 4, 27 ], + "vertices": [ 1, 47, 21.65999, 6.07, 1, 2, 46, 18.12999, 3.36999, 0.16552, 47, 3.91, 4.23, 0.83446, 3, 27, -6.11999, -15.22999, 0.20964, 46, -0.03999, 8.85, 0.53628, 5, 43.43999, 6.80999, 0.25404, 1, 27, 10.35999, -12.02, 1, 2, 27, 30.62, -10.09, 0.8882, 28, -7.63, -10.14999, 0.11178, 2, 27, 50.56999, -9.68999, 0.30994, 28, 12.31, -9.60999, 0.69003, 2, 28, 24.20999, -9.36999, 0.86562, 29, -13.42, -6.19999, 0.13436, 2, 28, 32.11999, -9.21, 0.73142, 29, -5.71999, -8.02, 0.26855, 2, 28, 39.34999, -7.57999, 0.54006, 29, 1.67999, -8.23999, 0.45991, 2, 28, 46.9, -5.88, 0.29036, 29, 9.40999, -8.47999, 0.70963, 2, 29, 18.57999, -8.76, 0.66539, 30, -15.75, -5.11999, 0.3346, 1, 30, 6.03, -8.57999, 1, 2, 30, 31.42, -5.96999, 0.39256, 31, 0.49, -6.36, 0.60742, 1, 31, 23.79, -9.31, 1, 1, 31, 52.36999, -11.27999, 1, 1, 31, 62.38999, 2.71, 1, 1, 31, 58.29, 24.2, 1, 1, 31, 39.22, 32.47999, 1, 1, 31, 25.98999, 28.23999, 1, 1, 31, 8.32999, 5.63, 1, 2, 30, 28.80999, 6.63999, 0.48313, 31, 1.48, 6.48, 0.51686, 1, 30, 7.61, 5.9, 1, 3, 28, 51.65999, 11.06999, 0.10767, 29, 18.26, 6.73999, 0.55899, 30, -12.34, 10, 0.33333, 2, 28, 42.18, 10.25, 0.31463, 29, 8.86999, 8.31, 0.68536, 2, 28, 32.86, 9.43999, 0.59183, 29, -0.34999, 9.85999, 0.40816, 2, 28, 23.71999, 9.68999, 0.83034, 29, -9.13, 12.38, 0.16964, 2, 27, 52.08, 9.88, 0.29919, 28, 13.67, 9.97, 0.70078, 2, 27, 32.18, 12.59, 0.84685, 28, -6.23, 12.53999, 0.15312, 1, 5, 9.42, 3.38, 1, 2, 5, -5.05, -1.59, 0.47198, 4, 29.15999, -0.34999, 0.52799, 1, 4, 16.12999, -11.35, 1, 1, 4, 7.44999, -29.43, 1, 2, 5, -8.22999, -31.55999, 0.51928, 4, 19, -28.72999, 0.48069, 1, 5, 1.99, -28.42, 1, 1, 5, 11.96, -25.36, 1, 1, 5, 21.44, -22.45, 1, 3, 46, 12.68999, -14.53999, 0.25481, 47, 2.13, -14.39999, 0.32231, 5, 42.47, -19.80999, 0.42285, 1, 47, 13.63, -8.89, 1, 1, 27, 3.54999, 0.89999, 1, 2, 46, 1.71, -0.73, 0.5001, 5, 40.06, -2.32999, 0.49988, 1, 5, 25.65999, -11.23999, 1, 3, 46, 13.39, -4.63999, 0.33234, 47, 0.86, -4.55999, 0.48164, 5, 48.11, -11.64999, 0.186 ], + "hull": 38, + "edges": [ 0, 2, 8, 10, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 32, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 52, 54, 54, 56, 56, 58, 58, 60, 60, 62, 70, 72, 72, 74, 0, 74, 56, 76, 6, 8, 76, 6, 4, 6, 4, 78, 78, 80, 80, 70, 2, 82, 82, 72, 82, 78, 78, 76, 2, 4, 56, 80, 56, 66, 62, 64, 64, 66, 66, 68, 68, 70, 44, 46, 46, 48, 18, 20, 46, 18, 10, 12, 12, 14, 48, 50, 50, 52, 12, 50, 14, 16, 16, 18 ], + "width": 145, + "height": 221 + } + }, + "front leg path": { + "front leg path": { + "type": "path", + "lengths": [ 140.43, 297.34, 652.04 ], + "vertexCount": 9, + "vertices": [ 1, 44, -40.7, -0.40999, 1, 1, 44, 1.48, -0.27, 1, 1, 44, 75.41999, 0.33, 1, 2, 44, 82.91999, 8.48999, 0.5, 45, -58.75, -8.52999, 0.5, 2, 44, 141.34, 0.51999, 0.5, 45, 0.44999, 0.70999, 0.5, 2, 44, 208.26, -14.82999, 0.5, 45, 68.83, 18.53, 0.5, 1, 45, 73.80999, 1.40999, 1, 1, 45, 156.57, 0.98, 1, 1, 44, 380.59, 0.75999, 1 ] + } + }, + "head": { + "head": { + "type": "mesh", + "uvs": [ 0.49583, 0.01984, 0.3073, 0.05802, 0.14319, 0.17024, 0.0279, 0.36227, 0.04553, 0.57745, 0.16625, 0.73247, 0.18795, 0.84353, 0.30324, 0.96963, 0.42124, 0.91063, 0.58535, 0.94649, 0.76303, 0.93261, 0.8694, 0.78599, 0.96783, 0.65033, 0.93351, 0.55575, 0.91494, 0.50457, 0.93281, 0.4436, 0.96241, 0.34261, 0.84983, 0.16792, 0.70199, 0.06496, 0.71827, 0.40045, 0.55822, 0.46524, 0.67191, 0.56924, 0.61248, 0.74982, 0.29238, 0.552, 0.68707, 0.30096, 0.49719, 0.316, 0.38868, 0.29286, 0.30595, 0.24312, 0.32494, 0.40508, 0.4036, 0.55663, 0.63282, 0.6862, 0.75489, 0.67579, 0.72156, 0.43445, 0.60178, 0.47123, 0.67975, 0.53995, 0.86841, 0.4929 ], + "triangles": [ 7, 6, 8, 10, 9, 22, 9, 8, 22, 10, 22, 11, 22, 8, 23, 23, 8, 5, 8, 6, 5, 11, 22, 31, 22, 30, 31, 11, 31, 12, 23, 29, 22, 22, 29, 30, 5, 4, 23, 29, 20, 30, 30, 21, 31, 30, 20, 21, 31, 13, 12, 31, 14, 13, 31, 21, 14, 4, 3, 23, 21, 35, 14, 21, 34, 35, 20, 33, 21, 21, 33, 34, 23, 28, 29, 20, 29, 28, 20, 28, 25, 25, 28, 26, 23, 3, 28, 27, 3, 2, 3, 27, 28, 34, 32, 35, 34, 33, 32, 14, 35, 15, 15, 35, 19, 32, 33, 19, 33, 20, 19, 20, 24, 19, 20, 25, 24, 16, 15, 19, 19, 35, 32, 28, 27, 26, 19, 24, 16, 24, 17, 16, 18, 24, 25, 25, 26, 0, 24, 18, 17, 18, 25, 0, 27, 1, 26, 26, 1, 0, 27, 2, 1 ], + "vertices": [ 1, 48, 90.83, 8.14, 1, 1, 48, 81.69999, 22.32999, 1, 1, 48, 66.16, 32, 1, 1, 48, 44.34, 34.97, 1, 1, 48, 24.13999, 26.23999, 1, 1, 48, 12.71, 11.09, 1, 1, 47, 17.77, 6.05999, 1, 1, 47, 10.69999, -8.61999, 1, 1, 48, 2.94, -15.85, 1, 1, 48, 4.23, -30.53, 1, 1, 48, 10.69999, -44.63999, 1, 1, 48, 27.88999, -48.40999, 1, 1, 48, 43.79, -51.9, 1, 1, 48, 51.90999, -45.88999, 1, 1, 48, 56.29, -42.63, 1, 1, 48, 62.68, -42.04, 1, 1, 48, 73.26, -41.04999, 1, 1, 48, 86.80999, -25.90999, 1, 1, 48, 92.44999, -10.28999, 1, 1, 48, 60.63, -22.96999, 1, 1, 48, 49.77, -12.02999, 1, 1, 48, 43.04, -24.87, 1, 1, 48, 23.94, -26.1, 1, 1, 48, 33.72999, 6.84, 1, 1, 48, 69.3, -17.04999, 1, 1, 48, 62.36, -1.97, 1, 1, 48, 61.45, 7.69999, 1, 1, 48, 63.84999, 16.18, 1, 1, 48, 48.81, 9.14, 1, 1, 48, 36.5, -2.43, 1, 1, 48, 30.65999, -25.62, 1, 1, 48, 35.18999, -35.29, 1, 1, 48, 57.45, -24.38999, 1, 1, 48, 50.45, -15.81, 1, 1, 48, 46.09, -24.53, 1, 1, 48, 56.06999, -38.41999, 1 ], + "hull": 19, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 32, 34, 34, 36, 0, 36, 28, 30, 30, 32, 30, 38, 38, 40, 40, 42, 42, 28, 20, 22, 22, 24, 22, 44, 44, 46, 32, 48, 48, 50, 50, 52, 52, 54, 54, 56, 56, 58, 58, 60, 60, 62, 24, 26, 26, 28, 62, 26, 64, 66, 66, 40, 66, 68, 68, 70, 70, 64 ], + "width": 87, + "height": 102 + } + } + } +}, +"animations": { + "sneak": { + "bones": { + "hip": { + "rotate": [ + { "time": 0, "angle": 30.27, "curve": "stepped" }, + { "time": 0.1666, "angle": 30.27 }, + { "time": 0.3333, "angle": -31.29 }, + { "time": 0.5333, "angle": -44.75 }, + { "time": 0.7333, "angle": -25.49 }, + { "time": 0.8999, "angle": -9.45 }, + { "time": 1.0666, "angle": 30.27 }, + { "time": 1.2333, "angle": -10.1 }, + { "time": 1.6333, "angle": -41.47 }, + { "time": 1.7999, "angle": 30.27 } + ], + "translate": [ + { "time": 0, "x": -57.43, "y": -40.92 }, + { + "time": 0.1666, + "x": -16.15, + "y": -96.56, + "curve": [ 0.245, 0, 0.637, 0.55 ] + }, + { + "time": 0.2666, + "x": 85.99, + "y": -143.07, + "curve": [ 0.381, 0.54, 0.742, 1 ] + }, + { "time": 0.3333, "x": 145.44, "y": -159.27 }, + { "time": 0.4333, "x": 344.29, "y": -134.94 }, + { "time": 0.5333, "x": 543.13, "y": -81.1 }, + { "time": 0.7333, "x": 569.68, "y": -62.13 }, + { "time": 0.8999, "x": 591.8, "y": -46.32 }, + { + "time": 1.0666, + "x": 653.14, + "y": -96.6, + "curve": [ 0.381, 0.54, 0.742, 1 ] + }, + { "time": 1.1333, "x": 710.16, "y": -143.1 }, + { "time": 1.2333, "x": 795.7, "y": -159.3 }, + { "time": 1.3333, "x": 986.94, "y": -153.35 }, + { "time": 1.4333, "x": 1178.19, "y": -111.88 }, + { "time": 1.6333, "x": 1195.1, "y": -62.1 }, + { "time": 1.7999, "x": 1246.53, "y": -40.92 } + ] + }, + "front leg IK target": { + "translate": [ + { "time": 0, "x": -50.42, "y": 44.61 }, + { "time": 0.1666, "x": -50.42, "y": 46.55 }, + { "time": 0.3333, "x": -50.42, "y": 47 }, + { + "time": 0.5333, + "x": -26.42, + "y": 50.21, + "curve": [ 0.532, 0, 0.75, 1 ] + }, + { "time": 0.7333, "x": 566.43, "y": 107.27 }, + { "time": 0.8999, "x": 1215.89, "y": 68.21 }, + { "time": 1.0666, "x": 1235.47, "y": 15.8 }, + { "time": 1.2333, "x": 1235.47, "y": 0.97 }, + { "time": 1.5666, "x": 1230.15, "y": 3.76 }, + { "time": 1.7, "x": 1244, "y": 26.76 }, + { "time": 1.7999, "x": 1253.53, "y": 44.61 } + ] + }, + "front foot 1": { + "rotate": [ + { "time": 0, "angle": -48.38, "curve": "stepped" }, + { "time": 0.3333, "angle": -48.38 }, + { "time": 0.6999, "angle": -121.34 }, + { "time": 0.8, "angle": -80.19 }, + { "time": 0.8999, "angle": 45.59 }, + { "time": 1.0666, "angle": 2.1 }, + { "time": 1.2333, "angle": 4.65 }, + { "time": 1.5666, "angle": 5.66 }, + { "time": 1.7999, "angle": -48.38 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.6, "x": 1, "y": 1 }, + { "time": 0.6333, "x": 0.954, "y": 1 }, + { "time": 0.7666, "x": 0.82, "y": 1 }, + { "time": 0.8999, "x": 1, "y": 1 }, + { "time": 1.0666, "x": 0.851, "y": 1 }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "front foot 3": { + "rotate": [ + { "time": 0, "angle": 36.32 }, + { "time": 0.3333, "angle": 28.46 }, + { "time": 0.5, "angle": 34.84 }, + { "time": 0.5333, "angle": 30.32 }, + { "time": 0.5666, "angle": 61.67 }, + { "time": 0.6999, "angle": -19.47 }, + { "time": 0.8999, "angle": -0.12 }, + { "time": 1.0666, "angle": -7.21 }, + { "time": 1.2333, "angle": -11.34 }, + { "time": 1.5666, "angle": -11.23 }, + { "time": 1.7999, "angle": 36.32 } + ] + }, + "back leg IK target": { + "translate": [ + { "time": 0, "x": 516.79, "y": 86.68 }, + { "time": 0.1666, "x": 523.71, "y": 16.63 }, + { "time": 0.3333, "x": 523.03, "y": -5, "curve": "stepped" }, + { "time": 0.6999, "x": 523.03, "y": -5 }, + { "time": 0.8999, "x": 551.31, "y": 41.86 }, + { "time": 1.0666, "x": 554.24, "y": 44.45 }, + { "time": 1.1333, "x": 555.44, "y": 44.74 }, + { "time": 1.2, "x": 556.6, "y": 46.19, "curve": "stepped" }, + { "time": 1.4333, "x": 556.6, "y": 46.19 }, + { "time": 1.5, "x": 746.96, "y": 74.82 }, + { "time": 1.6333, "x": 1127.68, "y": 103.61 }, + { "time": 1.7999, "x": 1820.75, "y": 86.68 } + ] + }, + "back foot 1": { + "rotate": [ + { "time": 0, "angle": 74.17 }, + { "time": 0.1666, "angle": -17.01 }, + { "time": 0.3333, "angle": 5.05 }, + { "time": 0.6999, "angle": 3.74 }, + { "time": 0.8999, "angle": -65.56 }, + { "time": 1.6333, "angle": -92.52 }, + { "time": 1.7999, "angle": 74.17 } + ], + "scale": [ + { "time": 0, "x": 0.824, "y": 1 }, + { "time": 0.1666, "x": 0.754, "y": 1 }, + { "time": 0.3333, "x": 0.589, "y": 1 }, + { "time": 0.5666, "x": 0.909, "y": 1 }, + { "time": 0.8999, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3999, "x": 1, "y": 1 }, + { "time": 1.5, "x": 0.844, "y": 1 }, + { "time": 1.7999, "x": 0.824, "y": 1 } + ] + }, + "back foot 2": { + "rotate": [ + { "time": 0, "angle": 8.13 }, + { "time": 0.1666, "angle": -3.21 }, + { "time": 0.6999, "angle": -1.14 }, + { "time": 0.8999, "angle": 34.12 }, + { "time": 1.4333, "angle": 46.68 }, + { "time": 1.5333, "angle": -15.6 }, + { "time": 1.6333, "angle": -11.91 }, + { "time": 1.7999, "angle": 8.13 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.1666, "x": 0.835, "y": 1 }, + { "time": 0.3333, "x": 1, "y": 1 } + ] + }, + "front arm 1": { + "rotate": [ + { "time": 0, "angle": -39.71 }, + { "time": 0.1666, "angle": -37.29 }, + { "time": 0.3333, "angle": 30.66 }, + { + "time": 0.8999, + "angle": -53.28, + "curve": [ 0.708, 0.01, 0.75, 1 ] + }, + { "time": 1.2333, "angle": 36 }, + { "time": 1.7999, "angle": -39.71 } + ] + }, + "neck 1": { + "rotate": [ + { "time": 0, "angle": 21.95, "curve": "stepped" }, + { "time": 0.1666, "angle": 21.95 }, + { "time": 0.2666, "angle": 30.6 }, + { "time": 0.3333, "angle": 36.37 }, + { "time": 0.7333, "angle": 33.6 }, + { "time": 1.1666, "angle": 23.95 }, + { "time": 1.2333, "angle": 36.37 }, + { "time": 1.6333, "angle": 41.16 }, + { "time": 1.7999, "angle": 21.95 } + ] + }, + "neck 2": { + "rotate": [ + { "time": 0, "angle": -22.93 }, + { "time": 0.1666, "angle": -23.95 }, + { "time": 0.2666, "angle": 8.84 }, + { "time": 0.3333, "angle": 30.71 }, + { "time": 0.7333, "angle": -3.36 }, + { "time": 0.8999, "angle": -17.57 }, + { "time": 1.1666, "angle": 2.19 }, + { "time": 1.2333, "angle": 15.25 }, + { "time": 1.6333, "angle": 4.41 }, + { "time": 1.7999, "angle": -22.93 } + ] + }, + "head": { + "rotate": [ + { "time": 0, "angle": -22.93 }, + { "time": 0.1666, "angle": -13.03 }, + { "time": 0.2666, "angle": 2.64 }, + { "time": 0.3333, "angle": 13.1 }, + { "time": 0.5, "angle": 13.1 }, + { "time": 0.7333, "angle": -18.9 }, + { "time": 0.8999, "angle": -41.77 }, + { "time": 1.1666, "angle": -4 }, + { "time": 1.2333, "angle": -2.35 }, + { "time": 1.6333, "angle": -22.89 }, + { "time": 1.7999, "angle": -22.93 } + ] + }, + "back arm 1": { + "rotate": [ + { "time": 0, "angle": -17.23 }, + { "time": 0.1666, "angle": -18.65 }, + { "time": 0.3333, "angle": 324.98 }, + { "time": 0.5666, "angle": -6.41 }, + { "time": 0.8999, "angle": -14.83 }, + { "time": 1.0666, "angle": -16.9 }, + { "time": 1.2333, "angle": 1.49 }, + { "time": 1.3999, "angle": 2.56 }, + { "time": 1.7999, "angle": -17.23 } + ], + "translate": [ + { "time": 0, "x": -14.25, "y": -6.6 } + ] + }, + "back leg IK 1": { + "scale": [ + { "time": 0, "x": 2.186, "y": 1 }, + { "time": 0.1666, "x": 2.228, "y": 1 }, + { "time": 0.3333, "x": 1.532, "y": 1 }, + { "time": 0.4333, "x": 0.946, "y": 1 }, + { "time": 0.5333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 }, + { "time": 1.1333, "x": 0.892, "y": 1 }, + { "time": 1.2333, "x": 0.956, "y": 1 }, + { "time": 1.4333, "x": 2.315, "y": 1 }, + { "time": 1.6333, "x": 0.774, "y": 1 }, + { "time": 1.7999, "x": 2.186, "y": 1 } + ] + }, + "front leg 1": { + "scale": [ + { "time": 0, "x": 1, "y": 1.117 } + ] + }, + "back leg 1": { + "scale": [ + { "time": 0, "x": 1, "y": 1.038 } + ] + }, + "front leg IK 1": { + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.2666, "x": 0.858, "y": 1 }, + { "time": 0.3333, "x": 0.972, "y": 1 }, + { + "time": 0.5333, + "x": 2.356, + "y": 1, + "curve": [ 0.532, 0, 0.75, 1 ] + }, + { "time": 0.6999, "x": 1, "y": 1 }, + { "time": 0.8999, "x": 2.248, "y": 1 }, + { "time": 1.0666, "x": 2.002, "y": 1 }, + { "time": 1.2333, "x": 1.495, "y": 1 }, + { + "time": 1.2999, + "x": 1.047, + "y": 1, + "curve": [ 0.339, 0.58, 0.764, 1 ] + }, + { "time": 1.4333, "x": 0.779, "y": 0.762 }, + { "time": 1.7999, "x": 1, "y": 1 } + ] + }, + "front leg IK 2": { + "scale": [ + { "time": 0, "x": 1, "y": 1 } + ] + }, + "front arm 3": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 17.37 }, + { "time": 0.3333, "angle": 31.94 }, + { + "time": 0.8999, + "angle": 4.76, + "curve": [ 0.708, 0.01, 0.75, 1 ] + }, + { "time": 1.2333, "angle": 39.96 }, + { "time": 1.7999, "angle": 0 } + ] + }, + "spine 2": { + "rotate": [ + { "time": 0, "angle": -3.49 }, + { "time": 0.2666, "angle": -11.57 }, + { "time": 0.3333, "angle": -9.02 }, + { "time": 0.5, "angle": -2.65 }, + { "time": 0.7333, "angle": -5.78 }, + { "time": 1.1666, "angle": -11.57 }, + { "time": 1.2333, "angle": -6.69 }, + { "time": 1.6333, "angle": -2.5 }, + { "time": 1.7999, "angle": -3.49 } + ] + }, + "spine 3": { + "rotate": [ + { "time": 0, "angle": -20.41 }, + { "time": 0.2666, "angle": -11.57 }, + { "time": 0.3333, "angle": -9.02 }, + { "time": 0.5, "angle": -2.65 }, + { "time": 0.7333, "angle": -10.53 }, + { "time": 0.8999, "angle": -16.16 }, + { "time": 1.1666, "angle": -11.57 }, + { "time": 1.2333, "angle": -9.02 }, + { "time": 1.6333, "angle": -7.26 }, + { "time": 1.7999, "angle": -20.41 } + ] + }, + "back arm 3": { + "rotate": [ + { "time": 0, "angle": 26.23 }, + { "time": 0.1666, "angle": 53.14 }, + { "time": 0.3333, "angle": 116.25 }, + { "time": 0.5666, "angle": 35.72 }, + { "time": 0.8999, "angle": 39.32 }, + { "time": 1.0666, "angle": 41.19 }, + { "time": 1.2333, "angle": 78.09 }, + { "time": 1.3999, "angle": 36.16 }, + { "time": 1.7999, "angle": 26.23 } + ] + }, + "back foot 3": { + "rotate": [ + { "time": 0, "angle": 11.35 }, + { "time": 0.6999, "angle": -4.24 }, + { "time": 0.8999, "angle": 25.48, "curve": "stepped" }, + { "time": 1.4333, "angle": 25.48 }, + { "time": 1.5333, "angle": -30.51 }, + { "time": 1.6333, "angle": -20.54 }, + { "time": 1.7999, "angle": 11.35 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.1666, "x": 0.835, "y": 1 }, + { "time": 0.3333, "x": 1, "y": 1 } + ] + }, + "spine 1": { + "rotate": [ + { "time": 0, "angle": 10.81 }, + { "time": 0.2666, "angle": -28.69 }, + { "time": 0.3333, "angle": -24.32 }, + { "time": 0.5, "angle": -13.37 }, + { "time": 0.7333, "angle": 21.61 }, + { "time": 0.8999, "angle": 46.61 }, + { "time": 1.1666, "angle": -28.69 }, + { "time": 1.2333, "angle": -43.33 }, + { "time": 1.6333, "angle": 24.89 }, + { "time": 1.7999, "angle": 10.81 } + ] + }, + "spine 4": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.2666, "angle": -2.8 }, + { "time": 0.3333, "angle": -0.82 }, + { "time": 0.5, "angle": 4.13 }, + { "time": 0.7333, "angle": -3.74 }, + { "time": 0.8999, "angle": -9.37 }, + { "time": 1.1666, "angle": -9.02 }, + { "time": 1.2333, "angle": -0.82 }, + { "time": 1.6333, "angle": 3.81 }, + { "time": 1.7999, "angle": 0 } + ] + }, + "front foot 2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.2666, "angle": -1.24 }, + { "time": 0.3333, "angle": -0.2 }, + { "time": 0.5, "angle": 22.72 }, + { "time": 0.5333, "angle": 26.87 }, + { "time": 0.6999, "angle": -39.25 }, + { "time": 0.8999, "angle": 11.26 }, + { "time": 1.0666, "angle": -18.17 }, + { "time": 1.2333, "angle": -2.64 }, + { "time": 1.5666, "angle": -5.84 }, + { "time": 1.7999, "angle": 0 } + ] + }, + "belly": { + "translate": [ + { "time": 0, "x": 3.65, "y": -3.77 }, + { "time": 0.2666, "x": 13.82, "y": -3.82 }, + { "time": 0.6333, "x": -4.11, "y": -3.89 }, + { "time": 0.7666, "x": 10.21, "y": -2.91 }, + { "time": 0.8666, "x": 10.3, "y": -7.38 }, + { "time": 1.1, "x": -0.44, "y": -1.45 }, + { "time": 1.2333, "x": 12.37, "y": 2.32 }, + { "time": 1.3666, "x": 11.51, "y": 5.52 }, + { "time": 1.7999, "x": 0, "y": 0 } + ] + }, + "butt": { + "translate": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 0.7666, "x": 9.88, "y": -25.41 }, + { "time": 0.8333, "x": 15.89, "y": -41.88 }, + { "time": 1.2333, "x": -12.49, "y": -32.99 }, + { "time": 1.7999, "x": 0, "y": 0 } + ] + } + }, + "deform": { + "default": { + "back leg": { + "back leg": [ + { "time": 0.3 }, + { + "time": 0.3333, + "offset": 68, + "vertices": [ -1.72897, 2.75445, -1.52529, 2.94189, 0.0625, 3.6552, 0.01776, 3.65397, 0, 0, 0, 0, 0, 0, 0.0625, 3.6552, 0.01776, 3.65397, 0.90136, 3.54112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.98724, -1.57397, -0.03338, -2.08873, -0.0108, -2.08799, -0.51434, -2.02362, 0.98724, -1.57397, 0.87167, -1.68002, -0.03338, -2.08873, -0.0108, -2.08799 ] + }, + { "time": 0.4666, "curve": "stepped" }, + { "time": 1.3333 }, + { + "time": 1.4333, + "offset": 110, + "vertices": [ 2.52801, 0.00428, -0.03569, -4.90118, -3.71691, -3.19396, -4.88018, -0.43807, 5.17279, -0.0625, 5.1499, -0.47689, -0.07238, -10.06842, -7.6351, -6.56072, 6.64205, -0.09958, 6.61151, -0.62642, -0.09275, -12.93914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.01242, -1.65533, -1.25543, -1.0787, 0.86096, 0.02682, -0.01242, -1.65533, -1.25543, -1.0787 ] + }, + { "time": 1.5 } + ] + }, + "back leg path": { + "back leg path": [ + { "time": 1.4333 }, + { + "time": 1.5, + "vertices": [ 4.67718, -35.44354, 0, 0, -11.37145, 49.53738, -20.9989, -109.72335, 65.45837, -90.53627, -9.56652, -24.74755, 11.45202, -23.93551, -19.07189, 47.32281, -47.53955, 18.58409, 34.69244, -51.5341, 0, 0, 13.30163, -100.17205 ] + }, + { + "time": 1.5666, + "vertices": [ -0.9635, -22.43963, 0, 0, -13.80389, 27.61459, -41.00646, -55.15969, 7.62652, -96.25755, -24.12603, -24.11285, 7.19531, -37.8742, -31.47302, 7.7796, -12.34545, -3.32328, 26.55981, -38.73887, 0, 0, -13.62084, -280.84912 ] + }, + { "time": 1.6666 } + ] + }, + "body": { + "body": [ + { "time": 0 }, + { + "time": 0.3333, + "offset": 164, + "vertices": [ -0.01179, 0.02892, 0.00916, 0.0298, 0, 0, 1.17781, 0.89835, 1.48062, -0.04942, -6.68858, -1.30628, 4.38937, 4.03925, 4.59583, 3.27733, 5.6365, -0.11034, -4.92264, -0.8036, 4.54262, 1.06504, 3.29334, 0.58413, 2.94213, -1.40271, -4.28854, -0.56444, 5.07102, -0.21189, 2.9589, -0.75665, 1.83513, -2.22983, -4.31061, 0.62609, 6.11537, -0.87568, 3.79229, -1.67126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.17403, 0.22007, 0.27403, 0.06015 ] + }, + { + "time": 0.5333, + "offset": 164, + "vertices": [ -0.01886, 0.04627, 0.01467, 0.04768, 0, 0, 1.88449, 1.43737, 2.369, -0.07907, 1.46056, -1.33222, -0.75053, -3.73339, -2.82319, -2.55492, -3.80252, -0.19385, 2.81923, -1.5031, -0.33162, -6.7565, -4.28408, -5.23484, -6.6292, -1.34549, 3.83378, -1.12044, 0.51381, -8.79961, -4.81917, -7.38011, -8.40039, -2.66888, 3.83378, -1.12044, 0.51381, -8.79961, -4.81917, -7.38011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.27845, 0.35211, 0.43846, 0.09625 ] + }, + { + "time": 0.6333, + "offset": 170, + "vertices": [ -2.09907, 0.0496, -1.943, 1.46153, 1.74966, 0.25744, 0.37649, -3.44555, -2.34342, -2.73068, -3.66285, -0.53692, 0, 0, 0, 0, 0, 0, 0, 0, 1.91689, -0.56022, 0.2569, -4.3998, -2.40958, -3.69005, -4.2002, -1.33444, 1.91689, -0.56022, 0.2569, -4.3998, -2.40958, -3.69005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.66468, 1.2535, 0.05176, 1.41789 ] + }, + { "time": 0.7333 }, + { + "time": 0.7666, + "offset": 264, + "vertices": [ -2.27499, -1.60417, -2.23925, -1.6137, -2.2196, -1.74293, -1.80918, 2.86346, -1.11117, 2.36199, -1.14221, 2.359, 2.63101, 1.41101, 2.63215, 1.41741, -0.81469, 8.46568, 9.4562, 1.07873, 9.45622, 1.08001, -1.00012, 6.23983, 6.96737, 1.29986, 6.9674, 1.30218, -0.68823, 4.24005, 4.7344, 0.89532, 4.73448, 0.89593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.05484, 2.78092, 0.01666, 2.78222, 3.10775, -0.05572, 3.10798, -0.05426, -1.17971, 2.87597, -0.99005, 3.55937, 3.97198, 1.27319, 3.97207, 1.27423, -2.74237, 3.14401 ] + }, + { "time": 0.8333, "curve": "stepped" }, + { "time": 1.0666 }, + { + "time": 1.3333, + "offset": 142, + "vertices": [ 4.0227, -1.7984, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041, 4.0227, -1.7984, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.0227, -1.7984, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041, 4.0227, -1.7984, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041, 4.0227, -1.7984, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.0227, -1.7984, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041, 4.0227, -1.7984, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.0227, -1.7984, 0.00683, -4.47886, -0.46118, -4.45536, -0.27441, -4.47041 ] + }, + { "time": 1.4333 } + ] + }, + "front leg path": { + "front leg path": [ + { "time": 0.5666 }, + { + "time": 0.6333, + "vertices": [ 0.16365, -9.90768, 0, 0, -1.90419, 16.99049, 16.55858, -93.67209, 21.4361, -76.03694, -0.72391, -31.37989, 8.21379, -30.29725, -24.90732, 16.177, -28.83566, 5.62575, 82.90021, -63.82897, 0, 0, -39.50021, -13.99932 ] + }, + { + "time": 0.6999, + "vertices": [ 0.20397, -12.34891, 0, 0, -2.37338, 21.17691, 20.63858, -116.75268, 26.71791, -94.77227, -0.90228, -39.11182, 10.23765, -37.76242, -31.04443, 20.16297, -35.9407, 7.01193, 22.68159, 24.72714, 0, 0, -292.39255, -342.79443 ] + }, + { "time": 0.8 } + ] + } + } + } + } +} +} \ No newline at end of file diff --git a/spine-starling/spine-starling-example/src/stretchyman.png b/spine-starling/spine-starling-example/src/stretchyman.png new file mode 100644 index 000000000..106a42a67 Binary files /dev/null and b/spine-starling/spine-starling-example/src/stretchyman.png differ