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