瀏覽代碼

[c][sfml][cocos2d-x][cocos2d-objc] Updated to 3.3.07 (#629)

Mario Zechner 9 年之前
父節點
當前提交
eb540387e6
共有 100 個文件被更改,包括 11239 次插入2681 次删除
  1. 5 5
      .gitignore
  2. 1 2
      spine-c/README.md
  3. 116 13
      spine-c/include/spine/Animation.h
  4. 1 4
      spine-c/include/spine/Attachment.h
  5. 19 3
      spine-c/include/spine/Bone.h
  6. 6 3
      spine-c/include/spine/BoneData.h
  7. 3 4
      spine-c/include/spine/BoundingBoxAttachment.h
  8. 4 1
      spine-c/include/spine/IkConstraint.h
  9. 14 14
      spine-c/include/spine/MeshAttachment.h
  10. 65 0
      spine-c/include/spine/PathAttachment.h
  11. 113 0
      spine-c/include/spine/PathConstraint.h
  12. 96 0
      spine-c/include/spine/PathConstraintData.h
  13. 12 2
      spine-c/include/spine/Skeleton.h
  14. 6 0
      spine-c/include/spine/SkeletonData.h
  15. 14 0
      spine-c/include/spine/Skin.h
  16. 3 1
      spine-c/include/spine/SlotData.h
  17. 5 10
      spine-c/include/spine/TransformConstraint.h
  18. 4 3
      spine-c/include/spine/TransformConstraintData.h
  19. 13 41
      spine-c/include/spine/VertexAttachment.h
  20. 8 1
      spine-c/include/spine/extension.h
  21. 1 1
      spine-c/include/spine/spine.h
  22. 278 172
      spine-c/src/spine/Animation.c
  23. 4 25
      spine-c/src/spine/AtlasAttachmentLoader.c
  24. 81 16
      spine-c/src/spine/Bone.c
  25. 3 2
      spine-c/src/spine/BoneData.c
  26. 4 14
      spine-c/src/spine/BoundingBoxAttachment.c
  27. 160 169
      spine-c/src/spine/IkConstraint.c
  28. 17 19
      spine-c/src/spine/MeshAttachment.c
  29. 56 0
      spine-c/src/spine/PathAttachment.c
  30. 451 0
      spine-c/src/spine/PathConstraint.c
  31. 45 0
      spine-c/src/spine/PathConstraintData.c
  32. 214 55
      spine-c/src/spine/Skeleton.c
  33. 4 4
      spine-c/src/spine/SkeletonBounds.c
  34. 11 0
      spine-c/src/spine/SkeletonData.c
  35. 411 325
      spine-c/src/spine/SkeletonJson.c
  36. 0 13
      spine-c/src/spine/Skin.c
  37. 2 10
      spine-c/src/spine/Slot.c
  38. 2 1
      spine-c/src/spine/SlotData.c
  39. 55 49
      spine-c/src/spine/TransformConstraint.c
  40. 1 0
      spine-c/src/spine/TransformConstraintData.c
  41. 113 0
      spine-c/src/spine/VertexAttachment.c
  42. 0 137
      spine-c/src/spine/WeightedMeshAttachment.c
  43. 1 1
      spine-cocos2d-objc/README.md
  44. 59 58
      spine-cocos2d-objc/Resources/goblins-mesh.atlas
  45. 115 114
      spine-cocos2d-objc/Resources/goblins-mesh.json
  46. 二進制
      spine-cocos2d-objc/Resources/goblins-mesh.png
  47. 251 0
      spine-cocos2d-objc/Resources/raptor.atlas
  48. 361 0
      spine-cocos2d-objc/Resources/raptor.json
  49. 二進制
      spine-cocos2d-objc/Resources/raptor.png
  50. 93 92
      spine-cocos2d-objc/Resources/spineboy.atlas
  51. 31 31
      spine-cocos2d-objc/Resources/spineboy.json
  52. 二進制
      spine-cocos2d-objc/Resources/spineboy.png
  53. 125 0
      spine-cocos2d-objc/Resources/tank.atlas
  54. 1899 0
      spine-cocos2d-objc/Resources/tank.json
  55. 二進制
      spine-cocos2d-objc/Resources/tank.png
  56. 2 2
      spine-cocos2d-objc/example/GoblinsExample.m
  57. 41 0
      spine-cocos2d-objc/example/RaptorExample.h
  58. 71 0
      spine-cocos2d-objc/example/RaptorExample.m
  59. 41 0
      spine-cocos2d-objc/example/TankExample.h
  60. 71 0
      spine-cocos2d-objc/example/TankExample.m
  61. 162 170
      spine-cocos2d-objc/spine-cocos2d-objc.xcodeproj/project.pbxproj
  62. 0 1
      spine-cocos2d-objc/src/spine/SkeletonRenderer.h
  63. 2 24
      spine-cocos2d-objc/src/spine/SkeletonRenderer.m
  64. 1 0
      spine-cocos2dx/CMakeLists.txt
  65. 3 2
      spine-cocos2dx/README.md
  66. 1 1
      spine-cocos2dx/example/Classes/AppDelegate.h
  67. 2 2
      spine-cocos2dx/example/Classes/RaptorExample.cpp
  68. 68 0
      spine-cocos2dx/example/Classes/TankExample.cpp
  69. 50 0
      spine-cocos2dx/example/Classes/TankExample.h
  70. 293 0
      spine-cocos2dx/example/Resources/common/goblins-mesh.atlas
  71. 115 114
      spine-cocos2dx/example/Resources/common/goblins-mesh.json
  72. 二進制
      spine-cocos2dx/example/Resources/common/goblins-mesh.png
  73. 116 116
      spine-cocos2dx/example/Resources/common/raptor.atlas
  74. 219 130
      spine-cocos2dx/example/Resources/common/raptor.json
  75. 二進制
      spine-cocos2dx/example/Resources/common/raptor.png
  76. 195 0
      spine-cocos2dx/example/Resources/common/spineboy.atlas
  77. 31 31
      spine-cocos2dx/example/Resources/common/spineboy.json
  78. 二進制
      spine-cocos2dx/example/Resources/common/spineboy.png
  79. 125 0
      spine-cocos2dx/example/Resources/common/tank.atlas
  80. 1899 0
      spine-cocos2dx/example/Resources/common/tank.json
  81. 二進制
      spine-cocos2dx/example/Resources/common/tank.png
  82. 1 1
      spine-cocos2dx/example/proj.ios_mac/ios/AppController.mm
  83. 200 172
      spine-cocos2dx/example/proj.ios_mac/spine-cocos2d-x.xcodeproj/project.pbxproj
  84. 10 2
      spine-cocos2dx/example/proj.win32/spine-cocos2d-x.vcxproj
  85. 30 6
      spine-cocos2dx/example/proj.win32/spine-cocos2d-x.vcxproj.filters
  86. 2 20
      spine-cocos2dx/src/spine/Cocos2dAttachmentLoader.cpp
  87. 1 19
      spine-cocos2dx/src/spine/SkeletonRenderer.cpp
  88. 0 1
      spine-cocos2dx/src/spine/SkeletonRenderer.h
  89. 125 0
      spine-libgdx/spine-libgdx-tests/assets/path/tank.atlas
  90. 1899 0
      spine-libgdx/spine-libgdx-tests/assets/path/tank.json
  91. 二進制
      spine-libgdx/spine-libgdx-tests/assets/path/tank.png
  92. 二進制
      spine-libgdx/spine-libgdx-tests/assets/path/tank.skel
  93. 13 0
      spine-libgdx/spine-libgdx-tests/assets/path/test.atlas
  94. 48 0
      spine-libgdx/spine-libgdx-tests/assets/path/test.json
  95. 二進制
      spine-libgdx/spine-libgdx-tests/assets/path/test.png
  96. 46 0
      spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/PathTest.java
  97. 0 193
      spine-sfml/.cproject
  98. 0 28
      spine-sfml/.project
  99. 0 68
      spine-sfml/.settings/org.eclipse.cdt.codan.core.prefs
  100. 0 163
      spine-sfml/.settings/org.eclipse.cdt.core.prefs

+ 5 - 5
.gitignore

@@ -24,9 +24,9 @@ spine-sfml/Debug/*
 spine-sfml/SFML
 spine-sfml/dependencies
 
-spine-libgdx/spine-libgdx/bin/*
-spine-libgdx/spine-libgdx-tests/bin/*
-spine-libgdx/spine-skeletonviewer/bin/*
+spine-libgdx/spine-libgdx/bin
+spine-libgdx/spine-libgdx-tests/bin
+spine-libgdx/spine-skeletonviewer/bin
 
 spine-cocos2dx/dependencies
 spine-cocos2dx/example/cocos2dx.zip
@@ -35,8 +35,8 @@ spine-cocos2dx/example/cocos2d
 spine-cocos2dx/example/proj.win32/spine-cocos2d-x.VC.opendb
 xcuserdata/
 
-spine-cocos2d-iphone/cocos2d/*
-spine-cocos2d-iphone/spine-cocos2d-iphone-ios.xcodeproj/project.xcworkspace/xcshareddata/
+spine-cocos2d-objc/cocos2d/*
+spine-cocos2d-objc/spine-cocos2d-iphone-objc.xcodeproj/project.xcworkspace/xcshareddata/
 
 spine-csharp/bin
 spine-csharp/obj

+ 1 - 2
spine-c/README.md

@@ -12,7 +12,7 @@ The Spine Runtimes are developed with the intent to be used with data exported f
 
 ## Spine version
 
-spine-c works with data exported from Spine version 3.2.01.
+spine-c works with data exported from Spine version 3.3.07.
 
 spine-c supports all Spine features.
 
@@ -48,4 +48,3 @@ spine-c uses an OOP style of programming where each "class" is made up of a stru
 - [spine-cocos2d-iphone](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2d-iphone)
 - [spine-cocos2dx](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx)
 - [spine-sfml](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-sfml)
-- [spine-torque2d](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-torque2d)

+ 116 - 13
spine-c/include/spine/Animation.h

@@ -64,13 +64,13 @@ void spAnimation_dispose (spAnimation* self);
 
 /** Poses the skeleton at the specified time for this animation.
  * @param lastTime The last time the animation was applied.
- * @param events Any triggered events are added. */
+ * @param events Any triggered events are added. May be null.*/
 void spAnimation_apply (const spAnimation* self, struct spSkeleton* skeleton, float lastTime, float time, int loop,
 		spEvent** events, int* eventsCount);
 
 /** Poses the skeleton at the specified time for this animation mixed with the current pose.
  * @param lastTime The last time the animation was applied.
- * @param events Any triggered events are added.
+ * @param events Any triggered events are added. May be null.
  * @param alpha The amount of this animation that affects the current pose. */
 void spAnimation_mix (const spAnimation* self, struct spSkeleton* skeleton, float lastTime, float time, int loop,
 		spEvent** events, int* eventsCount, float alpha);
@@ -94,9 +94,12 @@ typedef enum {
 	SP_TIMELINE_ATTACHMENT,
 	SP_TIMELINE_EVENT,
 	SP_TIMELINE_DRAWORDER,
-	SP_TIMELINE_FFD,
+	SP_TIMELINE_DEFORM,
 	SP_TIMELINE_IKCONSTRAINT,
-	SP_TIMELINE_TRANSFORMCONSTRAINT
+	SP_TIMELINE_TRANSFORMCONSTRAINT,
+	SP_TIMELINE_PATHCONSTRAINTPOSITION,
+	SP_TIMELINE_PATHCONSTRAINTSPACING,
+	SP_TIMELINE_PATHCONSTRAINTMIX
 } spTimelineType;
 
 struct spTimeline {
@@ -179,6 +182,8 @@ typedef struct spBaseTimeline {
 
 /**/
 
+static const int ROTATE_ENTRIES = 2;
+
 typedef struct spBaseTimeline spRotateTimeline;
 
 spRotateTimeline* spRotateTimeline_create (int framesCount);
@@ -193,6 +198,8 @@ typedef spRotateTimeline RotateTimeline;
 
 /**/
 
+static const int TRANSLATE_ENTRIES = 3;
+
 typedef struct spBaseTimeline spTranslateTimeline;
 
 spTranslateTimeline* spTranslateTimeline_create (int framesCount);
@@ -235,6 +242,8 @@ typedef spShearTimeline ShearTimeline;
 
 /**/
 
+static const int COLOR_ENTRIES = 5;
+
 typedef struct spColorTimeline {
 	spCurveTimeline super;
 	int const framesCount;
@@ -352,7 +361,7 @@ typedef spDrawOrderTimeline DrawOrderTimeline;
 
 /**/
 
-typedef struct spFFDTimeline {
+typedef struct spDeformTimeline {
 	spCurveTimeline super;
 	int const framesCount;
 	float* const frames; /* time, ... */
@@ -362,7 +371,7 @@ typedef struct spFFDTimeline {
 	spAttachment* attachment;
 
 #ifdef __cplusplus
-	spFFDTimeline() :
+	spDeformTimeline() :
 		super(),
 		framesCount(0),
 		frames(0),
@@ -371,20 +380,22 @@ typedef struct spFFDTimeline {
 		slotIndex(0) {
 	}
 #endif
-} spFFDTimeline;
+} spDeformTimeline;
 
-spFFDTimeline* spFFDTimeline_create (int framesCount, int frameVerticesCount);
+spDeformTimeline* spDeformTimeline_create (int framesCount, int frameVerticesCount);
 
-void spFFDTimeline_setFrame (spFFDTimeline* self, int frameIndex, float time, float* vertices);
+void spDeformTimeline_setFrame (spDeformTimeline* self, int frameIndex, float time, float* vertices);
 
 #ifdef SPINE_SHORT_NAMES
-typedef spFFDTimeline FFDTimeline;
-#define FFDTimeline_create(...) spFFDTimeline_create(__VA_ARGS__)
-#define FFDTimeline_setFrame(...) spFFDTimeline_setFrame(__VA_ARGS__)
+typedef spDeformTimeline DeformTimeline;
+#define DeformTimeline_create(...) spDeformTimeline_create(__VA_ARGS__)
+#define DeformTimeline_setFrame(...) spDeformTimeline_setFrame(__VA_ARGS__)
 #endif
 
 /**/
 
+static const int IKCONSTRAINT_ENTRIES = 3;
+
 typedef struct spIkConstraintTimeline {
 	spCurveTimeline super;
 	int const framesCount;
@@ -413,10 +424,12 @@ typedef spIkConstraintTimeline IkConstraintTimeline;
 
 /**/
 
+static const int TRANSFORMCONSTRAINT_ENTRIES = 5;
+
 typedef struct spTransformConstraintTimeline {
 	spCurveTimeline super;
 	int const framesCount;
-	float* const frames; /* time, mix, bendDirection, ... */
+	float* const frames; /* time, rotate mix, translate mix, scale mix, shear mix, ... */
 	int transformConstraintIndex;
 
 #ifdef __cplusplus
@@ -441,6 +454,96 @@ typedef spTransformConstraintTimeline TransformConstraintTimeline;
 
 /**/
 
+static const int PATHCONSTRAINTPOSITION_ENTRIES = 2;
+
+typedef struct spPathConstraintPositionTimeline {
+	spCurveTimeline super;
+	int const framesCount;
+	float* const frames; /* time, rotate mix, translate mix, scale mix, shear mix, ... */
+	int pathConstraintIndex;
+
+#ifdef __cplusplus
+	spPathConstraintPositionTimeline() :
+		super(),
+		framesCount(0),
+		frames(0),
+		pathConstraintIndex(0) {
+	}
+#endif
+} spPathConstraintPositionTimeline;
+
+spPathConstraintPositionTimeline* spPathConstraintPositionTimeline_create (int framesCount);
+
+void spPathConstraintPositionTimeline_setFrame (spPathConstraintPositionTimeline* self, int frameIndex, float time, float value);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spPathConstraintPositionTimeline PathConstraintPositionTimeline;
+#define PathConstraintPositionTimeline_create(...) spPathConstraintPositionTimeline_create(__VA_ARGS__)
+#define PathConstraintPositionTimeline_setFrame(...) spPathConstraintPositionTimeline_setFrame(__VA_ARGS__)
+#endif
+
+/**/
+
+static const int PATHCONSTRAINTSPACING_ENTRIES = 2;
+
+typedef struct spPathConstraintSpacingTimeline {
+	spCurveTimeline super;
+	int const framesCount;
+	float* const frames; /* time, rotate mix, translate mix, scale mix, shear mix, ... */
+	int pathConstraintIndex;
+
+#ifdef __cplusplus
+	spPathConstraintSpacingTimeline() :
+		super(),
+		framesCount(0),
+		frames(0),
+		pathConstraintIndex(0) {
+	}
+#endif
+} spPathConstraintSpacingTimeline;
+
+spPathConstraintSpacingTimeline* spPathConstraintSpacingTimeline_create (int framesCount);
+
+void spPathConstraintSpacingTimeline_setFrame (spPathConstraintSpacingTimeline* self, int frameIndex, float time, float value);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spPathConstraintSpacingTimeline PathConstraintSpacingTimeline;
+#define PathConstraintSpacingTimeline_create(...) spPathConstraintSpacingTimeline_create(__VA_ARGS__)
+#define PathConstraintSpacingTimeline_setFrame(...) spPathConstraintSpacingTimeline_setFrame(__VA_ARGS__)
+#endif
+
+/**/
+
+static const int PATHCONSTRAINTMIX_ENTRIES = 3;
+
+typedef struct spPathConstraintMixTimeline {
+	spCurveTimeline super;
+	int const framesCount;
+	float* const frames; /* time, rotate mix, translate mix, scale mix, shear mix, ... */
+	int pathConstraintIndex;
+
+#ifdef __cplusplus
+	spPathConstraintMixTimeline() :
+		super(),
+		framesCount(0),
+		frames(0),
+		pathConstraintIndex(0) {
+	}
+#endif
+} spPathConstraintMixTimeline;
+
+spPathConstraintMixTimeline* spPathConstraintMixTimeline_create (int framesCount);
+
+void spPathConstraintMixTimeline_setFrame (spPathConstraintMixTimeline* self, int frameIndex, float time, float rotateMix, float translateMix);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spPathConstraintMixTimeline PathConstraintMixTimeline;
+#define PathConstraintMixTimeline_create(...) spPathConstraintMixTimeline_create(__VA_ARGS__)
+#define PathConstraintMixTimeline_setFrame(...) spPathConstraintMixTimeline_setFrame(__VA_ARGS__)
+#endif
+
+/**/
+
 #ifdef __cplusplus
 }
 #endif

+ 1 - 4
spine-c/include/spine/Attachment.h

@@ -42,9 +42,8 @@ typedef enum {
 	SP_ATTACHMENT_REGION,
 	SP_ATTACHMENT_BOUNDING_BOX,
 	SP_ATTACHMENT_MESH,
-	SP_ATTACHMENT_WEIGHTED_MESH,
 	SP_ATTACHMENT_LINKED_MESH,
-	SP_ATTACHMENT_WEIGHTED_LINKED_MESH
+	SP_ATTACHMENT_PATH
 } spAttachmentType;
 
 typedef struct spAttachment {
@@ -69,9 +68,7 @@ typedef spAttachmentType AttachmentType;
 #define ATTACHMENT_REGION SP_ATTACHMENT_REGION
 #define ATTACHMENT_BOUNDING_BOX SP_ATTACHMENT_BOUNDING_BOX
 #define ATTACHMENT_MESH SP_ATTACHMENT_MESH
-#define ATTACHMENT_WEIGHTED_MESH SP_ATTACHMENT_WEIGHTED_MESH
 #define ATTACHMENT_LINKED_MESH SP_ATTACHMENT_LINKED_MESH
-#define ATTACHMENT_WEIGHTED_LINKED_MESH SP_ATTACHMENT_WEIGHTED_LINKED_MESH
 typedef spAttachment Attachment;
 #define Attachment_dispose(...) spAttachment_dispose(__VA_ARGS__)
 #endif

+ 19 - 3
spine-c/include/spine/Bone.h

@@ -45,24 +45,31 @@ struct spBone {
 	spBoneData* const data;
 	struct spSkeleton* const skeleton;
 	spBone* const parent;
+	int childrenCount;
+	spBone** const children;
 	float x, y, rotation, scaleX, scaleY, shearX, shearY;
-	float appliedRotation, appliedScaleX, appliedScaleY;
+	float appliedRotation;
 
 	float const a, b, worldX;
 	float const c, d, worldY;
 	float const worldSignX, worldSignY;
 
+	int/*bool*/ sorted;
+
 #ifdef __cplusplus
 	spBone() :
 		data(0),
 		skeleton(0),
 		parent(0),
+		childrenCount(0), children(0),
 		x(0), y(0), rotation(0), scaleX(0), scaleY(0),
-		appliedRotation(0), appliedScaleX(0), appliedScaleY(0),
+		appliedRotation(0),
 
 		a(0), b(0), worldX(0),
 		c(0), d(0), worldY(0),
-		worldSignX(0), worldSignY(0) {
+		worldSignX(0), worldSignY(0),
+		
+		sorted(0) {
 	}
 #endif
 };
@@ -84,6 +91,11 @@ float spBone_getWorldRotationY (spBone* self);
 float spBone_getWorldScaleX (spBone* self);
 float spBone_getWorldScaleY (spBone* self);
 
+float spBone_worldToLocalRotationX (spBone* self);
+float spBone_worldToLocalRotationY (spBone* self);
+void spBone_rotateWorld (spBone* self, float degrees);
+void spBone_updateLocalTransform (spBone* self);
+
 void spBone_worldToLocal (spBone* self, float worldX, float worldY, float* localX, float* localY);
 void spBone_localToWorld (spBone* self, float localX, float localY, float* worldX, float* worldY);
 
@@ -100,6 +112,10 @@ typedef spBone Bone;
 #define Bone_getWorldRotationY(...) spBone_getWorldRotationY(__VA_ARGS__)
 #define Bone_getWorldScaleX(...) spBone_getWorldScaleX(__VA_ARGS__)
 #define Bone_getWorldScaleY(...) spBone_getWorldScaleY(__VA_ARGS__)
+#define Bone_worldToLocalRotationX(...) spBone_worldToLocalRotationX(__VA_ARGS__)
+#define Bone_worldToLocalRotationY(...) spBone_worldToLocalRotationY(__VA_ARGS__)
+#define Bone_rotateWorld(...) spBone_rotateWorld(__VA_ARGS__)
+#define Bone_updateLocalTransform(...) spBone_updateLocalTransform(__VA_ARGS__)
 #define Bone_worldToLocal(...) spBone_worldToLocal(__VA_ARGS__)
 #define Bone_localToWorld(...) spBone_localToWorld(__VA_ARGS__)
 #endif

+ 6 - 3
spine-c/include/spine/BoneData.h

@@ -38,26 +38,29 @@ extern "C" {
 
 typedef struct spBoneData spBoneData;
 struct spBoneData {
+	const int index;
 	const char* const name;
 	spBoneData* const parent;
 	float length;
 	float x, y, rotation, scaleX, scaleY, shearX, shearY;
-	int/*bool*/inheritScale, inheritRotation;
+	int/*bool*/inheritRotation, inheritScale;
 
 #ifdef __cplusplus
 	spBoneData() :
+		index(0),
 		name(0),
 		parent(0),
 		length(0),
 		x(0), y(0),
 		rotation(0),
 		scaleX(0), scaleY(0),
-		inheritScale(0), inheritRotation(0) {
+		shearX(0), shearY(0),
+		inheritRotation(0), inheritScale(0) {
 	}
 #endif
 };
 
-spBoneData* spBoneData_create (const char* name, spBoneData* parent);
+spBoneData* spBoneData_create (int index, const char* name, spBoneData* parent);
 void spBoneData_dispose (spBoneData* self);
 
 #ifdef SPINE_SHORT_NAMES

+ 3 - 4
spine-c/include/spine/BoundingBoxAttachment.h

@@ -33,6 +33,7 @@
 #define SPINE_BOUNDINGBOXATTACHMENT_H_
 
 #include <spine/Attachment.h>
+#include <spine/VertexAttachment.h>
 #include <spine/Atlas.h>
 #include <spine/Slot.h>
 
@@ -41,13 +42,11 @@ extern "C" {
 #endif
 
 typedef struct spBoundingBoxAttachment {
-	spAttachment super;
-	int verticesCount;
-	float* vertices;
+	spVertexAttachment super;
 } spBoundingBoxAttachment;
 
 spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name);
-void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spBone* bone, float* vertices);
+void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spSlot* slot, float* worldVertices);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spBoundingBoxAttachment BoundingBoxAttachment;

+ 4 - 1
spine-c/include/spine/IkConstraint.h

@@ -51,6 +51,8 @@ typedef struct spIkConstraint {
 	int bendDirection;
 	float mix;
 
+	int level;
+
 #ifdef __cplusplus
 	spIkConstraint() :
 		data(0),
@@ -58,7 +60,8 @@ typedef struct spIkConstraint {
 		bones(0),
 		target(0),
 		bendDirection(0),
-		mix(0) {
+		mix(0),
+		level(0) {
 	}
 #endif
 } spIkConstraint;

+ 14 - 14
spine-c/include/spine/MeshAttachment.h

@@ -33,6 +33,7 @@
 #define SPINE_MESHATTACHMENT_H_
 
 #include <spine/Attachment.h>
+#include <spine/VertexAttachment.h>
 #include <spine/Atlas.h>
 #include <spine/Slot.h>
 
@@ -42,12 +43,16 @@ extern "C" {
 
 typedef struct spMeshAttachment spMeshAttachment;
 struct spMeshAttachment {
-	spAttachment super;
-	const char* path;
+	spVertexAttachment super;
 
-	int verticesCount;
-	float* vertices;
-	int hullLength;
+	void* rendererObject;
+	int regionOffsetX, regionOffsetY; /* Pixels stripped from the bottom left, unrotated. */
+	int regionWidth, regionHeight; /* Unrotated, stripped pixel size. */
+	int regionOriginalWidth, regionOriginalHeight; /* Unrotated, unstripped pixel size. */
+	float regionU, regionV, regionU2, regionV2;
+	int/*bool*/regionRotate;
+
+	const char* path;
 
 	float* regionUVs;
 	float* uvs;
@@ -55,17 +60,12 @@ struct spMeshAttachment {
 	int trianglesCount;
 	unsigned short* triangles;
 
-	spMeshAttachment* const parentMesh;
-	int/*bool*/inheritFFD;
-
 	float r, g, b, a;
 
-	void* rendererObject;
-	int regionOffsetX, regionOffsetY; /* Pixels stripped from the bottom left, unrotated. */
-	int regionWidth, regionHeight; /* Unrotated, stripped pixel size. */
-	int regionOriginalWidth, regionOriginalHeight; /* Unrotated, unstripped pixel size. */
-	float regionU, regionV, regionU2, regionV2;
-	int/*bool*/regionRotate;
+	int hullLength;
+
+	spMeshAttachment* const parentMesh;
+	int/*bool*/inheritDeform;
 
 	/* Nonessential. */
 	int edgesCount;

+ 65 - 0
spine-c/include/spine/PathAttachment.h

@@ -0,0 +1,65 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#ifndef SPINE_PATHATTACHMENT_H_
+#define SPINE_PATHATTACHMENT_H_
+
+#include <spine/Attachment.h>
+#include <spine/VertexAttachment.h>
+#include <spine/Atlas.h>
+#include <spine/Slot.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct spPathAttachment {
+	spVertexAttachment super;
+	int lengthsLength;
+	float* lengths;
+	int/*bool*/ closed, constantSpeed;
+} spPathAttachment;
+
+spPathAttachment* spPathAttachment_create (const char* name);
+void spPathAttachment_computeWorldVertices (spPathAttachment* self, spSlot* slot, float* worldVertices);
+void spPathAttachment_computeWorldVertices1 (spPathAttachment* self, spSlot* slot, int start, int count, float* worldVertices, int offset);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spPathAttachment PathAttachment;
+#define PathAttachment_create(...) spPathAttachment_create(__VA_ARGS__)
+#define PathAttachment_computeWorldVertices(...) spPathAttachment_computeWorldVertices(__VA_ARGS__)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SPINE_PATHATTACHMENT_H_ */

+ 113 - 0
spine-c/include/spine/PathConstraint.h

@@ -0,0 +1,113 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#ifndef SPINE_PATHCONSTRAINT_H_
+#define SPINE_PATHCONSTRAINT_H_
+
+#include <spine/PathConstraintData.h>
+#include <spine/Bone.h>
+#include <spine/Slot.h>
+#include "PathAttachment.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct spSkeleton;
+
+typedef struct spPathConstraint {
+	spPathConstraintData* const data;
+	int bonesCount;
+	spBone** const bones;
+	spSlot* target;
+	float position, spacing, rotateMix, translateMix;
+
+	int spacesCount;
+	float* spaces;
+
+	int positionsCount;
+	float* positions;
+
+	int worldCount;
+	float* world;
+
+	int curvesCount;
+	float* curves;
+
+	int lengthsCount;
+	float* lengths;
+
+	float segments[10];
+
+#ifdef __cplusplus
+	spPathConstraint() :
+		data(0),
+		bonesCount(0),
+		bones(0),
+		target(0),
+		position(0),
+		spacing(0),
+		rotateMix(0),
+		translateMix(0),
+		spacesCount(0),
+		spaces(0),
+		positionsCount(0),
+		positions(0),
+		worldCount(0),
+		world(0),
+		curvesCount(0),
+		curves(0),
+		lengthsCount(0),
+		lengths(0) {
+	}
+#endif
+} spPathConstraint;
+
+#define SP_PATHCONSTRAINT_
+
+spPathConstraint* spPathConstraint_create (spPathConstraintData* data, const struct spSkeleton* skeleton);
+void spPathConstraint_dispose (spPathConstraint* self);
+
+void spPathConstraint_apply (spPathConstraint* self);
+float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAttachment* path, int spacesCount, int/*bool*/ tangents, int/*bool*/percentPosition, int/**/percentSpacing);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spPathConstraint PathConstraint;
+#define PathConstraint_create(...) spPathConstraint_create(__VA_ARGS__)
+#define PathConstraint_dispose(...) spPathConstraint_dispose(__VA_ARGS__)
+#define PathConstraint_apply(...) spPathConstraint_apply(__VA_ARGS__)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SPINE_PATHCONSTRAINT_H_ */

+ 96 - 0
spine-c/include/spine/PathConstraintData.h

@@ -0,0 +1,96 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#ifndef SPINE_PATHCONSTRAINTDATA_H_
+#define SPINE_PATHCONSTRAINTDATA_H_
+
+#include <spine/BoneData.h>
+#include <spine/SlotData.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+	SP_POSITION_MODE_FIXED, SP_POSITION_MODE_PERCENT
+} spPositionMode;
+
+typedef enum {
+	SP_SPACING_MODE_LENGTH, SP_SPACING_MODE_FIXED, SP_SPACING_MODE_PERCENT
+} spSpacingMode;
+
+typedef enum {
+	SP_ROTATE_MODE_TANGENT, SP_ROTATE_MODE_CHAIN, SP_ROTATE_MODE_CHAIN_SCALE
+} spRotateMode;
+
+typedef struct spPathConstraintData {
+	const char* const name;
+	int bonesCount;
+	spBoneData** const bones;
+	spSlotData* target;
+	spPositionMode positionMode;
+	spSpacingMode spacingMode;
+	spRotateMode rotateMode;
+	float offsetRotation;
+	float position, spacing, rotateMix, translateMix;
+
+#ifdef __cplusplus
+	spPathConstraintData() :
+		name(0),
+		bonesCount(0),
+		bones(0),
+		target(0),
+		positionMode(SP_POSITION_MODE_FIXED),
+		spacingMode(SP_SPACING_MODE_LENGTH),
+		rotateMode(SP_ROTATE_MODE_TANGENT),
+		offsetRotation(0),
+		position(0),
+		spacing(0),
+		rotateMix(0),
+		translateMix(0) {
+	}
+#endif
+} spPathConstraintData;
+
+spPathConstraintData* spPathConstraintData_create (const char* name);
+void spPathConstraintData_dispose (spPathConstraintData* self);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spPathConstraintData PathConstraintData;
+#define PathConstraintData_create(...) spPathConstraintData_create(__VA_ARGS__)
+#define PathConstraintData_dispose(...) spPathConstraintData_dispose(__VA_ARGS__)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SPINE_PATHCONSTRAINTDATA_H_ */

+ 12 - 2
spine-c/include/spine/Skeleton.h

@@ -37,6 +37,7 @@
 #include <spine/Skin.h>
 #include <spine/IkConstraint.h>
 #include <spine/TransformConstraint.h>
+#include <spine/PathConstraint.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -55,10 +56,14 @@ typedef struct spSkeleton {
 
 	int ikConstraintsCount;
 	spIkConstraint** ikConstraints;
+	spIkConstraint** ikConstraintsSorted;
 
 	int transformConstraintsCount;
 	spTransformConstraint** transformConstraints;
 
+	int pathConstraintsCount;
+	spPathConstraint** pathConstraints;
+
 	spSkin* const skin;
 	float r, g, b, a;
 	float time;
@@ -77,6 +82,7 @@ typedef struct spSkeleton {
 
 		ikConstraintsCount(0),
 		ikConstraints(0),
+		ikConstraintsSorted(0),
 
 		transformConstraintsCount(0),
 		transformConstraints(0),
@@ -94,8 +100,9 @@ typedef struct spSkeleton {
 spSkeleton* spSkeleton_create (spSkeletonData* data);
 void spSkeleton_dispose (spSkeleton* self);
 
-/* Caches information about bones and constraints. Must be called if bones or constraints are added or removed. */
-void spSkeleton_updateCache (const spSkeleton* self);
+/* Caches information about bones and constraints. Must be called if bones or constraints, or weighted path attachments
+ * are added or removed. */
+void spSkeleton_updateCache (spSkeleton* self);
 void spSkeleton_updateWorldTransform (const spSkeleton* self);
 
 /* Sets the bones, constraints, and slots to their setup pose values. */
@@ -137,6 +144,9 @@ spIkConstraint* spSkeleton_findIkConstraint (const spSkeleton* self, const char*
 /* Returns 0 if the transform constraint was not found. */
 spTransformConstraint* spSkeleton_findTransformConstraint (const spSkeleton* self, const char* constraintName);
 
+/* Returns 0 if the path constraint was not found. */
+spPathConstraint* spSkeleton_findPathConstraint (const spSkeleton* self, const char* constraintName);
+
 void spSkeleton_update (spSkeleton* self, float deltaTime);
 
 #ifdef SPINE_SHORT_NAMES

+ 6 - 0
spine-c/include/spine/SkeletonData.h

@@ -39,6 +39,7 @@
 #include <spine/Animation.h>
 #include <spine/IkConstraintData.h>
 #include <spine/TransformConstraintData.h>
+#include <spine/PathConstraintData.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -70,6 +71,9 @@ typedef struct spSkeletonData {
 
 	int transformConstraintsCount;
 	spTransformConstraintData** transformConstraints;
+
+	int pathConstraintsCount;
+	spPathConstraintData** pathConstraints;
 } spSkeletonData;
 
 spSkeletonData* spSkeletonData_create ();
@@ -91,6 +95,8 @@ spIkConstraintData* spSkeletonData_findIkConstraint (const spSkeletonData* self,
 
 spTransformConstraintData* spSkeletonData_findTransformConstraint (const spSkeletonData* self, const char* constraintName);
 
+spPathConstraintData* spSkeletonData_findPathConstraint (const spSkeletonData* self, const char* constraintName);
+
 #ifdef SPINE_SHORT_NAMES
 typedef spSkeletonData SkeletonData;
 #define SkeletonData_create(...) spSkeletonData_create(__VA_ARGS__)

+ 14 - 0
spine-c/include/spine/Skin.h

@@ -50,6 +50,20 @@ typedef struct spSkin {
 #endif
 } spSkin;
 
+/* Private structs, needed by Skeleton */
+typedef struct _Entry _Entry;
+struct _Entry {
+	int slotIndex;
+	const char* name;
+	spAttachment* attachment;
+	_Entry* next;
+};
+
+typedef struct {
+	spSkin super;
+	_Entry* entries;
+} _spSkin;
+
 spSkin* spSkin_create (const char* name);
 void spSkin_dispose (spSkin* self);
 

+ 3 - 1
spine-c/include/spine/SlotData.h

@@ -43,6 +43,7 @@ typedef enum {
 } spBlendMode;
 
 typedef struct spSlotData {
+	const int index;
 	const char* const name;
 	const spBoneData* const boneData;
 	const char* attachmentName;
@@ -51,6 +52,7 @@ typedef struct spSlotData {
 
 #ifdef __cplusplus
 	spSlotData() :
+		index(0),
 		name(0),
 		boneData(0),
 		attachmentName(0),
@@ -60,7 +62,7 @@ typedef struct spSlotData {
 #endif
 } spSlotData;
 
-spSlotData* spSlotData_create (const char* name, spBoneData* boneData);
+spSlotData* spSlotData_create (const int index, const char* name, spBoneData* boneData);
 void spSlotData_dispose (spSlotData* self);
 
 /* @param attachmentName May be 0 for no setup pose attachment. */

+ 5 - 10
spine-c/include/spine/TransformConstraint.h

@@ -43,26 +43,21 @@ struct spSkeleton;
 
 typedef struct spTransformConstraint {
 	spTransformConstraintData* const data;
-	spBone* bone;
+	int bonesCount;
+	spBone** const bones;
 	spBone* target;
 	float rotateMix, translateMix, scaleMix, shearMix;
-	float offsetRotation, offsetX, offsetY, offsetScaleX, offsetScaleY, offsetShearY;
 
 #ifdef __cplusplus
 	spTransformConstraint() :
 		data(0),
-		bone(0),
+		bonesCount(0),
+		bones(0),
 		target(0),
 		rotateMix(0),
 		translateMix(0),
 		scaleMix(0),
-		shearMix(0),
-		offsetRotation(0),
-		offsetX(0),
-		offsetY(0),
-		offsetScaleX(0),
-		offsetScaleY(0),
-		offsetShearY(0) {
+		shearMix(0) {
 	}
 #endif
 } spTransformConstraint;

+ 4 - 3
spine-c/include/spine/TransformConstraintData.h

@@ -40,8 +40,8 @@ extern "C" {
 
 typedef struct spTransformConstraintData {
 	const char* const name;
-
-	spBoneData* bone;
+	int bonesCount;
+	spBoneData** const bones;
 	spBoneData* target;
 	float rotateMix, translateMix, scaleMix, shearMix;
 	float offsetRotation, offsetX, offsetY, offsetScaleX, offsetScaleY, offsetShearY;
@@ -49,7 +49,8 @@ typedef struct spTransformConstraintData {
 #ifdef __cplusplus
 	spTransformConstraintData() :
 		name(0),
-		bone(0),
+		bonesCount(0),
+		bones(0),
 		target(0),
 		rotateMix(0),
 		translateMix(0),

+ 13 - 41
spine-c/include/spine/WeightedMeshAttachment.h → spine-c/include/spine/VertexAttachment.h

@@ -29,8 +29,8 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *****************************************************************************/
 
-#ifndef SPINE_WEIGHTEDMESHATTACHMENT_H_
-#define SPINE_WEIGHTEDMESHATTACHMENT_H_
+#ifndef SPINE_VERTEXATTACHMENT_H_
+#define SPINE_VERTEXATTACHMENT_H_
 
 #include <spine/Attachment.h>
 #include <spine/Slot.h>
@@ -39,58 +39,30 @@
 extern "C" {
 #endif
 
-typedef struct spWeightedMeshAttachment spWeightedMeshAttachment;
-struct spWeightedMeshAttachment {
+typedef struct spVertexAttachment spVertexAttachment;
+struct spVertexAttachment {
 	spAttachment super;
-	const char* path;
 
 	int bonesCount;
 	int* bones;
 
-	int weightsCount;
-	float* weights;
+	int verticesCount;
+	float* vertices;
 
-	int trianglesCount;
-	unsigned short* triangles;
-
-	int uvsCount;
-	float* regionUVs;
-	float* uvs;
-	int hullLength;
-
-	spWeightedMeshAttachment* const parentMesh;
-	int/*bool*/inheritFFD;
-
-	float r, g, b, a;
-
-	void* rendererObject;
-	int regionOffsetX, regionOffsetY; /* Pixels stripped from the bottom left, unrotated. */
-	int regionWidth, regionHeight; /* Unrotated, stripped pixel size. */
-	int regionOriginalWidth, regionOriginalHeight; /* Unrotated, unstripped pixel size. */
-	float regionU, regionV, regionU2, regionV2;
-	int/*bool*/regionRotate;
-
-	/* Nonessential. */
-	int edgesCount;
-	int* edges;
-	float width, height;
+	int worldVerticesLength;
 };
 
-spWeightedMeshAttachment* spWeightedMeshAttachment_create (const char* name);
-void spWeightedMeshAttachment_updateUVs (spWeightedMeshAttachment* self);
-void spWeightedMeshAttachment_computeWorldVertices (spWeightedMeshAttachment* self, spSlot* slot, float* worldVertices);
-void spWeightedMeshAttachment_setParentMesh (spWeightedMeshAttachment* self, spWeightedMeshAttachment* parentMesh);
+void spVertexAttachment_computeWorldVertices (spVertexAttachment* self, spSlot* slot, float* worldVertices);
+void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int start, int count, spSlot* slot, float* worldVertices, int offset);
 
 #ifdef SPINE_SHORT_NAMES
-typedef spWeightedMeshAttachment WeightedMeshAttachment;
-#define WeightedMeshAttachment_create(...) spWeightedMeshAttachment_create(__VA_ARGS__)
-#define WeightedMeshAttachment_updateUVs(...) spWeightedMeshAttachment_updateUVs(__VA_ARGS__)
-#define WeightedMeshAttachment_computeWorldVertices(...) spWeightedMeshAttachment_computeWorldVertices(__VA_ARGS__)
-#define WeightedMeshAttachment_setParentMesh(...) spWeightedMeshAttachment_setParentMesh(__VA_ARGS__)
+typedef spVertexAttachment VertexAttachment;
+#define VertexAttachment_computeWorldVertices(...) spVertexAttachment_computeWorldVertices(__VA_ARGS__)
+#define VertexAttachment_computeWorldVertices1(...) spVertexAttachment_computeWorldVertices1(__VA_ARGS__)
 #endif
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* SPINE_WEIGHTEDMESHATTACHMENT_H_ */
+#endif /* SPINE_VERTEXATTACHMENT_H_ */

+ 8 - 1
spine-c/include/spine/extension.h

@@ -82,6 +82,10 @@
 #define ACOS(A) (float)acos(A)
 #endif
 
+#define CLAMP(x, min, max) (x < min ? min : (x > max ? max : x))
+#define MIN(x, y) (x < y ? x : y)
+#define MAX(x, y) (x > y ? x : y)
+
 #define UNUSED(x) (void)(x)
 
 #include <stdlib.h>
@@ -91,10 +95,11 @@
 #include <spine/Animation.h>
 #include <spine/Atlas.h>
 #include <spine/AttachmentLoader.h>
+#include <spine/VertexAttachment.h>
 #include <spine/RegionAttachment.h>
 #include <spine/MeshAttachment.h>
-#include <spine/WeightedMeshAttachment.h>
 #include <spine/BoundingBoxAttachment.h>
+#include <spine/PathAttachment.h>
 #include <spine/AnimationState.h>
 
 #ifdef __cplusplus
@@ -178,10 +183,12 @@ void _spAttachmentLoader_setUnknownTypeError (spAttachmentLoader* self, spAttach
 void _spAttachment_init (spAttachment* self, const char* name, spAttachmentType type,
 void (*dispose) (spAttachment* self));
 void _spAttachment_deinit (spAttachment* self);
+void _spVertexAttachment_deinit (spVertexAttachment* self);
 
 #ifdef SPINE_SHORT_NAMES
 #define _Attachment_init(...) _spAttachment_init(__VA_ARGS__)
 #define _Attachment_deinit(...) _spAttachment_deinit(__VA_ARGS__)
+#define _VertexAttachment_deinit(...) _spVertexAttachment_deinit(__VA_ARGS__)
 #endif
 
 /**/

+ 1 - 1
spine-c/include/spine/spine.h

@@ -42,8 +42,8 @@
 #include <spine/Bone.h>
 #include <spine/BoneData.h>
 #include <spine/RegionAttachment.h>
+#include <spine/VertexAttachment.h>
 #include <spine/MeshAttachment.h>
-#include <spine/WeightedMeshAttachment.h>
 #include <spine/BoundingBoxAttachment.h>
 #include <spine/Skeleton.h>
 #include <spine/SkeletonBounds.h>

+ 278 - 172
spine-c/src/spine/Animation.c

@@ -111,7 +111,7 @@ void spTimeline_apply (const spTimeline* self, spSkeleton* skeleton, float lastT
 /**/
 
 static const float CURVE_LINEAR = 0, CURVE_STEPPED = 1, CURVE_BEZIER = 2;
-static const int BEZIER_SEGMENTS = 10, BEZIER_SIZE = 10 * 2 - 1;
+static const int BEZIER_SIZE = 10 * 2 - 1;
 
 void _spCurveTimeline_init (spCurveTimeline* self, spTimelineType type, int framesCount, /**/
 void (*dispose) (spTimeline* self), /**/
@@ -135,12 +135,10 @@ void spCurveTimeline_setStepped (spCurveTimeline* self, int frameIndex) {
 }
 
 void spCurveTimeline_setCurve (spCurveTimeline* self, int frameIndex, float cx1, float cy1, float cx2, float cy2) {
-	float subdiv1 = 1.0f / BEZIER_SEGMENTS, subdiv2 = subdiv1 * subdiv1, subdiv3 = subdiv2 * subdiv1;
-	float pre1 = 3 * subdiv1, pre2 = 3 * subdiv2, pre4 = 6 * subdiv2, pre5 = 6 * subdiv3;
-	float tmp1x = -cx1 * 2 + cx2, tmp1y = -cy1 * 2 + cy2, tmp2x = (cx1 - cx2) * 3 + 1, tmp2y = (cy1 - cy2) * 3 + 1;
-	float dfx = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv3, dfy = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv3;
-	float ddfx = tmp1x * pre4 + tmp2x * pre5, ddfy = tmp1y * pre4 + tmp2y * pre5;
-	float dddfx = tmp2x * pre5, dddfy = tmp2y * pre5;
+	float tmpx = (-cx1 * 2 + cx2) * 0.03f, tmpy = (-cy1 * 2 + cy2) * 0.03f;
+	float dddfx = ((cx1 - cx2) * 3 + 1) * 0.006f, dddfy = ((cy1 - cy2) * 3 + 1) * 0.006f;
+	float ddfx = tmpx * 2 + dddfx, ddfy = tmpy * 2 + dddfy;
+	float dfx = cx1 * 0.3f + tmpx + dddfx * 0.16666667f, dfy = cy1 * 0.3f + tmpy + dddfy * 0.16666667f;
 	float x = dfx, y = dfy;
 
 	int i = frameIndex * BEZIER_SIZE, n = i + BEZIER_SIZE - 1;
@@ -162,6 +160,7 @@ float spCurveTimeline_getCurvePercent (const spCurveTimeline* self, int frameInd
 	float x, y;
 	int i = frameIndex * BEZIER_SIZE, start, n;
 	float type = self->curves[i];
+	percent = CLAMP(percent, 0, 1);
 	if (type == CURVE_LINEAR) return percent;
 	if (type == CURVE_STEPPED) return 0;
 	i++;
@@ -218,15 +217,6 @@ static int binarySearch1 (float *values, int valuesLength, float target) {
 	return 0;
 }
 
-/*static int linearSearch (float *values, int valuesLength, float target, int step) {
- int i, last = valuesLength - step;
- for (i = 0; i <= last; i += step) {
- if (values[i] <= target) continue;
- return i;
- }
- return -1;
- }*/
-
 /**/
 
 void _spBaseTimeline_dispose (spTimeline* timeline) {
@@ -251,14 +241,14 @@ struct spBaseTimeline* _spBaseTimeline_create (int framesCount, spTimelineType t
 
 /**/
 
-static const int ROTATE_PREV_TIME = -2;
-static const int ROTATE_FRAME = 1;
+static const int ROTATE_PREV_TIME = -2, ROTATE_PREV_ROTATION = -1;
+static const int ROTATE_ROTATION = 1;
 
 void _spRotateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
 		int* eventsCount, float alpha) {
 	spBone *bone;
 	int frame;
-	float prevFrameValue, frameTime, percent, amount;
+	float prevRotation, frameTime, percent, amount;
 
 	spRotateTimeline* self = SUB_CAST(spRotateTimeline, timeline);
 
@@ -266,8 +256,8 @@ void _spRotateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton,
 
 	bone = skeleton->bones[self->boneIndex];
 
-	if (time >= self->frames[self->framesCount - 2]) { /* Time is after last frame. */
-		amount = bone->data->rotation + self->frames[self->framesCount - 1] - bone->rotation;
+	if (time >= self->frames[self->framesCount - ROTATE_ENTRIES]) { /* Time is after last frame. */
+		amount = bone->data->rotation + self->frames[self->framesCount + ROTATE_PREV_ROTATION] - bone->rotation;
 		while (amount > 180)
 			amount -= 360;
 		while (amount < -180)
@@ -277,18 +267,17 @@ void _spRotateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton,
 	}
 
 	/* Interpolate between the previous frame and the current frame. */
-	frame = binarySearch(self->frames, self->framesCount, time, 2);
-	prevFrameValue = self->frames[frame - 1];
+	frame = binarySearch(self->frames, self->framesCount, time, ROTATE_ENTRIES);
+	prevRotation = self->frames[frame + ROTATE_PREV_ROTATION];
 	frameTime = self->frames[frame];
-	percent = 1 - (time - frameTime) / (self->frames[frame + ROTATE_PREV_TIME] - frameTime);
-	percent = spCurveTimeline_getCurvePercent(SUPER(self), (frame >> 1) - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), (frame >> 1) - 1, 1 - (time - frameTime) / (self->frames[frame + ROTATE_PREV_TIME] - frameTime));
 
-	amount = self->frames[frame + ROTATE_FRAME] - prevFrameValue;
+	amount = self->frames[frame + ROTATE_ROTATION] - prevRotation;
 	while (amount > 180)
 		amount -= 360;
 	while (amount < -180)
 		amount += 360;
-	amount = bone->data->rotation + (prevFrameValue + amount * percent) - bone->rotation;
+	amount = bone->data->rotation + (prevRotation + amount * percent) - bone->rotation;
 	while (amount > 180)
 		amount -= 360;
 	while (amount < -180)
@@ -301,26 +290,25 @@ void _spRotateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton,
 }
 
 spRotateTimeline* spRotateTimeline_create (int framesCount) {
-	return _spBaseTimeline_create(framesCount, SP_TIMELINE_ROTATE, 2, _spRotateTimeline_apply);
+	return _spBaseTimeline_create(framesCount, SP_TIMELINE_ROTATE, ROTATE_ENTRIES, _spRotateTimeline_apply);
 }
 
-void spRotateTimeline_setFrame (spRotateTimeline* self, int frameIndex, float time, float angle) {
-	frameIndex *= 2;
+void spRotateTimeline_setFrame (spRotateTimeline* self, int frameIndex, float time, float degrees) {
+	frameIndex <<= 1;
 	self->frames[frameIndex] = time;
-	self->frames[frameIndex + 1] = angle;
+	self->frames[frameIndex + ROTATE_ROTATION] = degrees;
 }
 
 /**/
 
-static const int TRANSLATE_PREV_TIME = -3;
-static const int TRANSLATE_X = 1;
-static const int TRANSLATE_Y = 2;
+static const int TRANSLATE_PREV_TIME = -3, TRANSLATE_PREV_X = -2, TRANSLATE_PREV_Y = -1;
+static const int TRANSLATE_X = 1, TRANSLATE_Y = 2;
 
 void _spTranslateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
 		spEvent** firedEvents, int* eventsCount, float alpha) {
 	spBone *bone;
 	int frame;
-	float prevFrameX, prevFrameY, frameTime, percent;
+	float prevX, prevY, frameTime, percent;
 
 	spTranslateTimeline* self = SUB_CAST(spTranslateTimeline, timeline);
 
@@ -328,24 +316,21 @@ void _spTranslateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleto
 
 	bone = skeleton->bones[self->boneIndex];
 
-	if (time >= self->frames[self->framesCount - 3]) { /* Time is after last frame. */
-		bone->x += (bone->data->x + self->frames[self->framesCount - 2] - bone->x) * alpha;
-		bone->y += (bone->data->y + self->frames[self->framesCount - 1] - bone->y) * alpha;
+	if (time >= self->frames[self->framesCount - TRANSLATE_ENTRIES]) { /* Time is after last frame. */
+		bone->x += (bone->data->x + self->frames[self->framesCount + TRANSLATE_PREV_X] - bone->x) * alpha;
+		bone->y += (bone->data->y + self->frames[self->framesCount + TRANSLATE_PREV_Y] - bone->y) * alpha;
 		return;
 	}
 
 	/* Interpolate between the previous frame and the current frame. */
-	frame = binarySearch(self->frames, self->framesCount, time, 3);
-	prevFrameX = self->frames[frame - 2];
-	prevFrameY = self->frames[frame - 1];
+	frame = binarySearch(self->frames, self->framesCount, time, TRANSLATE_ENTRIES);
+	prevX = self->frames[frame + TRANSLATE_PREV_X];
+	prevY = self->frames[frame + TRANSLATE_PREV_Y];
 	frameTime = self->frames[frame];
-	percent = 1 - (time - frameTime) / (self->frames[frame + TRANSLATE_PREV_TIME] - frameTime);
-	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / TRANSLATE_ENTRIES - 1, 1 - (time - frameTime) / (self->frames[frame + TRANSLATE_PREV_TIME] - frameTime));
 
-	bone->x += (bone->data->x + prevFrameX + (self->frames[frame + TRANSLATE_X] - prevFrameX) * percent - bone->x)
-			* alpha;
-	bone->y += (bone->data->y + prevFrameY + (self->frames[frame + TRANSLATE_Y] - prevFrameY) * percent - bone->y)
-			* alpha;
+	bone->x += (bone->data->x + prevX + (self->frames[frame + TRANSLATE_X] - prevX) * percent - bone->x) * alpha;
+	bone->y += (bone->data->y + prevY + (self->frames[frame + TRANSLATE_Y] - prevY) * percent - bone->y) * alpha;
 
 	UNUSED(lastTime);
 	UNUSED(firedEvents);
@@ -353,14 +338,14 @@ void _spTranslateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleto
 }
 
 spTranslateTimeline* spTranslateTimeline_create (int framesCount) {
-	return _spBaseTimeline_create(framesCount, SP_TIMELINE_TRANSLATE, 3, _spTranslateTimeline_apply);
+	return _spBaseTimeline_create(framesCount, SP_TIMELINE_TRANSLATE, TRANSLATE_ENTRIES, _spTranslateTimeline_apply);
 }
 
 void spTranslateTimeline_setFrame (spTranslateTimeline* self, int frameIndex, float time, float x, float y) {
-	frameIndex *= 3;
+	frameIndex *= TRANSLATE_ENTRIES;
 	self->frames[frameIndex] = time;
-	self->frames[frameIndex + 1] = x;
-	self->frames[frameIndex + 2] = y;
+	self->frames[frameIndex + TRANSLATE_X] = x;
+	self->frames[frameIndex + TRANSLATE_Y] = y;
 }
 
 /**/
@@ -369,31 +354,28 @@ void _spScaleTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 		int* eventsCount, float alpha) {
 	spBone *bone;
 	int frame;
-	float prevFrameX, prevFrameY, frameTime, percent;
+	float prevX, prevY, frameTime, percent;
 
 	spScaleTimeline* self = SUB_CAST(spScaleTimeline, timeline);
 
 	if (time < self->frames[0]) return; /* Time is before first frame. */
 
 	bone = skeleton->bones[self->boneIndex];
-	if (time >= self->frames[self->framesCount - 3]) { /* Time is after last frame. */
-		bone->scaleX += (bone->data->scaleX * self->frames[self->framesCount - 2] - bone->scaleX) * alpha;
-		bone->scaleY += (bone->data->scaleY * self->frames[self->framesCount - 1] - bone->scaleY) * alpha;
+	if (time >= self->frames[self->framesCount - TRANSLATE_ENTRIES]) { /* Time is after last frame. */
+		bone->scaleX += (bone->data->scaleX * self->frames[self->framesCount + TRANSLATE_PREV_X] - bone->scaleX) * alpha;
+		bone->scaleY += (bone->data->scaleY * self->frames[self->framesCount + TRANSLATE_PREV_Y] - bone->scaleY) * alpha;
 		return;
 	}
 
 	/* Interpolate between the previous frame and the current frame. */
-	frame = binarySearch(self->frames, self->framesCount, time, 3);
-	prevFrameX = self->frames[frame - 2];
-	prevFrameY = self->frames[frame - 1];
+	frame = binarySearch(self->frames, self->framesCount, time, TRANSLATE_ENTRIES);
+	prevX = self->frames[frame + TRANSLATE_PREV_X];
+	prevY = self->frames[frame + TRANSLATE_PREV_Y];
 	frameTime = self->frames[frame];
-	percent = 1 - (time - frameTime) / (self->frames[frame + TRANSLATE_PREV_TIME] - frameTime);
-	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / TRANSLATE_ENTRIES - 1, 1 - (time - frameTime) / (self->frames[frame + TRANSLATE_PREV_TIME] - frameTime));
 
-	bone->scaleX += (bone->data->scaleX * (prevFrameX + (self->frames[frame + TRANSLATE_X] - prevFrameX) * percent)
-			- bone->scaleX) * alpha;
-	bone->scaleY += (bone->data->scaleY * (prevFrameY + (self->frames[frame + TRANSLATE_Y] - prevFrameY) * percent)
-			- bone->scaleY) * alpha;
+	bone->scaleX += (bone->data->scaleX * (prevX + (self->frames[frame + TRANSLATE_X] - prevX) * percent) - bone->scaleX) * alpha;
+	bone->scaleY += (bone->data->scaleY * (prevY + (self->frames[frame + TRANSLATE_Y] - prevY) * percent) - bone->scaleY) * alpha;
 
 	UNUSED(lastTime);
 	UNUSED(firedEvents);
@@ -401,7 +383,7 @@ void _spScaleTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 }
 
 spScaleTimeline* spScaleTimeline_create (int framesCount) {
-	return _spBaseTimeline_create(framesCount, SP_TIMELINE_SCALE, 3, _spScaleTimeline_apply);
+	return _spBaseTimeline_create(framesCount, SP_TIMELINE_SCALE, TRANSLATE_ENTRIES, _spScaleTimeline_apply);
 }
 
 void spScaleTimeline_setFrame (spScaleTimeline* self, int frameIndex, float time, float x, float y) {
@@ -414,31 +396,28 @@ void _spShearTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 							 int* eventsCount, float alpha) {
 	spBone *bone;
 	int frame;
-	float prevFrameX, prevFrameY, frameTime, percent;
+	float prevX, prevY, frameTime, percent;
 
 	spShearTimeline* self = SUB_CAST(spShearTimeline, timeline);
 
 	if (time < self->frames[0]) return; /* Time is before first frame. */
 
 	bone = skeleton->bones[self->boneIndex];
-	if (time >= self->frames[self->framesCount - 3]) { /* Time is after last frame. */
-		bone->shearX += (bone->data->shearX * self->frames[self->framesCount - 2] - bone->shearX) * alpha;
-		bone->shearY += (bone->data->shearY * self->frames[self->framesCount - 1] - bone->shearY) * alpha;
+	if (time >= self->frames[self->framesCount - TRANSLATE_ENTRIES]) { /* Time is after last frame. */
+		bone->shearX += (bone->data->shearX + self->frames[self->framesCount + TRANSLATE_PREV_X] - bone->shearX) * alpha;
+		bone->shearY += (bone->data->shearY + self->frames[self->framesCount + TRANSLATE_PREV_Y] - bone->shearY) * alpha;
 		return;
 	}
 
 	/* Interpolate between the previous frame and the current frame. */
-	frame = binarySearch(self->frames, self->framesCount, time, 3);
-	prevFrameX = self->frames[frame - 2];
-	prevFrameY = self->frames[frame - 1];
+	frame = binarySearch(self->frames, self->framesCount, time, TRANSLATE_ENTRIES);
+	prevX = self->frames[frame + TRANSLATE_PREV_X];
+	prevY = self->frames[frame + TRANSLATE_PREV_Y];
 	frameTime = self->frames[frame];
-	percent = 1 - (time - frameTime) / (self->frames[frame + TRANSLATE_PREV_TIME] - frameTime);
-	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / TRANSLATE_ENTRIES - 1, 1 - (time - frameTime) / (self->frames[frame + TRANSLATE_PREV_TIME] - frameTime));
 
-	bone->shearX += (bone->data->shearX + (prevFrameX + (self->frames[frame + TRANSLATE_X] - prevFrameX) * percent)
-					 - bone->shearX) * alpha;
-	bone->shearY += (bone->data->shearY + (prevFrameY + (self->frames[frame + TRANSLATE_Y] - prevFrameY) * percent)
-					 - bone->shearY) * alpha;
+	bone->shearX += (bone->data->shearX + prevX + (self->frames[frame + TRANSLATE_X] - prevX) * percent - bone->shearX) * alpha;
+	bone->shearY += (bone->data->shearY + prevY + (self->frames[frame + TRANSLATE_Y] - prevY) * percent - bone->shearY) * alpha;
 
 	UNUSED(lastTime);
 	UNUSED(firedEvents);
@@ -455,11 +434,8 @@ void spShearTimeline_setFrame (spShearTimeline* self, int frameIndex, float time
 
 /**/
 
-static const int COLOR_PREV_TIME = -5;
-static const int COLOR_R = 1;
-static const int COLOR_G = 2;
-static const int COLOR_B = 3;
-static const int COLOR_A = 4;
+static const int COLOR_PREV_TIME = -5, COLOR_PREV_R = -4, COLOR_PREV_G = -3, COLOR_PREV_B = -2, COLOR_PREV_A = -1;
+static const int COLOR_R = 1, COLOR_G = 2, COLOR_B = 3, COLOR_A = 4;
 
 void _spColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
 		int* eventsCount, float alpha) {
@@ -472,22 +448,23 @@ void _spColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 	if (time < self->frames[0]) return; /* Time is before first frame. */
 
 	if (time >= self->frames[self->framesCount - 5]) { /* Time is after last frame */
-		int i = self->framesCount - 1;
-		r = self->frames[i - 3];
-		g = self->frames[i - 2];
-		b = self->frames[i - 1];
-		a = self->frames[i];
+		int i = self->framesCount;
+		r = self->frames[i + COLOR_PREV_R];
+		g = self->frames[i + COLOR_PREV_G];
+		b = self->frames[i + COLOR_PREV_B];
+		a = self->frames[i + COLOR_PREV_A];
 	} else {
 		/* Interpolate between the previous frame and the current frame. */
-		frame = binarySearch(self->frames, self->framesCount, time, 5);
-		frameTime = self->frames[frame];
-		percent = 1 - (time - frameTime) / (self->frames[frame + COLOR_PREV_TIME] - frameTime);
-		percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+		frame = binarySearch(self->frames, self->framesCount, time, COLOR_ENTRIES);
+
+		r = self->frames[frame + COLOR_PREV_R];
+		g = self->frames[frame + COLOR_PREV_G];
+		b = self->frames[frame + COLOR_PREV_B];
+		a = self->frames[frame + COLOR_PREV_A];
 
-		r = self->frames[frame - 4];
-		g = self->frames[frame - 3];
-		b = self->frames[frame - 2];
-		a = self->frames[frame - 1];
+		frameTime = self->frames[frame];
+		percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / COLOR_ENTRIES - 1,
+												  1 - (time - frameTime) / (self->frames[frame + COLOR_PREV_TIME] - frameTime));
 
 		r += (self->frames[frame + COLOR_R] - r) * percent;
 		g += (self->frames[frame + COLOR_G] - g) * percent;
@@ -517,33 +494,30 @@ spColorTimeline* spColorTimeline_create (int framesCount) {
 }
 
 void spColorTimeline_setFrame (spColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a) {
-	frameIndex *= 5;
+	frameIndex *= COLOR_ENTRIES;
 	self->frames[frameIndex] = time;
-	self->frames[frameIndex + 1] = r;
-	self->frames[frameIndex + 2] = g;
-	self->frames[frameIndex + 3] = b;
-	self->frames[frameIndex + 4] = a;
+	self->frames[frameIndex + COLOR_R] = r;
+	self->frames[frameIndex + COLOR_G] = g;
+	self->frames[frameIndex + COLOR_B] = b;
+	self->frames[frameIndex + COLOR_A] = a;
 }
 
 /**/
 
 void _spAttachmentTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
 		spEvent** firedEvents, int* eventsCount, float alpha) {
-	int frame;
 	const char* attachmentName;
 	spAttachmentTimeline* self = (spAttachmentTimeline*)timeline;
+	int frameIndex;
 
-	if (time < self->frames[0]) {
-		if (lastTime > time) _spAttachmentTimeline_apply(timeline, skeleton, lastTime, (float)INT_MAX, 0, 0, 0);
-		return;
-	} else if (lastTime > time) /**/
-		lastTime = -1;
+	if (time < self->frames[0]) return;
 
-	frame = time >= self->frames[self->framesCount - 1] ?
-		self->framesCount - 1 : binarySearch1(self->frames, self->framesCount, time) - 1;
-	if (self->frames[frame] < lastTime) return;
+	if (time >= self->frames[self->framesCount - 1])
+		frameIndex = self->framesCount - 1;
+	else
+		frameIndex = binarySearch1(self->frames, self->framesCount, time) - 1;
 
-	attachmentName = self->attachmentNames[frame];
+	attachmentName = self->attachmentNames[frameIndex];
 	spSlot_setAttachment(skeleton->slots[self->slotIndex],
 			attachmentName ? spSkeleton_getAttachmentForSlotIndex(skeleton, self->slotIndex, attachmentName) : 0);
 
@@ -719,13 +693,13 @@ void spDrawOrderTimeline_setFrame (spDrawOrderTimeline* self, int frameIndex, fl
 
 /**/
 
-void _spFFDTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
+void _spDeformTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
 		int* eventsCount, float alpha) {
 	int frame, i, vertexCount;
 	float percent, frameTime;
 	const float* prevVertices;
 	const float* nextVertices;
-	spFFDTimeline* self = (spFFDTimeline*)timeline;
+	spDeformTimeline* self = (spDeformTimeline*)timeline;
 
 	spSlot *slot = skeleton->slots[self->slotIndex];
 
@@ -734,12 +708,7 @@ void _spFFDTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, flo
 		switch (slot->attachment->type) {
 		case SP_ATTACHMENT_MESH: {
 			spMeshAttachment* mesh = SUB_CAST(spMeshAttachment, slot->attachment);
-			if (!mesh->inheritFFD || mesh->parentMesh != (void*)self->attachment) return;
-			break;
-		}
-		case SP_ATTACHMENT_WEIGHTED_MESH: {
-			spWeightedMeshAttachment* mesh = SUB_CAST(spWeightedMeshAttachment, slot->attachment);
-			if (!mesh->inheritFFD || mesh->parentMesh != (void*)self->attachment) return;
+			if (!mesh->inheritDeform || mesh->parentMesh != (void*)self->attachment) return;
 			break;
 		}
 		default:
@@ -774,8 +743,7 @@ void _spFFDTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, flo
 	/* Interpolate between the previous frame and the current frame. */
 	frame = binarySearch1(self->frames, self->framesCount, time);
 	frameTime = self->frames[frame];
-	percent = 1 - (time - frameTime) / (self->frames[frame - 1] - frameTime);
-	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame - 1, 1 - (time - frameTime) / (self->frames[frame - 1] - frameTime));
 
 	prevVertices = self->frameVertices[frame - 1];
 	nextVertices = self->frameVertices[frame];
@@ -797,8 +765,8 @@ void _spFFDTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, flo
 	UNUSED(eventsCount);
 }
 
-void _spFFDTimeline_dispose (spTimeline* timeline) {
-	spFFDTimeline* self = SUB_CAST(spFFDTimeline, timeline);
+void _spDeformTimeline_dispose (spTimeline* timeline) {
+	spDeformTimeline* self = SUB_CAST(spDeformTimeline, timeline);
 	int i;
 
 	_spCurveTimeline_deinit(SUPER(self));
@@ -810,9 +778,9 @@ void _spFFDTimeline_dispose (spTimeline* timeline) {
 	FREE(self);
 }
 
-spFFDTimeline* spFFDTimeline_create (int framesCount, int frameVerticesCount) {
-	spFFDTimeline* self = NEW(spFFDTimeline);
-	_spCurveTimeline_init(SUPER(self), SP_TIMELINE_FFD, framesCount, _spFFDTimeline_dispose, _spFFDTimeline_apply);
+spDeformTimeline* spDeformTimeline_create (int framesCount, int frameVerticesCount) {
+	spDeformTimeline* self = NEW(spDeformTimeline);
+	_spCurveTimeline_init(SUPER(self), SP_TIMELINE_DEFORM, framesCount, _spDeformTimeline_dispose, _spDeformTimeline_apply);
 	CONST_CAST(int, self->framesCount) = framesCount;
 	CONST_CAST(float*, self->frames) = CALLOC(float, self->framesCount);
 	CONST_CAST(float**, self->frameVertices) = CALLOC(float*, framesCount);
@@ -820,7 +788,7 @@ spFFDTimeline* spFFDTimeline_create (int framesCount, int frameVerticesCount) {
 	return self;
 }
 
-void spFFDTimeline_setFrame (spFFDTimeline* self, int frameIndex, float time, float* vertices) {
+void spDeformTimeline_setFrame (spDeformTimeline* self, int frameIndex, float time, float* vertices) {
 	self->frames[frameIndex] = time;
 
 	FREE(self->frameVertices[frameIndex]);
@@ -835,10 +803,8 @@ void spFFDTimeline_setFrame (spFFDTimeline* self, int frameIndex, float time, fl
 
 /**/
 
-static const int IKCONSTRAINT_PREV_TIME = -3;
-static const int IKCONSTRAINT_PREV_MIX = -2;
-static const int IKCONSTRAINT_PREV_BEND_DIRECTION = -1;
-static const int IKCONSTRAINT_MIX = 1;
+static const int IKCONSTRAINT_PREV_TIME = -3, IKCONSTRAINT_PREV_MIX = -2, IKCONSTRAINT_PREV_BEND_DIRECTION = -1;
+static const int IKCONSTRAINT_MIX = 1, IKCONSTRAINT_BEND_DIRECTION = 2;
 
 void _spIkConstraintTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
 		spEvent** firedEvents, int* eventsCount, float alpha) {
@@ -851,19 +817,18 @@ void _spIkConstraintTimeline_apply (const spTimeline* timeline, spSkeleton* skel
 
 	constraint = skeleton->ikConstraints[self->ikConstraintIndex];
 
-	if (time >= self->frames[self->framesCount - 3]) { /* Time is after last frame. */
+	if (time >= self->frames[self->framesCount - IKCONSTRAINT_ENTRIES]) { /* Time is after last frame. */
 		constraint->mix += (self->frames[self->framesCount + IKCONSTRAINT_PREV_MIX] - constraint->mix) * alpha;
 		constraint->bendDirection = (int)self->frames[self->framesCount + IKCONSTRAINT_PREV_BEND_DIRECTION];
 		return;
 	}
 
 	/* Interpolate between the previous frame and the current frame. */
-	frame = binarySearch(self->frames, self->framesCount, time, 3);
+	frame = binarySearch(self->frames, self->framesCount, time, IKCONSTRAINT_ENTRIES);
+	mix = self->frames[frame + IKCONSTRAINT_PREV_MIX];
 	frameTime = self->frames[frame];
-	percent = 1 - (time - frameTime) / (self->frames[frame + IKCONSTRAINT_PREV_TIME] - frameTime);
-	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / IKCONSTRAINT_ENTRIES - 1, 1 - (time - frameTime) / (self->frames[frame + IKCONSTRAINT_PREV_TIME] - frameTime));
 
-	mix = self->frames[frame + IKCONSTRAINT_PREV_MIX];
 	constraint->mix += (mix + (self->frames[frame + IKCONSTRAINT_MIX] - mix) * percent - constraint->mix) * alpha;
 	constraint->bendDirection = (int)self->frames[frame + IKCONSTRAINT_PREV_BEND_DIRECTION];
 
@@ -873,26 +838,26 @@ void _spIkConstraintTimeline_apply (const spTimeline* timeline, spSkeleton* skel
 }
 
 spIkConstraintTimeline* spIkConstraintTimeline_create (int framesCount) {
-	return (spIkConstraintTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_IKCONSTRAINT, 3, _spIkConstraintTimeline_apply);
+	return (spIkConstraintTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_IKCONSTRAINT, IKCONSTRAINT_ENTRIES, _spIkConstraintTimeline_apply);
 }
 
 void spIkConstraintTimeline_setFrame (spIkConstraintTimeline* self, int frameIndex, float time, float mix, int bendDirection) {
-	frameIndex *= 3;
+	frameIndex *= IKCONSTRAINT_ENTRIES;
 	self->frames[frameIndex] = time;
-	self->frames[frameIndex + 1] = mix;
-	self->frames[frameIndex + 2] = (float)bendDirection;
+	self->frames[frameIndex + IKCONSTRAINT_MIX] = mix;
+	self->frames[frameIndex + IKCONSTRAINT_BEND_DIRECTION] = (float)bendDirection;
 }
 
 /**/
 static const int TRANSFORMCONSTRAINT_PREV_TIME = -5;
-static const int TRANSFORMCONSTRAINT_PREV_ROTATE_MIX = -4;
-static const int TRANSFORMCONSTRAINT_PREV_TRANSLATE_MIX = -3;
-static const int TRANSFORMCONSTRAINT_PREV_SCALE_MIX = -2;
-static const int TRANSFORMCONSTRAINT_PREV_SHEAR_MIX = -1;
-static const int TRANSFORMCONSTRAINT_ROTATE_MIX = 1;
-static const int TRANSFORMCONSTRAINT_TRANSLATE_MIX = 2;
-static const int TRANSFORMCONSTRAINT_SCALE_MIX = 3;
-static const int TRANSFORMCONSTRAINT_SHEAR_MIX = 4;
+static const int TRANSFORMCONSTRAINT_PREV_ROTATE = -4;
+static const int TRANSFORMCONSTRAINT_PREV_TRANSLATE = -3;
+static const int TRANSFORMCONSTRAINT_PREV_SCALE = -2;
+static const int TRANSFORMCONSTRAINT_PREV_SHEAR = -1;
+static const int TRANSFORMCONSTRAINT_ROTATE = 1;
+static const int TRANSFORMCONSTRAINT_TRANSLATE = 2;
+static const int TRANSFORMCONSTRAINT_SCALE = 3;
+static const int TRANSFORMCONSTRAINT_SHEAR = 4;
 
 void _spTransformConstraintTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
 									spEvent** firedEvents, int* eventsCount, float alpha) {
@@ -905,30 +870,28 @@ void _spTransformConstraintTimeline_apply (const spTimeline* timeline, spSkeleto
 
 	constraint = skeleton->transformConstraints[self->transformConstraintIndex];
 
-	if (time >= self->frames[self->framesCount - 5]) { /* Time is after last frame. */
+	if (time >= self->frames[self->framesCount - TRANSFORMCONSTRAINT_ENTRIES]) { /* Time is after last frame. */
 		int len = self->framesCount;
-		constraint->rotateMix += (self->frames[len + TRANSFORMCONSTRAINT_PREV_ROTATE_MIX] - constraint->rotateMix) * alpha;
-		constraint->translateMix += (self->frames[len + TRANSFORMCONSTRAINT_PREV_TRANSLATE_MIX] - constraint->translateMix) * alpha;
-		constraint->scaleMix += (self->frames[len + TRANSFORMCONSTRAINT_PREV_SCALE_MIX] - constraint->scaleMix) * alpha;
-		constraint->shearMix += (self->frames[len + TRANSFORMCONSTRAINT_PREV_SHEAR_MIX] - constraint->shearMix) * alpha;
+		constraint->rotateMix += (self->frames[len + TRANSFORMCONSTRAINT_PREV_ROTATE] - constraint->rotateMix) * alpha;
+		constraint->translateMix += (self->frames[len + TRANSFORMCONSTRAINT_PREV_TRANSLATE] - constraint->translateMix) * alpha;
+		constraint->scaleMix += (self->frames[len + TRANSFORMCONSTRAINT_PREV_SCALE] - constraint->scaleMix) * alpha;
+		constraint->shearMix += (self->frames[len + TRANSFORMCONSTRAINT_PREV_SHEAR] - constraint->shearMix) * alpha;
 		return;
 	}
 
 	/* Interpolate between the previous frame and the current frame. */
-	frame = binarySearch(self->frames, self->framesCount, time, 5);
+	frame = binarySearch(self->frames, self->framesCount, time, TRANSFORMCONSTRAINT_ENTRIES);
 	frameTime = self->frames[frame];
-	percent = 1 - (time - frameTime) / (self->frames[frame + TRANSFORMCONSTRAINT_PREV_TIME] - frameTime);
-	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
-
-	rotate = self->frames[frame + TRANSFORMCONSTRAINT_PREV_ROTATE_MIX];
-	translate = self->frames[frame + TRANSFORMCONSTRAINT_PREV_TRANSLATE_MIX];
-	scale = self->frames[frame + TRANSFORMCONSTRAINT_PREV_SCALE_MIX];
-	shear = self->frames[frame + TRANSFORMCONSTRAINT_PREV_SHEAR_MIX];
-	constraint->rotateMix += (rotate + (self->frames[frame + TRANSFORMCONSTRAINT_ROTATE_MIX] - rotate) * percent - constraint->rotateMix) * alpha;
-	constraint->translateMix += (translate + (self->frames[frame + TRANSFORMCONSTRAINT_TRANSLATE_MIX] - translate) * percent - constraint->translateMix)
-							   * alpha;
-	constraint->scaleMix += (scale + (self->frames[frame + TRANSFORMCONSTRAINT_SCALE_MIX] - scale) * percent - constraint->scaleMix) * alpha;
-	constraint->shearMix += (shear + (self->frames[frame + TRANSFORMCONSTRAINT_SHEAR_MIX] - shear) * percent - constraint->shearMix) * alpha;
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / TRANSFORMCONSTRAINT_ENTRIES - 1, 1 - (time - frameTime) / (self->frames[frame + TRANSFORMCONSTRAINT_PREV_TIME] - frameTime));
+
+	rotate = self->frames[frame + TRANSFORMCONSTRAINT_PREV_ROTATE];
+	translate = self->frames[frame + TRANSFORMCONSTRAINT_PREV_TRANSLATE];
+	scale = self->frames[frame + TRANSFORMCONSTRAINT_PREV_SCALE];
+	shear = self->frames[frame + TRANSFORMCONSTRAINT_PREV_SHEAR];
+	constraint->rotateMix += (rotate + (self->frames[frame + TRANSFORMCONSTRAINT_ROTATE] - rotate) * percent - constraint->rotateMix) * alpha;
+	constraint->translateMix += (translate + (self->frames[frame + TRANSFORMCONSTRAINT_TRANSLATE] - translate) * percent - constraint->translateMix) * alpha;
+	constraint->scaleMix += (scale + (self->frames[frame + TRANSFORMCONSTRAINT_SCALE] - scale) * percent - constraint->scaleMix) * alpha;
+	constraint->shearMix += (shear + (self->frames[frame + TRANSFORMCONSTRAINT_SHEAR] - shear) * percent - constraint->shearMix) * alpha;
 
 	UNUSED(lastTime);
 	UNUSED(firedEvents);
@@ -936,14 +899,157 @@ void _spTransformConstraintTimeline_apply (const spTimeline* timeline, spSkeleto
 }
 
 spTransformConstraintTimeline* spTransformConstraintTimeline_create (int framesCount) {
-	return (spTransformConstraintTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_TRANSFORMCONSTRAINT, 5, _spTransformConstraintTimeline_apply);
+	return (spTransformConstraintTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_TRANSFORMCONSTRAINT, TRANSFORMCONSTRAINT_ENTRIES, _spTransformConstraintTimeline_apply);
 }
 
 void spTransformConstraintTimeline_setFrame (spTransformConstraintTimeline* self, int frameIndex, float time, float rotateMix, float translateMix, float scaleMix, float shearMix) {
-	frameIndex *= 5;
+	frameIndex *= TRANSFORMCONSTRAINT_ENTRIES;
+	self->frames[frameIndex] = time;
+	self->frames[frameIndex + TRANSFORMCONSTRAINT_ROTATE] = rotateMix;
+	self->frames[frameIndex + TRANSFORMCONSTRAINT_TRANSLATE] = translateMix;
+	self->frames[frameIndex + TRANSFORMCONSTRAINT_SCALE] = scaleMix;
+	self->frames[frameIndex + TRANSFORMCONSTRAINT_SHEAR] = shearMix;
+}
+
+/**/
+
+static const int PATHCONSTRAINTPOSITION_PREV_TIME = -2;
+static const int PATHCONSTRAINTPOSITION_PREV_VALUE = -1;
+static const int PATHCONSTRAINTPOSITION_VALUE = 1;
+
+void _spPathConstraintPositionTimeline_apply(const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
+											 spEvent** firedEvents, int* eventsCount, float alpha) {
+	int frame;
+	float frameTime, percent, position;
+	spPathConstraint* constraint;
+	spPathConstraintPositionTimeline* self = (spPathConstraintPositionTimeline*)timeline;
+
+	if (time < self->frames[0]) return; /* Time is before first frame. */
+
+	constraint = skeleton->pathConstraints[self->pathConstraintIndex];
+
+	if (time >= self->frames[self->framesCount - PATHCONSTRAINTPOSITION_ENTRIES]) { /* Time is after last frame. */
+		int len = self->framesCount;
+		constraint->position += (self->frames[len + PATHCONSTRAINTPOSITION_PREV_VALUE] - constraint->position) * alpha;
+		return;
+	}
+
+	/* Interpolate between the previous frame and the current frame. */
+	frame = binarySearch(self->frames, self->framesCount, time, PATHCONSTRAINTPOSITION_ENTRIES);
+	position = self->frames[frame + PATHCONSTRAINTPOSITION_PREV_VALUE];
+	frameTime = self->frames[frame];
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / PATHCONSTRAINTPOSITION_ENTRIES - 1, 1 - (time - frameTime) / (self->frames[frame + PATHCONSTRAINTPOSITION_PREV_TIME] - frameTime));
+
+	constraint->position += (position + (self->frames[frame + PATHCONSTRAINTPOSITION_VALUE] - position) * percent - constraint->position) * alpha;
+
+	UNUSED(lastTime);
+	UNUSED(firedEvents);
+	UNUSED(eventsCount);
+}
+
+spPathConstraintPositionTimeline* spPathConstraintPositionTimeline_create (int framesCount) {
+	return (spPathConstraintPositionTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_PATHCONSTRAINTPOSITION, PATHCONSTRAINTPOSITION_ENTRIES, _spPathConstraintPositionTimeline_apply);
+}
+
+void spPathConstraintPositionTimeline_setFrame (spPathConstraintPositionTimeline* self, int frameIndex, float time, float value) {
+	frameIndex *= PATHCONSTRAINTPOSITION_ENTRIES;
+	self->frames[frameIndex] = time;
+	self->frames[frameIndex + PATHCONSTRAINTPOSITION_VALUE] = value;
+}
+
+/**/
+static const int PATHCONSTRAINTSPACING_PREV_TIME = -2;
+static const int PATHCONSTRAINTSPACING_PREV_VALUE = -1;
+static const int PATHCONSTRAINTSPACING_VALUE = 1;
+
+void _spPathConstraintSpacingTimeline_apply(const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
+											 spEvent** firedEvents, int* eventsCount, float alpha) {
+	int frame;
+	float frameTime, percent, spacing;
+	spPathConstraint* constraint;
+	spPathConstraintSpacingTimeline* self = (spPathConstraintSpacingTimeline*)timeline;
+
+	if (time < self->frames[0]) return; /* Time is before first frame. */
+
+	constraint = skeleton->pathConstraints[self->pathConstraintIndex];
+
+	if (time >= self->frames[self->framesCount - PATHCONSTRAINTSPACING_ENTRIES]) { /* Time is after last frame. */
+		int len = self->framesCount;
+		constraint->spacing += (self->frames[len + PATHCONSTRAINTSPACING_PREV_VALUE] - constraint->spacing) * alpha;
+		return;
+	}
+
+	/* Interpolate between the previous frame and the current frame. */
+	frame = binarySearch(self->frames, self->framesCount, time, PATHCONSTRAINTSPACING_ENTRIES);
+	spacing = self->frames[frame + PATHCONSTRAINTSPACING_PREV_VALUE];
+	frameTime = self->frames[frame];
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / PATHCONSTRAINTSPACING_ENTRIES - 1, 1 - (time - frameTime) / (self->frames[frame + PATHCONSTRAINTSPACING_PREV_TIME] - frameTime));
+
+	constraint->spacing += (spacing + (self->frames[frame + PATHCONSTRAINTSPACING_VALUE] - spacing) * percent - constraint->spacing) * alpha;
+
+	UNUSED(lastTime);
+	UNUSED(firedEvents);
+	UNUSED(eventsCount);
+}
+
+spPathConstraintSpacingTimeline* spPathConstraintSpacingTimeline_create (int framesCount) {
+	return (spPathConstraintSpacingTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_PATHCONSTRAINTSPACING, PATHCONSTRAINTSPACING_ENTRIES, _spPathConstraintSpacingTimeline_apply);
+}
+
+void spPathConstraintSpacingTimeline_setFrame (spPathConstraintSpacingTimeline* self, int frameIndex, float time, float value) {
+	frameIndex *= PATHCONSTRAINTSPACING_ENTRIES;
+	self->frames[frameIndex] = time;
+	self->frames[frameIndex + PATHCONSTRAINTSPACING_VALUE] = value;
+}
+
+/**/
+
+static const int PATHCONSTRAINTMIX_PREV_TIME = -3;
+static const int PATHCONSTRAINTMIX_PREV_ROTATE = -2;
+static const int PATHCONSTRAINTMIX_PREV_TRANSLATE = -1;
+static const int PATHCONSTRAINTMIX_ROTATE = 1;
+static const int PATHCONSTRAINTMIX_TRANSLATE = 2;
+
+void _spPathConstraintMixTimeline_apply(const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
+											spEvent** firedEvents, int* eventsCount, float alpha) {
+	int frame;
+	float frameTime, percent, rotate, translate;
+	spPathConstraint* constraint;
+	spPathConstraintMixTimeline* self = (spPathConstraintMixTimeline*)timeline;
+
+	if (time < self->frames[0]) return; /* Time is before first frame. */
+
+	constraint = skeleton->pathConstraints[self->pathConstraintIndex];
+
+	if (time >= self->frames[self->framesCount - PATHCONSTRAINTMIX_ENTRIES]) { /* Time is after last frame. */
+		int len = self->framesCount;
+		constraint->rotateMix += (self->frames[len + PATHCONSTRAINTMIX_PREV_ROTATE] - constraint->rotateMix) * alpha;
+		constraint->translateMix += (self->frames[len + PATHCONSTRAINTMIX_PREV_TRANSLATE] - constraint->translateMix) * alpha;
+		return;
+	}
+
+	/* Interpolate between the previous frame and the current frame. */
+	frame = binarySearch(self->frames, self->framesCount, time, PATHCONSTRAINTMIX_ENTRIES);
+	rotate = self->frames[frame + PATHCONSTRAINTMIX_PREV_ROTATE];
+	translate = self->frames[frame + PATHCONSTRAINTMIX_PREV_TRANSLATE];
+	frameTime = self->frames[frame];
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / PATHCONSTRAINTMIX_ENTRIES - 1, 1 - (time - frameTime) / (self->frames[frame + PATHCONSTRAINTMIX_PREV_TIME] - frameTime));
+
+	constraint->rotateMix += (rotate + (self->frames[frame + PATHCONSTRAINTMIX_ROTATE] - rotate) * percent - constraint->rotateMix) * alpha;
+	constraint->translateMix += (translate + (self->frames[frame + PATHCONSTRAINTMIX_TRANSLATE] - translate) * percent - constraint->translateMix) * alpha;
+
+	UNUSED(lastTime);
+	UNUSED(firedEvents);
+	UNUSED(eventsCount);
+}
+
+spPathConstraintMixTimeline* spPathConstraintMixTimeline_create (int framesCount) {
+	return (spPathConstraintMixTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_PATHCONSTRAINTMIX, PATHCONSTRAINTMIX_ENTRIES, _spPathConstraintMixTimeline_apply);
+}
+
+void spPathConstraintMixTimeline_setFrame (spPathConstraintMixTimeline* self, int frameIndex, float time, float rotateMix, float translateMix) {
+	frameIndex *= PATHCONSTRAINTMIX_ENTRIES;
 	self->frames[frameIndex] = time;
-	self->frames[frameIndex + 1] = rotateMix;
-	self->frames[frameIndex + 2] = translateMix;
-	self->frames[frameIndex + 3] = scaleMix;
-	self->frames[frameIndex + 4] = shearMix;
+	self->frames[frameIndex + PATHCONSTRAINTMIX_ROTATE] = rotateMix;
+	self->frames[frameIndex + PATHCONSTRAINTMIX_TRANSLATE] = translateMix;
 }

+ 4 - 25
spine-c/src/spine/AtlasAttachmentLoader.c

@@ -75,33 +75,12 @@ spAttachment* _spAtlasAttachmentLoader_createAttachment (spAttachmentLoader* loa
 		attachment->regionHeight = region->height;
 		attachment->regionOriginalWidth = region->originalWidth;
 		attachment->regionOriginalHeight = region->originalHeight;
-		return SUPER(attachment);
-	}
-	case SP_ATTACHMENT_WEIGHTED_MESH:
-	case SP_ATTACHMENT_WEIGHTED_LINKED_MESH: {
-		spWeightedMeshAttachment* attachment;
-		spAtlasRegion* region = spAtlas_findRegion(self->atlas, path);
-		if (!region) {
-			_spAttachmentLoader_setError(loader, "Region not found: ", path);
-			return 0;
-		}
-		attachment = spWeightedMeshAttachment_create(name);
-		attachment->rendererObject = region;
-		attachment->regionU = region->u;
-		attachment->regionV = region->v;
-		attachment->regionU2 = region->u2;
-		attachment->regionV2 = region->v2;
-		attachment->regionRotate = region->rotate;
-		attachment->regionOffsetX = region->offsetX;
-		attachment->regionOffsetY = region->offsetY;
-		attachment->regionWidth = region->width;
-		attachment->regionHeight = region->height;
-		attachment->regionOriginalWidth = region->originalWidth;
-		attachment->regionOriginalHeight = region->originalHeight;
-		return SUPER(attachment);
+		return SUPER(SUPER(attachment));
 	}
 	case SP_ATTACHMENT_BOUNDING_BOX:
-		return SUPER(spBoundingBoxAttachment_create(name));
+		return SUPER(SUPER(spBoundingBoxAttachment_create(name)));
+	case SP_ATTACHMENT_PATH:
+		return SUPER(SUPER(spPathAttachment_create(name)));
 	default:
 		_spAttachmentLoader_setUnknownTypeError(loader, type);
 		return 0;

+ 81 - 16
spine-c/src/spine/Bone.c

@@ -52,6 +52,7 @@ spBone* spBone_create (spBoneData* data, spSkeleton* skeleton, spBone* parent) {
 }
 
 void spBone_dispose (spBone* self) {
+	FREE(self->children);
 	FREE(self);
 }
 
@@ -68,8 +69,6 @@ void spBone_updateWorldTransformWith (spBone* self, float x, float y, float rota
 	spBone* parent = self->parent;
 
 	CONST_CAST(float, self->appliedRotation) = rotation;
-	CONST_CAST(float, self->appliedScaleX) = scaleX;
-	CONST_CAST(float, self->appliedScaleY) = scaleY;
 
 	if (!parent) { /* Root bone. */
 		if (self->skeleton->flipX) {
@@ -117,10 +116,10 @@ void spBone_updateWorldTransformWith (spBone* self, float x, float y, float rota
 			do {
 				cosine = COS_DEG(parent->appliedRotation); sine = SIN_DEG(parent->appliedRotation);
 				temp = pa * cosine + pb * sine;
-				pb = pa * -sine + pb * cosine;
+				pb = pb * cosine - pa * sine;
 				pa = temp;
 				temp = pc * cosine + pd * sine;
-				pd = pc * -sine + pd * cosine;
+				pd = pd * cosine - pc * sine;
 				pc = temp;
 
 				if (!parent->data->inheritRotation) break;
@@ -137,25 +136,23 @@ void spBone_updateWorldTransformWith (spBone* self, float x, float y, float rota
 			pd = 1;
 			do {
 				float za, zb, zc, zd;
-				float r = parent->appliedRotation;
-				float psx = parent->appliedScaleX; float psy = parent->appliedScaleY;
-				cosine = COS_DEG(r); sine = SIN_DEG(r);
-				za = cosine * psx; zb = -sine * psy; zc = sine * psx; zd = cosine * psy;
+				float psx = parent->scaleX, psy = parent->scaleY;
+				cosine = COS_DEG(parent->appliedRotation);
+				sine = SIN_DEG(parent->appliedRotation);
+				za = cosine * psx; zb = sine * psy; zc = sine * psx; zd = cosine * psy;
 				temp = pa * za + pb * zc;
-				pb = pa * zb + pb * zd;
+				pb = pb * zd - pa * zb;
 				pa = temp;
 				temp = pc * za + pd * zc;
-				pd = pc * zb + pd * zd;
+				pd = pd * zd - pc * zb;
 				pc = temp;
 
-				if (psx < 0) r = -r;
-				cosine = COS_DEG(-r);
-				sine = SIN_DEG(-r);
+				if (psx >= 0) sine = -sine;
 				temp = pa * cosine + pb * sine;
-				pb = pa * -sine + pb * cosine;
+				pb = pb * cosine - pa * sine;
 				pa = temp;
 				temp = pc * cosine + pd * sine;
-				pd = pc * -sine + pd * cosine;
+				pd = pd * cosine - pc * sine;
 				pc = temp;
 
 				if (!parent->data->inheritScale) break;
@@ -208,10 +205,78 @@ float spBone_getWorldScaleY (spBone* self) {
 	return SQRT(self->c * self->c + self->d * self->d) * self->worldSignY;
 }
 
+float spBone_worldToLocalRotationX (spBone* self) {
+	spBone* parent = self->parent;
+	if (!parent) return self->rotation;
+	return ATAN2(parent->a * self->c - parent->c * self->a, parent->d * self->a - parent->b * self->c) * RAD_DEG;
+}
+
+float spBone_worldToLocalRotationY (spBone* self) {
+	spBone* parent = self->parent;
+	if (self->parent) return self->rotation;
+	return ATAN2(parent->a * self->d - parent->c * self->b, parent->d * self->b - parent->b * self->d) * RAD_DEG;
+}
+
+void spBone_rotateWorld (spBone* self, float degrees) {
+	float a = self->a, b = self->b, c = self->c, d = self->d;
+	float cosine = COS_DEG(degrees), sine = SIN_DEG(degrees);
+	CONST_CAST(float, self->a) = cosine * a - sine * c;
+	CONST_CAST(float, self->b) = cosine * b - sine * d;
+	CONST_CAST(float, self->c) = sine * a + cosine * c;
+	CONST_CAST(float, self->d) = sine * b + cosine * d;
+}
+
+/** 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).
+ * <p>
+ * 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. */
+void spBone_updateLocalTransform (spBone* self) {
+	spBone* parent = self->parent;
+	if (!parent) {
+		float det = self->a * self->d - self->b * self->c;
+		self->x = self->worldX;
+		self->y = self->worldY;
+		self->rotation = ATAN2(self->c, self->a) * RAD_DEG;
+		self->scaleX = SQRT(self->a * self->a + self->c * self->c);
+		self->scaleY = SQRT(self->b * self->b + self->d * self->d);
+		self->shearX = 0;
+		self->shearY = ATAN2(self->a * self->b + self->c * self->d, det) * RAD_DEG;
+	} else {
+		float pa = parent->a, pb = parent->b, pc = parent->c, pd = parent->d;
+		float pid = 1 / (pa * pd - pb * pc);
+		float dx = self->worldX - parent->worldX, dy = self->worldY - parent->worldY;
+		float ia = pid * pd;
+		float id = pid * pa;
+		float ib = pid * pb;
+		float ic = pid * pc;
+		float ra = ia * self->a - ib * self->c;
+		float rb = ia * self->b - ib * self->d;
+		float rc = id * self->c - ic * self->a;
+		float rd = id * self->d - ic * self->b;
+		self->x = (dx * pd * pid - dy * pb * pid);
+		self->y = (dy * pa * pid - dx * pc * pid);
+		self->shearX = 0;
+		self->scaleX = SQRT(ra * ra + rc * rc);
+		if (self->scaleX > 0.0001f) {
+			float det = ra * rd - rb * rc;
+			self->scaleY = det / self->scaleX;
+			self->shearY = ATAN2(ra * rb + rc * rd, det) * RAD_DEG;
+			self->rotation = ATAN2(rc, ra) * RAD_DEG;
+		} else {
+			self->scaleX = 0;
+			self->scaleY = SQRT(rb * rb + rd * rd);
+			self->shearY = 0;
+			self->rotation = 90 - ATAN2(rd, rb) * RAD_DEG;
+		}
+		self->appliedRotation = self->rotation;
+	}
+}
+
 void spBone_worldToLocal (spBone* self, float worldX, float worldY, float* localX, float* localY) {
-	float x = worldX - self->worldX, y = worldY - self->worldY;
 	float a = self->a, b = self->b, c = self->c, d = self->d;
 	float invDet = 1 / (a * d - b * c);
+	float x = worldX - self->worldX, y = worldY - self->worldY;
 	*localX = (x * d * invDet - y * b * invDet);
 	*localY = (y * a * invDet - x * c * invDet);
 }

+ 3 - 2
spine-c/src/spine/BoneData.c

@@ -32,14 +32,15 @@
 #include <spine/BoneData.h>
 #include <spine/extension.h>
 
-spBoneData* spBoneData_create (const char* name, spBoneData* parent) {
+spBoneData* spBoneData_create (int index, const char* name, spBoneData* parent) {
 	spBoneData* self = NEW(spBoneData);
+	CONST_CAST(int, self->index) = index;
 	MALLOC_STR(self->name, name);
 	CONST_CAST(spBoneData*, self->parent) = parent;
 	self->scaleX = 1;
 	self->scaleY = 1;
-	self->inheritScale = 1;
 	self->inheritRotation = 1;
+	self->inheritScale = 1;
 	return self;
 }
 

+ 4 - 14
spine-c/src/spine/BoundingBoxAttachment.c

@@ -35,27 +35,17 @@
 void _spBoundingBoxAttachment_dispose (spAttachment* attachment) {
 	spBoundingBoxAttachment* self = SUB_CAST(spBoundingBoxAttachment, attachment);
 
-	_spAttachment_deinit(attachment);
+	_spVertexAttachment_deinit(SUPER(self));
 
-	FREE(self->vertices);
 	FREE(self);
 }
 
 spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name) {
 	spBoundingBoxAttachment* self = NEW(spBoundingBoxAttachment);
-	_spAttachment_init(SUPER(self), name, SP_ATTACHMENT_BOUNDING_BOX, _spBoundingBoxAttachment_dispose);
+	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_BOUNDING_BOX, _spBoundingBoxAttachment_dispose);
 	return self;
 }
 
-void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spBone* bone, float* worldVertices) {
-	int i;
-	float px, py;
-	float* vertices = self->vertices;
-	float x = bone->skeleton->x + bone->worldX, y = bone->skeleton->y + bone->worldY;
-	for (i = 0; i < self->verticesCount; i += 2) {
-		px = vertices[i];
-		py = vertices[i + 1];
-		worldVertices[i] = px * bone->a + py * bone->b + x;
-		worldVertices[i + 1] = px * bone->c + py * bone->d + y;
-	}
+void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spSlot* slot, float* worldVertices) {
+	spVertexAttachment_computeWorldVertices(SUPER(self), slot, worldVertices);
 }

+ 160 - 169
spine-c/src/spine/IkConstraint.c

@@ -35,186 +35,177 @@
 #include <float.h>
 
 spIkConstraint *spIkConstraint_create(spIkConstraintData *data, const spSkeleton *skeleton) {
-    int i;
+	int i;
 
-    spIkConstraint *self = NEW(spIkConstraint);
-    CONST_CAST(spIkConstraintData*, self->data) = data;
-    self->bendDirection = data->bendDirection;
-    self->mix = data->mix;
+	spIkConstraint *self = NEW(spIkConstraint);
+	CONST_CAST(spIkConstraintData*, self->data) = data;
+	self->bendDirection = data->bendDirection;
+	self->mix = data->mix;
 
-    self->bonesCount = self->data->bonesCount;
-    self->bones = MALLOC(spBone*, self->bonesCount);
-    for (i = 0; i < self->bonesCount; ++i)
-        self->bones[i] = spSkeleton_findBone(skeleton, self->data->bones[i]->name);
-    self->target = spSkeleton_findBone(skeleton, self->data->target->name);
+	self->bonesCount = self->data->bonesCount;
+	self->bones = MALLOC(spBone*, self->bonesCount);
+	for (i = 0; i < self->bonesCount; ++i)
+		self->bones[i] = spSkeleton_findBone(skeleton, self->data->bones[i]->name);
+	self->target = spSkeleton_findBone(skeleton, self->data->target->name);
 
-    return self;
+	return self;
 }
 
 void spIkConstraint_dispose(spIkConstraint *self) {
-    FREE(self->bones);
-    FREE(self);
+	FREE(self->bones);
+	FREE(self);
 }
 
 void spIkConstraint_apply(spIkConstraint *self) {
-    switch (self->bonesCount) {
-        case 1:
-            spIkConstraint_apply1(self->bones[0], self->target->worldX, self->target->worldY, self->mix);
-            break;
-        case 2:
-            spIkConstraint_apply2(self->bones[0], self->bones[1], self->target->worldX, self->target->worldY,
-                                  self->bendDirection,
-                                  self->mix);
-            break;
-    }
+	switch (self->bonesCount) {
+		case 1:
+			spIkConstraint_apply1(self->bones[0], self->target->worldX, self->target->worldY, self->mix);
+			break;
+		case 2:
+			spIkConstraint_apply2(self->bones[0], self->bones[1], self->target->worldX, self->target->worldY, self->bendDirection, self->mix);
+			break;
+	}
 }
 
-void spIkConstraint_apply1(spBone *bone, float targetX, float targetY, float alpha) {
-    spBone *pp = bone->parent;
-    float id = 1 / (pp->a * pp->d - pp->b * pp->c);
-    float x = targetX - pp->worldX, y = targetY - pp->worldY;
-    float tx = (x * pp->d - y * pp->b) * id - bone->x, ty = (y * pp->a - x * pp->c) * id - bone->y;
-    float rotationIK = ATAN2(ty, tx) * RAD_DEG - bone->shearX;
-    if (bone->scaleX < 0) rotationIK += 180;
-    if (rotationIK > 180)
-        rotationIK -= 360;
-    else if (rotationIK < -180) rotationIK += 360;
-    spBone_updateWorldTransformWith(bone, bone->x, bone->y, bone->rotation + (rotationIK - bone->rotation) * alpha,
-                                    bone->appliedScaleX,
-                                    bone->appliedScaleY, bone->shearX, bone->shearY);
+void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, float alpha) {
+	spBone* pp = bone->parent;
+	float id = 1 / (pp->a * pp->d - pp->b * pp->c);
+	float x = targetX - pp->worldX, y = targetY - pp->worldY;
+	float tx = (x * pp->d - y * pp->b) * id - bone->x, ty = (y * pp->a - x * pp->c) * id - bone->y;
+	float rotationIK = ATAN2(ty, tx) * RAD_DEG - bone->shearX - bone->rotation;
+	if (bone->scaleX < 0) rotationIK += 180;
+	if (rotationIK > 180) rotationIK -= 360;
+	else if (rotationIK < -180) rotationIK += 360;
+	spBone_updateWorldTransformWith(bone, bone->x, bone->y, bone->rotation + rotationIK * alpha, bone->scaleX,
+		bone->scaleY, bone->shearX, bone->shearY);
 }
 
-void spIkConstraint_apply2(spBone *parent, spBone *child, float targetX, float targetY, int bendDir, float alpha) {
-    float px = parent->x, py = parent->y, psx = parent->appliedScaleX, psy = parent->appliedScaleY;
-    int os1, os2, s2;
-    float cx, cy, csx;
-    int u;
-    spBone *pp;
-    float ppa, ppb, ppc, ppd, id;
-    float x, y;
-    float tx, ty;
-    float dx, dy;
-    float l1, l2, a1, a2;
-    float os;
-    float rotation;
-
-    if (alpha == 0) return;
-    if (psx < 0) {
-        psx = -psx;
-        os1 = 180;
-        s2 = -1;
-    } else {
-        os1 = 0;
-        s2 = 1;
-    }
-    if (psy < 0) {
-        psy = -psy;
-        s2 = -s2;
-    }
-    cx = child->x; cy = child->y; csx = child->appliedScaleX;
-    u = ABS(psx - psy) <= 0.0001f;
-    if (!u && cy != 0) {
-        CONST_CAST(float, child->worldX) = parent->a * cx + parent->worldX;
-        CONST_CAST(float, child->worldY) = parent->c * cx + parent->worldY;
-        cy = 0;
-    }
-    if (csx < 0) {
-        csx = -csx;
-        os2 = 180;
-    } else
-        os2 = 0;
-    pp = parent->parent;
-    ppa = pp->a; ppb = pp->b; ppc = pp->c; ppd = pp->d; id = 1 / (ppa * ppd - ppb * ppc);
-    x = targetX - pp->worldX; y = targetY - pp->worldY;
-    tx = (x * ppd - y * ppb) * id - px; ty = (y * ppa - x * ppc) * id - py;
-    x = child->worldX - pp->worldX;
-    y = child->worldY - pp->worldY;
-    dx = (x * ppd - y * ppb) * id - px; dy = (y * ppa - x * ppc) * id - py;
-    l1 = SQRT(dx * dx + dy * dy); l2 = child->data->length * csx;
-    outer:
-    if (u) {
-        float cosine, a, o;
-        l2 *= psx;
-        cosine = (tx * tx + ty * ty - l1 * l1 - l2 * l2) / (2 * l1 * l2);
-        if (cosine < -1)
-            cosine = -1;
-        else if (cosine > 1) cosine = 1;
-        a2 = ACOS(cosine) * bendDir;
-        a = l1 + l2 * cosine, o = l2 * SIN(a2);
-        a1 = ATAN2(ty * a - tx * o, tx * a + ty * o);
-    } else {
-        float minAngle, minDist, minX, minY, maxAngle, maxDist, maxX, maxY, angle;
-        float a = psx * l2, b = psy * l2, ta = ATAN2(ty, tx);
-        float aa = a * a, bb = b * b, ll = l1 * l1, dd = tx * tx + ty * ty;
-        float c0 = bb * ll + aa * dd - aa * bb, c1 = -2 * bb * l1, c2 = bb - aa;
-        float d = c1 * c1 - 4 * c2 * c0;
-        if (d >= 0) {
-            float q = SQRT(d), r0, r, r1;
-            if (c1 < 0) q = -q;
-            q = -(c1 + q) / 2;
-            r0 = q / c2; r1 = c0 / q;
-            r = ABS(r0) < ABS(r1) ? r0 : r1;
-            if (r * r <= dd) {
-                y = SQRT(dd - r * r) * bendDir;
-                a1 = ta - ATAN2(y, r);
-                a2 = ATAN2(y / psy, (r - l1) / psx);
-                goto outer;
-            }
-        }
-        minAngle = 0; minDist = FLT_MAX; minX = 0; minY = 0;
-        maxAngle = 0; maxDist = 0; maxX = 0; maxY = 0;
-        x = l1 + a;
-        d = x * x;
-        if (d > maxDist) {
-            maxAngle = 0;
-            maxDist = d;
-            maxX = x;
-        }
-        x = l1 - a;
-        d = x * x;
-        if (d < minDist) {
-            minAngle = PI;
-            minDist = d;
-            minX = x;
-        }
-        angle = ACOS(-a * l1 / (aa - bb));
-        x = a * COS(angle) + l1;
-        y = b * SIN(angle);
-        d = x * x + y * y;
-        if (d < minDist) {
-            minAngle = angle;
-            minDist = d;
-            minX = x;
-            minY = y;
-        }
-        if (d > maxDist) {
-            maxAngle = angle;
-            maxDist = d;
-            maxX = x;
-            maxY = y;
-        }
-        if (dd <= (minDist + maxDist) / 2) {
-            a1 = ta - ATAN2(minY * bendDir, minX);
-            a2 = minAngle * bendDir;
-        } else {
-            a1 = ta - ATAN2(maxY * bendDir, maxX);
-            a2 = maxAngle * bendDir;
-        }
-    }
-    os = ATAN2(cy, cx) * s2;
-    a1 = (a1 - os) * RAD_DEG + os1;
-    a2 = ((a2 + os) * RAD_DEG - child->shearX) * s2 + os2;
-    if (a1 > 180)
-        a1 -= 360;
-    else if (a1 < -180) a1 += 360;
-    if (a2 > 180)
-        a2 -= 360;
-    else if (a2 < -180) a2 += 360;
-
-    rotation = parent->rotation;
-    spBone_updateWorldTransformWith(parent, px, py, rotation + (a1 - rotation) * alpha, parent->appliedScaleX,
-                                    parent->appliedScaleY, 0, 0);
-    rotation = child->rotation;
-    spBone_updateWorldTransformWith(child, cx, cy, rotation + (a2 - rotation) * alpha, child->appliedScaleX,
-                                    child->appliedScaleY, child->shearX, child->shearY);
+void spIkConstraint_apply2 (spBone* parent, spBone* child, float targetX, float targetY, int bendDir, float alpha) {
+	float px = parent->x, py = parent->y, psx = parent->scaleX, psy = parent->scaleY;
+	float cx = child->x, cy, csx = child->scaleX, cwx, cwy;
+	int o1, o2, s2, u;
+	spBone* pp = parent->parent;
+	float tx, ty, dx, dy, l1, l2, a1, a2, r;
+	float id, x, y;
+	if (alpha == 0) {
+		spBone_updateWorldTransform(child);
+		return;
+	}
+	if (psx < 0) {
+		psx = -psx;
+		o1 = 180;
+		s2 = -1;
+	} else {
+		o1 = 0;
+		s2 = 1;
+	}
+	if (psy < 0) {
+		psy = -psy;
+		s2 = -s2;
+	}
+	if (csx < 0) {
+		csx = -csx;
+		o2 = 180;
+	} else
+		o2 = 0;
+	r = psx - psy;
+	u = (r < 0 ? -r : r) <= 0.0001f;
+	if (!u) {
+		cy = 0;
+		cwx = parent->a * cx + parent->worldX;
+		cwy = parent->c * cx + parent->worldY;
+	} else {
+		cy = child->y;
+		cwx = parent->a * cx + parent->b * cy + parent->worldX;
+		cwy = parent->c * cx + parent->d * cy + parent->worldY;
+	}
+	id = 1 / (pp->a * pp->d - pp->b * pp->c);
+	x = targetX - pp->worldX;
+	y = targetY - pp->worldY;
+	tx = (x * pp->d - y * pp->b) * id - px;
+	ty = (y * pp->a - x * pp->c) * id - py;
+	x = cwx - pp->worldX;
+	y = cwy - pp->worldY;
+	dx = (x * pp->d - y * pp->b) * id - px;
+	dy = (y * pp->a - x * pp->c) * id - py;
+	l1 = SQRT(dx * dx + dy * dy);
+	l2 = child->data->length * csx;
+	if (u) {
+		float cosine, a, b;
+		l2 *= psx;
+		cosine = (tx * tx + ty * ty - l1 * l1 - l2 * l2) / (2 * l1 * l2);
+		if (cosine < -1) cosine = -1;
+		else if (cosine > 1) cosine = 1;
+		a2 = ACOS(cosine) * bendDir;
+		a = l1 + l2 * cosine;
+		b = l2 * SIN(a2);
+		a1 = ATAN2(ty * a - tx * b, tx * a + ty * b);
+	} else {
+		float a = psx * l2, b = psy * l2;
+		float aa = a * a, bb = b * b, ll = l1 * l1, dd = tx * tx + ty * ty, ta = ATAN2(ty, tx);
+		float c0 = bb * ll + aa * dd - aa * bb, c1 = -2 * bb * l1, c2 = bb - aa;
+		float d = c1 * c1 - 4 * c2 * c0;
+		float minAngle = 0, minDist = FLT_MAX, minX = 0, minY = 0;
+		float maxAngle = 0, maxDist = 0, maxX = 0, maxY = 0;
+		float x = l1 + a, dist = x * x, angle, y;
+		if (d >= 0) {
+			float q = SQRT(d), r0, r1;
+			if (c1 < 0) q = -q;
+			q = -(c1 + q) / 2;
+			r0 = q / c2; r1 = c0 / q;
+			r = ABS(r0) < ABS(r1) ? r0 : r1;
+			if (r * r <= dd) {
+				y = SQRT(dd - r * r) * bendDir;
+				a1 = ta - ATAN2(y, r);
+				a2 = ATAN2(y / psy, (r - l1) / psx);
+				goto outer;
+			}
+		}
+		if (dist > maxDist) {
+			maxAngle = 0;
+			maxDist = dist;
+			maxX = x;
+		}
+		x = l1 - a;
+		dist = x * x;
+		if (dist < minDist) {
+			minAngle = PI;
+			minDist = dist;
+			minX = x;
+		}
+		angle = ACOS(-a * l1 / (aa - bb));
+		x = a * COS(angle) + l1;
+		y = b * SIN(angle);
+		dist = x * x + y * y;
+		if (dist < minDist) {
+			minAngle = angle;
+			minDist = dist;
+			minX = x;
+			minY = y;
+		}
+		if (dist > maxDist) {
+			maxAngle = angle;
+			maxDist = dist;
+			maxX = x;
+			maxY = y;
+		}
+		if (dd <= (minDist + maxDist) / 2) {
+			a1 = ta - ATAN2(minY * bendDir, minX);
+			a2 = minAngle * bendDir;
+		} else {
+			a1 = ta - ATAN2(maxY * bendDir, maxX);
+			a2 = maxAngle * bendDir;
+		}
+	}
+	outer: {
+		float os = ATAN2(cy, cx) * s2;
+		a1 = (a1 - os) * RAD_DEG + o1 - parent->rotation;
+		if (a1 > 180) a1 -= 360;
+		else if (a1 < -180) a1 += 360;
+		spBone_updateWorldTransformWith(parent, px, py, parent->rotation + a1 * alpha, parent->scaleX, parent->scaleY, 0, 0);
+		a2 = ((a2 + os) * RAD_DEG - child->shearX) * s2 + o2 - child->rotation;
+		if (a2 > 180) a2 -= 360;
+		else if (a2 < -180) a2 += 360;
+		spBone_updateWorldTransformWith(child, cx, cy, child->rotation + a2 * alpha, child->scaleX, child->scaleY, child->shearX, child->shearY);
+	}
 }

+ 17 - 19
spine-c/src/spine/MeshAttachment.c

@@ -34,15 +34,15 @@
 
 void _spMeshAttachment_dispose (spAttachment* attachment) {
 	spMeshAttachment* self = SUB_CAST(spMeshAttachment, attachment);
-	_spAttachment_deinit(attachment);
 	FREE(self->path);
 	FREE(self->uvs);
 	if (!self->parentMesh) {
-		FREE(self->vertices);
+		_spVertexAttachment_deinit(SUPER(self));
 		FREE(self->regionUVs);
 		FREE(self->triangles);
 		FREE(self->edges);
-	}
+	} else
+		_spAttachment_deinit(attachment);
 	FREE(self);
 }
 
@@ -52,22 +52,23 @@ spMeshAttachment* spMeshAttachment_create (const char* name) {
 	self->g = 1;
 	self->b = 1;
 	self->a = 1;
-	_spAttachment_init(SUPER(self), name, SP_ATTACHMENT_MESH, _spMeshAttachment_dispose);
+	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_MESH, _spMeshAttachment_dispose);
 	return self;
 }
 
 void spMeshAttachment_updateUVs (spMeshAttachment* self) {
 	int i;
 	float width = self->regionU2 - self->regionU, height = self->regionV2 - self->regionV;
+	int verticesLength = SUPER(self)->worldVerticesLength;
 	FREE(self->uvs);
-	self->uvs = MALLOC(float, self->verticesCount);
+	self->uvs = MALLOC(float, verticesLength);
 	if (self->regionRotate) {
-		for (i = 0; i < self->verticesCount; i += 2) {
+		for (i = 0; i < verticesLength; i += 2) {
 			self->uvs[i] = self->regionU + self->regionUVs[i + 1] * width;
 			self->uvs[i + 1] = self->regionV + height - self->regionUVs[i] * height;
 		}
 	} else {
-		for (i = 0; i < self->verticesCount; i += 2) {
+		for (i = 0; i < verticesLength; i += 2) {
 			self->uvs[i] = self->regionU + self->regionUVs[i] * width;
 			self->uvs[i + 1] = self->regionV + self->regionUVs[i + 1] * height;
 		}
@@ -75,24 +76,21 @@ void spMeshAttachment_updateUVs (spMeshAttachment* self) {
 }
 
 void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, spSlot* slot, float* worldVertices) {
-	int i;
-	float* vertices = self->vertices;
-	const spBone* bone = slot->bone;
-	float x = bone->skeleton->x + bone->worldX, y = bone->skeleton->y + bone->worldY;
-	if (slot->attachmentVerticesCount == self->verticesCount) vertices = slot->attachmentVertices;
-	for (i = 0; i < self->verticesCount; i += 2) {
-		const float vx = vertices[i], vy = vertices[i + 1];
-		worldVertices[i] = vx * bone->a + vy * bone->b + x;
-		worldVertices[i + 1] = vx * bone->c + vy * bone->d + y;
-	}
+	spVertexAttachment_computeWorldVertices(SUPER(self), slot, worldVertices);
 }
 
 void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh) {
 	CONST_CAST(spMeshAttachment*, self->parentMesh) = parentMesh;
 	if (parentMesh) {
-		self->vertices = parentMesh->vertices;
+		self->super.worldVerticesLength = parentMesh->super.worldVerticesLength;
+
+		self->super.bones = parentMesh->super.bones;
+		self->super.bonesCount = parentMesh->super.bonesCount;
+
+		self->super.vertices = parentMesh->super.vertices;
+		self->super.verticesCount = parentMesh->super.verticesCount;
+
 		self->regionUVs = parentMesh->regionUVs;
-		self->verticesCount = parentMesh->verticesCount;
 
 		self->triangles = parentMesh->triangles;
 		self->trianglesCount = parentMesh->trianglesCount;

+ 56 - 0
spine-c/src/spine/PathAttachment.c

@@ -0,0 +1,56 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#include <spine/PathAttachment.h>
+#include <spine/extension.h>
+
+void _spPathAttachment_dispose (spAttachment* attachment) {
+	spPathAttachment* self = SUB_CAST(spPathAttachment, attachment);
+
+	_spVertexAttachment_deinit(SUPER(self));
+
+	FREE(self->lengths);
+	FREE(self);
+}
+
+spPathAttachment* spPathAttachment_create (const char* name) {
+	spPathAttachment* self = NEW(spPathAttachment);
+	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_PATH, _spPathAttachment_dispose);
+	return self;
+}
+
+void spPathAttachment_computeWorldVertices (spPathAttachment* self, spSlot* slot, float* worldVertices) {
+	spVertexAttachment_computeWorldVertices(SUPER(self), slot, worldVertices);
+}
+
+void spPathAttachment_computeWorldVertices1 (spPathAttachment* self, spSlot* slot, int start, int count, float* worldVertices, int offset) {
+	spVertexAttachment_computeWorldVertices1(SUPER(self), start, count, slot, worldVertices, offset);
+}

+ 451 - 0
spine-c/src/spine/PathConstraint.c

@@ -0,0 +1,451 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#include <spine/PathConstraint.h>
+#include <spine/Skeleton.h>
+#include <spine/extension.h>
+
+#define PATHCONSTRAINT_NONE -1
+#define PATHCONSTRAINT_BEFORE -2
+#define PATHCONSTRAINT_AFTER -3
+
+spPathConstraint* spPathConstraint_create (spPathConstraintData* data, const spSkeleton* skeleton) {
+	int i;
+	spPathConstraint *self = NEW(spPathConstraint);
+	CONST_CAST(spPathConstraintData*, self->data) = data;
+	self->bonesCount = data->bonesCount;
+	CONST_CAST(spBone**, self->bones) = MALLOC(spBone*, self->bonesCount);
+	for (i = 0; i < self->bonesCount; ++i)
+		self->bones[i] = spSkeleton_findBone(skeleton, self->data->bones[i]->name);
+	self->target = spSkeleton_findSlot(skeleton, self->data->target->name);
+	self->position = data->position;
+	self->spacing = data->spacing;
+	self->rotateMix = data->rotateMix;
+	self->translateMix = data->translateMix;
+	self->spacesCount = 0;
+	self->spaces = 0;
+	self->positionsCount = 0;
+	self->positions = 0;
+	self->worldCount = 0;
+	self->world = 0;
+	self->curvesCount = 0;
+	self->curves = 0;
+	self->lengthsCount = 0;
+	self->lengths = 0;
+	return self;
+}
+
+void spPathConstraint_dispose (spPathConstraint* self) {
+	FREE(self->bones);
+	FREE(self->spaces);
+	if (self->positions) FREE(self->positions);
+	if (self->world) FREE(self->world);
+	if (self->curves) FREE(self->curves);
+	if (self->lengths) FREE(self->lengths);
+	FREE(self);
+}
+
+void spPathConstraint_apply (spPathConstraint* self) {
+	int i, p, n;
+	float length, x, y, dx, dy, s;
+	float* spaces, *lengths, *positions;
+	float spacing;
+	spSkeleton* skeleton;
+	float skeletonX, skeletonY, boneX, boneY, offsetRotation;
+	int/*bool*/tip;
+	float rotateMix = self->rotateMix, translateMix = self->translateMix;
+	int/*bool*/ translate = translateMix > 0, rotate = rotateMix > 0;
+	spPathAttachment* attachment = (spPathAttachment*)self->target->attachment;
+	spPathConstraintData* data = self->data;
+	spSpacingMode spacingMode = data->spacingMode;
+	int lengthSpacing = spacingMode == SP_SPACING_MODE_LENGTH;
+	spRotateMode rotateMode = data->rotateMode;
+	int tangents = rotateMode == SP_ROTATE_MODE_TANGENT, scale = rotateMode == SP_ROTATE_MODE_CHAIN_SCALE;
+	int boneCount = self->bonesCount, spacesCount = tangents ? boneCount : boneCount + 1;
+	spBone** bones = self->bones;
+
+	if (!translate && !rotate) return;
+	if ((attachment == 0) || (attachment->super.super.type != SP_ATTACHMENT_PATH)) return;
+
+	if (self->spacesCount != spacesCount) {
+		if (self->spaces) FREE(self->spaces);
+		self->spaces = MALLOC(float, spacesCount);
+		self->spacesCount = spacesCount;
+	}
+	spaces = self->spaces;
+	lengths = 0;
+	spacing = self->spacing;
+	if (scale || lengthSpacing) {
+		if (scale) {
+			if (self->lengthsCount != boneCount) {
+				if (self->lengths) FREE(self->lengths);
+				self->lengths = MALLOC(float, boneCount);
+				self->lengthsCount = boneCount;
+			}
+			lengths = self->lengths;
+		}
+		for (i = 0, n = spacesCount - 1; i < n;) {
+			spBone* bone = bones[i];
+			length = bone->data->length, x = length * bone->a, y = length * bone->c;
+			length = SQRT(x * x + y * y);
+			if (scale) lengths[i] = length;
+			spaces[++i] = lengthSpacing ? MAX(0, length + spacing) : spacing;
+		}
+	} else {
+		for (i = 1; i < spacesCount; i++) {
+			spaces[i] = spacing;
+		}
+	}
+
+	positions = spPathConstraint_computeWorldPositions(self, attachment, spacesCount, tangents,
+											 data->positionMode == SP_POSITION_MODE_PERCENT, spacingMode == SP_SPACING_MODE_PERCENT);
+	skeleton = self->target->bone->skeleton;
+	skeletonX = skeleton->x, skeletonY = skeleton->y;
+	boneX = positions[0], boneY = positions[1], offsetRotation = self->data->offsetRotation;
+	tip = rotateMode == SP_ROTATE_MODE_CHAIN_SCALE && offsetRotation == 0;
+	for (i = 0, p = 3; i < boneCount; i++, p += 3) {
+		spBone* bone = bones[i];
+		CONST_CAST(float, bone->worldX) += (boneX - skeletonX - bone->worldX) * translateMix;
+		CONST_CAST(float, bone->worldY) += (boneY - skeletonY - bone->worldY) * translateMix;
+		x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY;
+		if (scale) {
+			length = lengths[i];
+			if (length != 0) {
+				s = (SQRT(dx * dx + dy * dy) / length - 1) * rotateMix + 1;
+				CONST_CAST(float, bone->a) *= s;
+				CONST_CAST(float, bone->c) *= s;
+			}
+		}
+		boneX = x;
+		boneY = y;
+		if (rotate) {
+			float a = bone->a, b = bone->b, c = bone->c, d = bone->d, r, cosine, sine;
+			if (tangents)
+				r = positions[p - 1];
+			else if (spaces[i + 1] == 0)
+				r = positions[p + 2];
+			else
+				r = ATAN2(dy, dx);
+			r -= ATAN2(c, a) - offsetRotation * DEG_RAD;
+			if (tip) {
+				cosine = COS(r);
+				sine = SIN(r);
+				length = bone->data->length;
+				boneX += (length * (cosine * a - sine * c) - dx) * rotateMix;
+				boneY += (length * (sine * a + cosine * c) - dy) * rotateMix;
+			}
+			if (r > PI)
+				r -= PI2;
+			else if (r < -PI)
+				r += PI2;
+			r *= rotateMix;
+			cosine = COS(r);
+			sine = SIN(r);
+			CONST_CAST(float, bone->a) = cosine * a - sine * c;
+			CONST_CAST(float, bone->b) = cosine * b - sine * d;
+			CONST_CAST(float, bone->c) = sine * a + cosine * c;
+			CONST_CAST(float, bone->d) = sine * b + cosine * d;
+		}
+	}
+}
+
+static void _addBeforePosition(float p, float* temp, int i, float* out, int o) {
+	float x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = ATAN2(dy, dx);
+	out[o] = x1 + p * COS(r);
+	out[o + 1] = y1 + p * SIN(r);
+	out[o + 2] = r;
+}
+
+static void _addAfterPosition (float p, float* temp, int i, float* out, int o) {
+	float x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = ATAN2(dy, dx);
+	out[o] = x1 + p * COS(r);
+	out[o + 1] = y1 + p * SIN(r);
+	out[o + 2] = r;
+}
+
+static void _addCurvePosition (float p, float x1, float y1, float cx1, float cy1, float cx2, float cy2, float x2, float y2,
+							   float* out, int o, int/*bool*/tangents) {
+	float tt, ttt, u, uu, uuu;
+	float ut, ut3, uut3, utt3;
+	float x, y;
+	if (p == 0) p = 0.0001f;
+	tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u;
+	ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p;
+	x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;
+	out[o] = x;
+	out[o + 1] = y;
+	if (tangents) out[o + 2] = ATAN2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));
+}
+
+float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAttachment* path, int spacesCount, int/*bool*/ tangents, int/*bool*/percentPosition, int/**/percentSpacing) {
+	int i, o, w, curve, segment, /*bool*/closed, verticesLength, curveCount, prevCurve;
+	float* out, *curves, *segments;
+	float tmpx, tmpy, dddfx, dddfy, ddfx, ddfy, dfx, dfy, pathLength, curveLength, p;
+	float x1, y1, cx1, cy1, cx2, cy2, x2, y2;
+	spSlot* target = self->target;
+	float position = self->position;
+	float* spaces = self->spaces, *world = 0;
+	if (self->positionsCount != spacesCount * 3 + 2) {
+		if (self->positions) FREE(self->positions);
+		self->positions = MALLOC(float, spacesCount * 3 + 2);
+		self->positionsCount = spacesCount * 3 + 2;
+	}
+	out = self->positions;
+	closed = path->closed;
+	verticesLength = path->super.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PATHCONSTRAINT_NONE;
+
+	if (!path->constantSpeed) {
+		float* lengths = path->lengths;
+		curveCount -= closed ? 1 : 2;
+		pathLength = lengths[curveCount];
+		if (percentPosition) position *= pathLength;
+		if (percentSpacing) {
+			for (i = 0; i < spacesCount; i++)
+				spaces[i] *= pathLength;
+		}
+		if (self->worldCount != 8) {
+			if (self->world) FREE(self->world);
+			self->world = MALLOC(float, 8);
+			self->worldCount = 8;
+		}
+		world = self->world;
+		for (i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {
+			float space = spaces[i];
+			position += space;
+			p = position;
+
+			if (closed) {
+				p = FMOD(p, pathLength);
+				if (p < 0) p += pathLength;
+				curve = 0;
+			} else if (p < 0) {
+				if (prevCurve != PATHCONSTRAINT_BEFORE) {
+					prevCurve = PATHCONSTRAINT_BEFORE;
+					spPathAttachment_computeWorldVertices1(path, target, 2, 4, world, 0);
+				}
+				_addBeforePosition(p, world, 0, out, o);
+				continue;
+			} else if (p > pathLength) {
+				if (prevCurve != PATHCONSTRAINT_AFTER) {
+					prevCurve = PATHCONSTRAINT_AFTER;
+					spPathAttachment_computeWorldVertices1(path, target, verticesLength - 6, 4, world, 0);
+				}
+				_addAfterPosition(p - pathLength, world, 0, out, o);
+				continue;
+			}
+
+			/* Determine curve containing position. */
+			for (;; curve++) {
+				float length = lengths[curve];
+				if (p > length) continue;
+				if (curve == 0)
+					p /= length;
+				else {
+					float prev = lengths[curve - 1];
+					p = (p - prev) / (length - prev);
+				}
+				break;
+			}
+			if (curve != prevCurve) {
+				prevCurve = curve;
+				if (closed && curve == curveCount) {
+					spPathAttachment_computeWorldVertices1(path, target, verticesLength - 4, 4, world, 0);
+					spPathAttachment_computeWorldVertices1(path, target, 0, 4, world, 4);
+				} else
+					spPathAttachment_computeWorldVertices1(path, target, curve * 6 + 2, 8, world, 0);
+			}
+			_addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o,
+							 tangents || (i > 0 && space == 0));
+		}
+		return out;
+	}
+
+	/* World vertices. */
+	if (closed) {
+		verticesLength += 2;
+		if (self->worldCount != verticesLength) {
+			if (self->world) FREE(self->world);
+			self->world = MALLOC(float, verticesLength);
+			self->worldCount = verticesLength;
+		}
+		world = self->world;
+		spPathAttachment_computeWorldVertices1(path, target, 2, verticesLength - 4, world, 0);
+		spPathAttachment_computeWorldVertices1(path, target, 0, 2, world, verticesLength - 4);
+		world[verticesLength - 2] = world[0];
+		world[verticesLength - 1] = world[1];
+	} else {
+		curveCount--;
+		verticesLength -= 4;
+		if (self->worldCount != verticesLength) {
+			if (self->world) FREE(self->world);
+			self->world = MALLOC(float, verticesLength);
+			self->worldCount = verticesLength;
+		}
+		spPathAttachment_computeWorldVertices1(path, target, 2, verticesLength, world, 0);
+	}
+
+	/* Curve lengths. */
+	if (self->curvesCount != curveCount) {
+		if (self->curves) FREE(self->curves);
+		self->curves = MALLOC(float, curveCount);
+		self->curvesCount = curveCount;
+	}
+	curves = self->curves;
+	pathLength = 0;
+	x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0;
+	for (i = 0, w = 2; i < curveCount; i++, w += 6) {
+		cx1 = world[w];
+		cy1 = world[w + 1];
+		cx2 = world[w + 2];
+		cy2 = world[w + 3];
+		x2 = world[w + 4];
+		y2 = world[w + 5];
+		tmpx = (x1 - cx1 * 2 + cx2) * 0.1875f;
+		tmpy = (y1 - cy1 * 2 + cy2) * 0.1875f;
+		dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375f;
+		dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375f;
+		ddfx = tmpx * 2 + dddfx;
+		ddfy = tmpy * 2 + dddfy;
+		dfx = (cx1 - x1) * 0.75f + tmpx + dddfx * 0.16666667f;
+		dfy = (cy1 - y1) * 0.75f + tmpy + dddfy * 0.16666667f;
+		pathLength += SQRT(dfx * dfx + dfy * dfy);
+		dfx += ddfx;
+		dfy += ddfy;
+		ddfx += dddfx;
+		ddfy += dddfy;
+		pathLength += SQRT(dfx * dfx + dfy * dfy);
+		dfx += ddfx;
+		dfy += ddfy;
+		pathLength += SQRT(dfx * dfx + dfy * dfy);
+		dfx += ddfx + dddfx;
+		dfy += ddfy + dddfy;
+		pathLength += SQRT(dfx * dfx + dfy * dfy);
+		curves[i] = pathLength;
+		x1 = x2;
+		y1 = y2;
+	}
+	if (percentPosition) position *= pathLength;
+	if (percentSpacing) {
+		for (i = 0; i < spacesCount; i++)
+			spaces[i] *= pathLength;
+	}
+
+	segments = self->segments;
+	curveLength = 0;
+	for (i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {
+		float space = spaces[i];
+		position += space;
+		p = position;
+
+		if (closed) {
+			p = FMOD(p, pathLength);
+			if (p < 0) p += pathLength;
+			curve = 0;
+		} else if (p < 0) {
+			_addBeforePosition(p, world, 0, out, o);
+			continue;
+		} else if (p > pathLength) {
+			_addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);
+			continue;
+		}
+
+		/* Determine curve containing position. */
+		for (;; curve++) {
+			float length = curves[curve];
+			if (p > length) continue;
+			if (curve == 0)
+				p /= length;
+			else {
+				float prev = curves[curve - 1];
+				p = (p - prev) / (length - prev);
+			}
+			break;
+		}
+
+		/* Curve segment lengths. */
+		if (curve != prevCurve) {
+			int ii;
+			prevCurve = curve;
+			ii = curve * 6;
+			x1 = world[ii];
+			y1 = world[ii + 1];
+			cx1 = world[ii + 2];
+			cy1 = world[ii + 3];
+			cx2 = world[ii + 4];
+			cy2 = world[ii + 5];
+			x2 = world[ii + 6];
+			y2 = world[ii + 7];
+			tmpx = (x1 - cx1 * 2 + cx2) * 0.03f;
+			tmpy = (y1 - cy1 * 2 + cy2) * 0.03f;
+			dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006f;
+			dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006f;
+			ddfx = tmpx * 2 + dddfx;
+			ddfy = tmpy * 2 + dddfy;
+			dfx = (cx1 - x1) * 0.3f + tmpx + dddfx * 0.16666667f;
+			dfy = (cy1 - y1) * 0.3f + tmpy + dddfy * 0.16666667f;
+			curveLength = SQRT(dfx * dfx + dfy * dfy);
+			segments[0] = curveLength;
+			for (ii = 1; ii < 8; ii++) {
+				dfx += ddfx;
+				dfy += ddfy;
+				ddfx += dddfx;
+				ddfy += dddfy;
+				curveLength += SQRT(dfx * dfx + dfy * dfy);
+				segments[ii] = curveLength;
+			}
+			dfx += ddfx;
+			dfy += ddfy;
+			curveLength += SQRT(dfx * dfx + dfy * dfy);
+			segments[8] = curveLength;
+			dfx += ddfx + dddfx;
+			dfy += ddfy + dddfy;
+			curveLength += SQRT(dfx * dfx + dfy * dfy);
+			segments[9] = curveLength;
+			segment = 0;
+		}
+
+		/* Weight by segment length. */
+		p *= curveLength;
+		for (;; segment++) {
+			float length = segments[segment];
+			if (p > length) continue;
+			if (segment == 0)
+				p /= length;
+			else {
+				float prev = segments[segment - 1];
+				p = segment + (p - prev) / (length - prev);
+			}
+			break;
+		}
+		_addCurvePosition(p * 0.1f, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));
+	}
+	return out;
+}

+ 45 - 0
spine-c/src/spine/PathConstraintData.c

@@ -0,0 +1,45 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#include <spine/PathConstraintData.h>
+#include <spine/extension.h>
+
+spPathConstraintData* spPathConstraintData_create (const char* name) {
+	spPathConstraintData* self = NEW(spPathConstraintData);
+	MALLOC_STR(self->name, name);
+	return self;
+}
+
+void spPathConstraintData_dispose (spPathConstraintData* self) {
+	FREE(self->name);
+	FREE(self->bones);
+	FREE(self);
+}

+ 214 - 55
spine-c/src/spine/Skeleton.c

@@ -30,11 +30,13 @@
  *****************************************************************************/
 
 #include <spine/Skeleton.h>
+#include <stdlib.h>
 #include <string.h>
 #include <spine/extension.h>
+#include <spine/Skin.h>
 
 typedef enum {
-	SP_UPDATE_BONE, SP_UPDATE_IK_CONSTRAINT, SP_UPDATE_TRANSFORM_CONSTRAINT
+	SP_UPDATE_BONE, SP_UPDATE_IK_CONSTRAINT, SP_UPDATE_PATH_CONSTRAINT, SP_UPDATE_TRANSFORM_CONSTRAINT
 } _spUpdateType;
 
 typedef struct {
@@ -46,11 +48,13 @@ typedef struct {
 	spSkeleton super;
 
 	int updateCacheCount;
+	int updateCacheCapacity;
 	_spUpdate* updateCache;
 } _spSkeleton;
 
 spSkeleton* spSkeleton_create (spSkeletonData* data) {
-	int i, ii;
+	int i;
+	int* childrenCounts;
 
 	_spSkeleton* internal = NEW(_spSkeleton);
 	spSkeleton* self = SUPER(internal);
@@ -58,20 +62,30 @@ spSkeleton* spSkeleton_create (spSkeletonData* data) {
 
 	self->bonesCount = self->data->bonesCount;
 	self->bones = MALLOC(spBone*, self->bonesCount);
+	childrenCounts = CALLOC(int, self->bonesCount);
 
 	for (i = 0; i < self->bonesCount; ++i) {
 		spBoneData* boneData = self->data->bones[i];
-		spBone* parent = 0;
-		if (boneData->parent) {
-			/* Find parent bone. */
-			for (ii = 0; ii < self->bonesCount; ++ii) {
-				if (data->bones[ii] == boneData->parent) {
-					parent = self->bones[ii];
-					break;
-				}
-			}
+		spBone* bone;
+		if (!boneData->parent)
+			bone = spBone_create(boneData, self, 0);
+		else {
+			spBone* parent = self->bones[boneData->parent->index];
+			bone = spBone_create(boneData, self, parent);
+			++childrenCounts[boneData->parent->index];
 		}
-		self->bones[i] = spBone_create(boneData, self, parent);
+		self->bones[i] = bone;
+	}
+	for (i = 0; i < self->bonesCount; ++i) {
+		spBoneData* boneData = self->data->bones[i];
+		spBone* bone = self->bones[i];
+		CONST_CAST(spBone**, bone->children) = MALLOC(spBone*, childrenCounts[boneData->index]);
+	}
+	for (i = 0; i < self->bonesCount; ++i) {
+		spBone* bone = self->bones[i];
+		spBone* parent = bone->parent;
+		if (parent)
+			parent->children[parent->childrenCount++] = bone;
 	}
 	CONST_CAST(spBone*, self->root) = self->bones[0];
 
@@ -79,28 +93,16 @@ spSkeleton* spSkeleton_create (spSkeletonData* data) {
 	self->slots = MALLOC(spSlot*, self->slotsCount);
 	for (i = 0; i < self->slotsCount; ++i) {
 		spSlotData *slotData = data->slots[i];
-
-		/* Find bone for the slotData's boneData. */
-		spBone* bone = 0;
-		for (ii = 0; ii < self->bonesCount; ++ii) {
-			if (data->bones[ii] == slotData->boneData) {
-				bone = self->bones[ii];
-				break;
-			}
-		}
+		spBone* bone = self->bones[slotData->boneData->index];
 		self->slots[i] = spSlot_create(slotData, bone);
 	}
 
 	self->drawOrder = MALLOC(spSlot*, self->slotsCount);
 	memcpy(self->drawOrder, self->slots, sizeof(spSlot*) * self->slotsCount);
 
-	self->r = 1;
-	self->g = 1;
-	self->b = 1;
-	self->a = 1;
-
 	self->ikConstraintsCount = data->ikConstraintsCount;
 	self->ikConstraints = MALLOC(spIkConstraint*, self->ikConstraintsCount);
+	self->ikConstraintsSorted = MALLOC(spIkConstraint*, self->ikConstraintsCount);
 	for (i = 0; i < self->data->ikConstraintsCount; ++i)
 		self->ikConstraints[i] = spIkConstraint_create(self->data->ikConstraints[i], self);
 
@@ -109,8 +111,17 @@ spSkeleton* spSkeleton_create (spSkeletonData* data) {
 	for (i = 0; i < self->data->transformConstraintsCount; ++i)
 		self->transformConstraints[i] = spTransformConstraint_create(self->data->transformConstraints[i], self);
 
+	self->pathConstraintsCount = data->pathConstraintsCount;
+	self->pathConstraints = MALLOC(spPathConstraint*, self->pathConstraintsCount);
+	for (i = 0; i < self->data->pathConstraintsCount; i++)
+		self->pathConstraints[i] = spPathConstraint_create(self->data->pathConstraints[i], self);
+
+	self->r = 1; self->g = 1; self->b = 1; self->a = 1;
+
 	spSkeleton_updateCache(self);
 
+	FREE(childrenCounts);
+
 	return self;
 }
 
@@ -131,55 +142,184 @@ void spSkeleton_dispose (spSkeleton* self) {
 	for (i = 0; i < self->ikConstraintsCount; ++i)
 		spIkConstraint_dispose(self->ikConstraints[i]);
 	FREE(self->ikConstraints);
+	FREE(self->ikConstraintsSorted);
 
 	for (i = 0; i < self->transformConstraintsCount; ++i)
 		spTransformConstraint_dispose(self->transformConstraints[i]);
 	FREE(self->transformConstraints);
 
+	for (i = 0; i < self->pathConstraintsCount; i++)
+		spPathConstraint_dispose(self->pathConstraints[i]);
+	FREE(self->pathConstraints);
+
 	FREE(self->drawOrder);
 	FREE(self);
 }
 
-void spSkeleton_updateCache (const spSkeleton* self) {
-	int i, ii;
+static void _addToUpdateCache(_spSkeleton* const internal, _spUpdateType type, void *object) {
 	_spUpdate* update;
+	if (internal->updateCacheCount == internal->updateCacheCapacity) {
+		internal->updateCacheCapacity *= 2;
+		internal->updateCache = realloc(internal->updateCache, sizeof(_spUpdate) * internal->updateCacheCapacity);
+	}
+	update = internal->updateCache + internal->updateCacheCount;
+	update->type = type;
+	update->object = object;
+	++internal->updateCacheCount;
+}
+
+static void _sortBone(_spSkeleton* const internal, spBone* bone) {
+	if (bone->sorted) return;
+	if (bone->parent) _sortBone(internal, bone->parent);
+	bone->sorted = 1;
+	_addToUpdateCache(internal, SP_UPDATE_BONE, bone);
+}
+
+static void _sortPathConstraintAttachmentBones(_spSkeleton* const internal, spAttachment* attachment, spBone* slotBone) {
+	spPathAttachment* pathAttachment = (spPathAttachment*)attachment;
+	int* pathBones;
+	int pathBonesCount;
+	if (pathAttachment->super.super.type != SP_ATTACHMENT_PATH) return;
+	pathBones = pathAttachment->super.bones;
+	pathBonesCount = pathAttachment->super.bonesCount;
+	if (pathBones == 0)
+		_sortBone(internal, slotBone);
+	else {
+		spBone** bones = internal->super.bones;
+		int i;
+		for (i = 0; i < pathBonesCount; i++)
+			_sortBone(internal, bones[pathBones[i]]);
+	}
+}
+
+static void _sortPathConstraintAttachment(_spSkeleton* const internal, spSkin* skin, int slotIndex, spBone* slotBone) {
+	_Entry* entry = SUB_CAST(_spSkin, skin)->entries;
+	while (entry) {
+		if (entry->slotIndex == slotIndex) _sortPathConstraintAttachmentBones(internal, entry->attachment, slotBone);
+		entry = entry->next;
+	}
+}
+
+static void _sortReset(spBone** bones, int bonesCount) {
+	int i;
+	for (i = 0; i < bonesCount; ++i) {
+		spBone* bone = bones[i];
+		if (bone->sorted) _sortReset(bone->children, bone->childrenCount);
+		bone->sorted = 0;
+	}
+}
+
+void spSkeleton_updateCache (spSkeleton* self) {
+	int i, ii, n, nn, level;
+	spBone** bones;
+	spIkConstraint** ikConstraints;
+	spPathConstraint** pathConstraints;
+	spTransformConstraint** transformConstraints;
 	_spSkeleton* internal = SUB_CAST(_spSkeleton, self);
-	int capacity = self->bonesCount + self->transformConstraintsCount + self->ikConstraintsCount;
+	internal->updateCacheCapacity = self->bonesCount + self->ikConstraintsCount + self->transformConstraintsCount + self->pathConstraintsCount;
 
 	FREE(internal->updateCache);
-	internal->updateCache = MALLOC(_spUpdate, capacity);
+	internal->updateCache = MALLOC(_spUpdate, internal->updateCacheCapacity);
 	internal->updateCacheCount = 0;
 
-	for (i = 0; i < self->bonesCount; ++i) {
-		spBone* bone = self->bones[i];
-		update = internal->updateCache + internal->updateCacheCount++;
-		update->type = SP_UPDATE_BONE;
-		update->object = bone;
-		for (ii = 0; ii < self->ikConstraintsCount; ++ii) {
-			spIkConstraint* ikConstraint = self->ikConstraints[ii];
-			if (bone == ikConstraint->bones[ikConstraint->bonesCount - 1]) {
-				update = internal->updateCache + internal->updateCacheCount++;
-				update->type = SP_UPDATE_IK_CONSTRAINT;
-				update->object = ikConstraint;
-				break;
-			}
+	bones = self->bones;
+	for (i = 0; i < self->bonesCount; ++i)
+		bones[i]->sorted = 0;
+
+	/* IK first, lowest hierarchy depth first. */
+	if (self->ikConstraintsSorted) FREE(self->ikConstraintsSorted);
+	self->ikConstraintsSorted = MALLOC(spIkConstraint*, self->ikConstraintsCount);
+	ikConstraints = self->ikConstraintsSorted;
+	for (i = 0; i < self->ikConstraintsCount; ++i)
+		ikConstraints[i] = self->ikConstraints[i];
+	for (i = 0; i < self->ikConstraintsCount; ++i) {
+		spIkConstraint* ik = ikConstraints[i];
+		spBone* bone = ik->bones[0]->parent;
+		for (level = 0; bone; ++level)
+			bone = bone->parent;
+		ik->level = level;
+	}
+	for (i = 1; i < self->ikConstraintsCount; ++i) {
+		spIkConstraint* ik = ikConstraints[i];
+		level = ik->level;
+		for (ii = i - 1; ii >= 0; --ii) {
+			spIkConstraint* other = ikConstraints[ii];
+			if (other->level < level) break;
+			ikConstraints[ii + 1] = other;
 		}
+		ikConstraints[ii + 1] = ik;
 	}
+	for (i = 0; i < self->ikConstraintsCount; ++i) {
+		spBone** constrained;
+		spBone* parent;
+		spIkConstraint* constraint = ikConstraints[i];
+		spBone* target = constraint->target;
+		_sortBone(internal, target);
 
-	for (i = 0; i < self->transformConstraintsCount; ++i) {
-		spTransformConstraint* transformConstraint = self->transformConstraints[i];
-		for (ii = internal->updateCacheCount - 1; ii >= 0; --ii) {
-			if (internal->updateCache[ii].object == transformConstraint->bone) {
-				int insertIndex = ii + 1;
-				update = internal->updateCache + insertIndex;
-				memmove(update + 1, update, (internal->updateCacheCount - insertIndex) * sizeof(_spUpdate));
-				update->type = SP_UPDATE_TRANSFORM_CONSTRAINT;
-				update->object = transformConstraint;
-				internal->updateCacheCount++;
-				break;
-			}
+		constrained = constraint->bones;
+		parent = constrained[0];
+		_sortBone(internal, parent);
+
+		_addToUpdateCache(internal, SP_UPDATE_IK_CONSTRAINT, constraint);
+
+		_sortReset(parent->children, parent->childrenCount);
+		constrained[constraint->bonesCount - 1]->sorted = 1;
+	}
+
+	pathConstraints = self->pathConstraints;
+	for (i = 0, n = self->pathConstraintsCount; i < n; i++) {
+		spAttachment* attachment;
+		spBone** constrained;
+		int boneCount;
+		spPathConstraint* constraint = pathConstraints[i];
+
+		spSlot* slot = constraint->target;
+		int slotIndex = slot->data->index;
+		spBone* slotBone = slot->bone;
+		if (self->skin) _sortPathConstraintAttachment(internal, self->skin, slotIndex, slotBone);
+		if (self->data->defaultSkin && self->data->defaultSkin != self->skin)
+			_sortPathConstraintAttachment(internal, self->data->defaultSkin, slotIndex, slotBone);
+		for (ii = 0, nn = self->data->skinsCount; ii < nn; ii++)
+			_sortPathConstraintAttachment(internal, self->data->skins[ii], slotIndex, slotBone);
+
+		attachment = slot->attachment;
+		if (attachment->type == SP_ATTACHMENT_PATH) _sortPathConstraintAttachmentBones(internal, attachment, slotBone);
+
+		constrained = constraint->bones;
+		boneCount = constraint->bonesCount;
+		for (ii = 0; ii < boneCount; ii++)
+			_sortBone(internal, constrained[ii]);
+
+		_addToUpdateCache(internal, SP_UPDATE_PATH_CONSTRAINT, constraint);
+
+		for (ii = 0; ii < boneCount; ii++)
+			_sortReset(constrained[ii]->children, constrained[ii]->childrenCount);
+		for (ii = 0; ii < boneCount; ii++)
+			constrained[ii]->sorted = 1;
+	}
+
+	transformConstraints = self->transformConstraints;
+	for (i = 0, n = self->transformConstraintsCount; i < n; ++i) {
+		spTransformConstraint* constraint = transformConstraints[i];
+		spBone** constrained = constraint->bones;
+
+		_sortBone(internal, constraint->target);
+
+		for (ii = 0; ii < constraint->bonesCount; ++ii)
+			_sortBone(internal, constrained[ii]);
+
+		_addToUpdateCache(internal, SP_UPDATE_TRANSFORM_CONSTRAINT, constraint);
+
+		for (ii = 0; ii < constraint->bonesCount; ++ii) {
+			spBone* bone = constrained[ii];
+			_sortReset(bone->children, bone->childrenCount);
 		}
+		for (ii = 0; ii < constraint->bonesCount; ++ii)
+			constrained[ii]->sorted = 1;
 	}
+
+	for (i = 0; i < self->bonesCount; ++i)
+		_sortBone(internal, self->bones[i]);
 }
 
 void spSkeleton_updateWorldTransform (const spSkeleton* self) {
@@ -198,6 +338,9 @@ void spSkeleton_updateWorldTransform (const spSkeleton* self) {
 		case SP_UPDATE_TRANSFORM_CONSTRAINT:
 			spTransformConstraint_apply((spTransformConstraint*)update->object);
 			break;
+		case SP_UPDATE_PATH_CONSTRAINT:
+			spPathConstraint_apply((spPathConstraint*)update->object);
+			break;
 		}
 	}
 }
@@ -226,6 +369,15 @@ void spSkeleton_setBonesToSetupPose (const spSkeleton* self) {
 		constraint->scaleMix = data->scaleMix;
 		constraint->shearMix = data->shearMix;
 	}
+
+	for (i = 0; i < self->pathConstraintsCount; ++i) {
+		spPathConstraint* constraint = self->pathConstraints[i];
+		spPathConstraintData* data = constraint->data;
+		constraint->position = data->position;
+		constraint->spacing = data->spacing;
+		constraint->rotateMix = data->rotateMix;
+		constraint->translateMix = data->translateMix;
+	}
 }
 
 void spSkeleton_setSlotsToSetupPose (const spSkeleton* self) {
@@ -344,6 +496,13 @@ spTransformConstraint* spSkeleton_findTransformConstraint (const spSkeleton* sel
 	return 0;
 }
 
+spPathConstraint* spSkeleton_findPathConstraint (const spSkeleton* self, const char* constraintName) {
+	int i;
+	for (i = 0; i < self->pathConstraintsCount; ++i)
+		if (strcmp(self->pathConstraints[i]->data->name, constraintName) == 0) return self->pathConstraints[i];
+	return 0;
+}
+
 void spSkeleton_update (spSkeleton* self, float deltaTime) {
 	self->time += deltaTime;
 }

+ 4 - 4
spine-c/src/spine/SkeletonBounds.c

@@ -137,12 +137,12 @@ void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/
 		self->boundingBoxes[self->count] = boundingBox;
 
 		polygon = self->polygons[self->count];
-		if (!polygon || polygon->capacity < boundingBox->verticesCount) {
+		if (!polygon || polygon->capacity < boundingBox->super.worldVerticesLength) {
 			if (polygon) spPolygon_dispose(polygon);
-			self->polygons[self->count] = polygon = spPolygon_create(boundingBox->verticesCount);
+			self->polygons[self->count] = polygon = spPolygon_create(boundingBox->super.worldVerticesLength);
 		}
-		polygon->count = boundingBox->verticesCount;
-		spBoundingBoxAttachment_computeWorldVertices(boundingBox, slot->bone, polygon->vertices);
+		polygon->count = boundingBox->super.worldVerticesLength;
+		spBoundingBoxAttachment_computeWorldVertices(boundingBox, slot, polygon->vertices);
 
 		if (updateAabb) {
 			int ii = 0;

+ 11 - 0
spine-c/src/spine/SkeletonData.c

@@ -67,6 +67,10 @@ void spSkeletonData_dispose (spSkeletonData* self) {
 		spTransformConstraintData_dispose(self->transformConstraints[i]);
 	FREE(self->transformConstraints);
 
+	for (i = 0; i < self->pathConstraintsCount; i++)
+		spPathConstraintData_dispose(self->pathConstraints[i]);
+	FREE(self->pathConstraints);
+
 	FREE(self->hash);
 	FREE(self->version);
 
@@ -135,3 +139,10 @@ spTransformConstraintData* spSkeletonData_findTransformConstraint (const spSkele
 		if (strcmp(self->transformConstraints[i]->name, constraintName) == 0) return self->transformConstraints[i];
 	return 0;
 }
+
+spPathConstraintData* spSkeletonData_findPathConstraint (const spSkeletonData* self, const char* constraintName) {
+	int i;
+	for (i = 0; i < self->pathConstraintsCount; ++i)
+		if (strcmp(self->pathConstraints[i]->name, constraintName) == 0) return self->pathConstraints[i];
+	return 0;
+}

File diff suppressed because it is too large
+ 411 - 325
spine-c/src/spine/SkeletonJson.c


+ 0 - 13
spine-c/src/spine/Skin.c

@@ -32,14 +32,6 @@
 #include <spine/Skin.h>
 #include <spine/extension.h>
 
-typedef struct _Entry _Entry;
-struct _Entry {
-	int slotIndex;
-	const char* name;
-	spAttachment* attachment;
-	_Entry* next;
-};
-
 _Entry* _Entry_create (int slotIndex, const char* name, spAttachment* attachment) {
 	_Entry* self = NEW(_Entry);
 	self->slotIndex = slotIndex;
@@ -56,11 +48,6 @@ void _Entry_dispose (_Entry* self) {
 
 /**/
 
-typedef struct {
-	spSkin super;
-	_Entry* entries;
-} _spSkin;
-
 spSkin* spSkin_create (const char* name) {
 	spSkin* self = SUPER(NEW(_spSkin));
 	MALLOC_STR(self->name, name);

+ 2 - 10
spine-c/src/spine/Slot.c

@@ -66,8 +66,6 @@ float spSlot_getAttachmentTime (const spSlot* self) {
 }
 
 void spSlot_setToSetupPose (spSlot* self) {
-	spAttachment* attachment = 0;
-
 	self->r = self->data->r;
 	self->g = self->data->g;
 	self->b = self->data->b;
@@ -76,14 +74,8 @@ void spSlot_setToSetupPose (spSlot* self) {
 	if (!self->data->attachmentName)
 		spSlot_setAttachment(self, 0);
 	else {
-		/* Find slot index. */
-		int i;
-		for (i = 0; i < self->bone->skeleton->data->slotsCount; ++i) {
-			if (self->data == self->bone->skeleton->data->slots[i]) {
-				attachment = spSkeleton_getAttachmentForSlotIndex(self->bone->skeleton, i, self->data->attachmentName);
-				break;
-			}
-		}
+		spAttachment* attachment = spSkeleton_getAttachmentForSlotIndex(
+				self->bone->skeleton, self->data->index, self->data->attachmentName);
 		CONST_CAST(spAttachment*, self->attachment) = 0;
 		spSlot_setAttachment(self, attachment);
 	}

+ 2 - 1
spine-c/src/spine/SlotData.c

@@ -32,8 +32,9 @@
 #include <spine/SlotData.h>
 #include <spine/extension.h>
 
-spSlotData* spSlotData_create (const char* name, spBoneData* boneData) {
+spSlotData* spSlotData_create (const int index, const char* name, spBoneData* boneData) {
 	spSlotData* self = NEW(spSlotData);
+	CONST_CAST(int, self->index) = index;
 	MALLOC_STR(self->name, name);
 	CONST_CAST(spBoneData*, self->boneData) = boneData;
 	self->r = 1;

+ 55 - 49
spine-c/src/spine/TransformConstraint.c

@@ -34,73 +34,79 @@
 #include <spine/extension.h>
 
 spTransformConstraint* spTransformConstraint_create (spTransformConstraintData* data, const spSkeleton* skeleton) {
+	int i;
 	spTransformConstraint* self = NEW(spTransformConstraint);
 	CONST_CAST(spTransformConstraintData*, self->data) = data;
-	self->translateMix = data->translateMix;
 	self->rotateMix = data->rotateMix;
+	self->translateMix = data->translateMix;
 	self->scaleMix = data->scaleMix;
 	self->shearMix = data->shearMix;
-	self->offsetX = data->offsetX;
-	self->offsetY = data->offsetY;
-	self->bone = spSkeleton_findBone(skeleton, self->data->bone->name);
+	self->bonesCount = data->bonesCount;
+	CONST_CAST(spBone**, self->bones) = MALLOC(spBone*, self->bonesCount);
+	for (i = 0; i < self->bonesCount; ++i)
+		self->bones[i] = spSkeleton_findBone(skeleton, self->data->bones[i]->name);
 	self->target = spSkeleton_findBone(skeleton, self->data->target->name);
 	return self;
 }
 
 void spTransformConstraint_dispose (spTransformConstraint* self) {
+	FREE(self->bones);
 	FREE(self);
 }
 
 void spTransformConstraint_apply (spTransformConstraint* self) {
-	spBone* bone = self->bone;
+	float rotateMix = self->rotateMix, translateMix = self->translateMix, scaleMix = self->scaleMix, shearMix = self->shearMix;
 	spBone* target = self->target;
+	float ta = target->a, tb = target->b, tc = target->c, td = target->d;
+	int i;
+	for (i = 0; i < self->bonesCount; ++i) {
+		spBone* bone = self->bones[i];
 
-	if (self->rotateMix > 0) {
-		float cosine, sine;
-		float a = bone->a, b = bone->b, c = bone->c, d = bone->d;
-		float r = atan2(target->c, target->a) - atan2(c, a) + self->offsetRotation * DEG_RAD;
-		if (r > PI)
-			r -= PI2;
-		else if (r < -PI) r += PI2;
-		r *= self->rotateMix;
-		cosine = COS(r); sine = SIN(r);
-		CONST_CAST(float, bone->a) = cosine * a - sine * c;
-		CONST_CAST(float, bone->b) = cosine * b - sine * d;
-		CONST_CAST(float, bone->c) = sine * a + cosine * c;
-		CONST_CAST(float, bone->d) = sine * b + cosine * d;
-	}
+		if (rotateMix > 0) {
+			float a = bone->a, b = bone->b, c = bone->c, d = bone->d;
+			float r = ATAN2(tc, ta) - ATAN2(c, a) + self->data->offsetRotation * DEG_RAD;
+			float cosine, sine;
+			if (r > PI) r -= PI2;
+			else if (r < -PI) r += PI2;
+			r *= rotateMix;
+			cosine = COS(r);
+			sine = SIN(r);
+			CONST_CAST(float, bone->a) = cosine * a - sine * c;
+			CONST_CAST(float, bone->b) = cosine * b - sine * d;
+			CONST_CAST(float, bone->c) = sine * a + cosine * c;
+			CONST_CAST(float, bone->d) = sine * b + cosine * d;
+		}
 
-	if (self->scaleMix > 0) {
-		float bs = (float)SQRT(bone->a * bone->a + bone->c * bone->c);
-		float ts = (float)SQRT(target->a * target->a + target->c * target->c);
-		float s = bs > 0.00001f ? (bs + (ts - bs + self->offsetScaleX) * self->scaleMix) / bs : 0;
-		CONST_CAST(float, bone->a) *= s;
-		CONST_CAST(float, bone->c) *= s;
-		bs = (float)SQRT(bone->b * bone->b + bone->d * bone->d);
-		ts = (float)SQRT(target->b * target->b + target->d * target->d);
-		s = bs > 0.00001f ? (bs + (ts - bs + self->offsetScaleY) * self->scaleMix) / bs : 0;
-		CONST_CAST(float, bone->b) *= s;
-		CONST_CAST(float, bone->d) *= s;
-	}
+		if (translateMix > 0) {
+			float x, y;
+			spBone_localToWorld(target, self->data->offsetX, self->data->offsetY, &x, &y);
+			CONST_CAST(float, bone->worldX) += (x - bone->worldX) * translateMix;
+			CONST_CAST(float, bone->worldY) += (y - bone->worldY) * translateMix;
+		}
 
-	if (self->shearMix > 0) {
-		float b = bone->b, d = bone->d;
-		float by = atan2(d, b);
-		float r = atan2(target->d, target->b) - atan2(target->c, target->a) - (by - atan2(bone->c, bone->a));
-		float s;
-		if (r > PI)
-			r -= PI2;
-		else if (r < -PI) r += PI2;
-		r = by + (r + self->offsetShearY * DEG_RAD) * self->shearMix;
-		s = (float)SQRT(b * b + d * d);
-		CONST_CAST(float, bone->b) = COS(r) * s;
-		CONST_CAST(float, bone->d) = SIN(r) * s;
-	}
+		if (scaleMix > 0) {
+			float bs = SQRT(bone->a * bone->a + bone->c * bone->c);
+			float ts = SQRT(ta * ta + tc * tc);
+			float s = bs > 0.00001f ? (bs + (ts - bs + self->data->offsetScaleX) * scaleMix) / bs : 0;
+			CONST_CAST(float, bone->a) *= s;
+			CONST_CAST(float, bone->c) *= s;
+			bs = SQRT(bone->b * bone->b + bone->d * bone->d);
+			ts = SQRT(tb * tb + td * td);
+			s = bs > 0.00001f ? (bs + (ts - bs + self->data->offsetScaleY) * scaleMix) / bs : 0;
+			CONST_CAST(float, bone->b) *= s;
+			CONST_CAST(float, bone->d) *= s;
+		}
 
-	if (self->translateMix > 0) {
-		float tx, ty;
-		spBone_localToWorld(self->target, self->offsetX, self->offsetY, &tx, &ty);
-		CONST_CAST(float, self->bone->worldX) += (tx - self->bone->worldX) * self->translateMix;
-		CONST_CAST(float, self->bone->worldY) += (ty - self->bone->worldY) * self->translateMix;
+		if (shearMix > 0) {
+			float b = bone->b, d = bone->d;
+			float by = ATAN2(d, b);
+			float r = ATAN2(td, tb) - ATAN2(tc, ta) - (by - ATAN2(bone->c, bone->a));
+			float s = SQRT(b * b + d * d);
+			if (r > PI) r -= PI2;
+			else if (r < -PI) r += PI2;
+			r = by + (r + self->data->offsetShearY * DEG_RAD) * shearMix;
+			CONST_CAST(float, bone->b) = COS(r) * s;
+			CONST_CAST(float, bone->d) = SIN(r) * s;
+		}
 	}
 }

+ 1 - 0
spine-c/src/spine/TransformConstraintData.c

@@ -40,5 +40,6 @@ spTransformConstraintData* spTransformConstraintData_create (const char* name) {
 
 void spTransformConstraintData_dispose (spTransformConstraintData* self) {
 	FREE(self->name);
+	FREE(self->bones);
 	FREE(self);
 }

+ 113 - 0
spine-c/src/spine/VertexAttachment.c

@@ -0,0 +1,113 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ * 
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#include <spine/VertexAttachment.h>
+#include <spine/extension.h>
+
+void _spVertexAttachment_deinit (spVertexAttachment* attachment) {
+	_spAttachment_deinit(SUPER(attachment));
+	FREE(attachment->bones);
+	FREE(attachment->vertices);
+}
+
+void spVertexAttachment_computeWorldVertices (spVertexAttachment* self, spSlot* slot, float* worldVertices) {
+	spVertexAttachment_computeWorldVertices1(self, 0, self->worldVerticesLength, slot, worldVertices, 0);
+}
+
+void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int start, int count, spSlot* slot, float* worldVertices, int offset) {
+	spSkeleton* skeleton;
+	float x, y;
+	int deformLength;
+	float* deform;
+	float* vertices;
+	int* bones;
+
+	count += offset;
+	skeleton = slot->bone->skeleton;
+	x = skeleton->x;
+	y = skeleton->y;
+	deformLength = slot->attachmentVerticesCount;
+	deform = slot->attachmentVertices;
+	vertices = self->vertices;
+	bones = self->bones;
+	if (!bones) {
+		spBone* bone;
+		int v, w;
+		if (deformLength > 0) vertices = deform;
+		bone = slot->bone;
+		x += bone->worldX;
+		y += bone->worldY;
+		for (v = start, w = offset; w < count; v += 2, w += 2) {
+			float vx = vertices[v], vy = vertices[v + 1];
+			worldVertices[w] = vx * bone->a + vy * bone->b + x;
+			worldVertices[w + 1] = vx * bone->c + vy * bone->d + y;
+		}
+	} else {
+		int v = 0, skip = 0, i, w, b, n;
+		spBone** skeletonBones;
+		for (i = 0; i < start; i += 2) {
+			int n = bones[v];
+			v += n + 1;
+			skip += n;
+		}
+		skeletonBones = skeleton->bones;
+		if (deformLength == 0) {
+			for (w = offset, b = skip * 3; w < count; w += 2) {
+				float wx = x, wy = y;
+				n = bones[v++];
+				n += v;
+				for (; v < n; v++, b += 3) {
+					spBone* bone = skeletonBones[bones[v]];
+					float vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2];
+					wx += (vx * bone->a + vy * bone->b + bone->worldX) * weight;
+					wy += (vx * bone->c + vy * bone->d + bone->worldY) * weight;
+				}
+				worldVertices[w] = wx;
+				worldVertices[w + 1] = wy;
+			}
+		} else {
+			int w, b, f, n;
+			for (w = offset, b = skip * 3, f = skip << 1; w < count; w += 2) {
+				float wx = x, wy = y;
+				n = bones[v++];
+				n += v;
+				for (; v < n; v++, b += 3, f += 2) {
+					spBone* bone = skeletonBones[bones[v]];
+					float vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2];
+					wx += (vx * bone->a + vy * bone->b + bone->worldX) * weight;
+					wy += (vx * bone->c + vy * bone->d + bone->worldY) * weight;
+				}
+				worldVertices[w] = wx;
+				worldVertices[w + 1] = wy;
+			}
+		}
+	}
+}

+ 0 - 137
spine-c/src/spine/WeightedMeshAttachment.c

@@ -1,137 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.3
- * 
- * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
- * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) 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.
- *****************************************************************************/
-
-#include <spine/WeightedMeshAttachment.h>
-#include <spine/extension.h>
-
-void _spWeightedMeshAttachment_dispose (spAttachment* attachment) {
-	spWeightedMeshAttachment* self = SUB_CAST(spWeightedMeshAttachment, attachment);
-	_spAttachment_deinit(attachment);
-	FREE(self->path);
-	FREE(self->uvs);
-	if (!self->parentMesh) {
-		FREE(self->regionUVs);
-		FREE(self->bones);
-		FREE(self->weights);
-		FREE(self->triangles);
-		FREE(self->edges);
-	}
-	FREE(self);
-}
-
-spWeightedMeshAttachment* spWeightedMeshAttachment_create (const char* name) {
-	spWeightedMeshAttachment* self = NEW(spWeightedMeshAttachment);
-	self->r = 1;
-	self->g = 1;
-	self->b = 1;
-	self->a = 1;
-	_spAttachment_init(SUPER(self), name, SP_ATTACHMENT_WEIGHTED_MESH, _spWeightedMeshAttachment_dispose);
-	return self;
-}
-
-void spWeightedMeshAttachment_updateUVs (spWeightedMeshAttachment* self) {
-	int i;
-	float width = self->regionU2 - self->regionU, height = self->regionV2 - self->regionV;
-	FREE(self->uvs);
-	self->uvs = MALLOC(float, self->uvsCount);
-	if (self->regionRotate) {
-		for (i = 0; i < self->uvsCount; i += 2) {
-			self->uvs[i] = self->regionU + self->regionUVs[i + 1] * width;
-			self->uvs[i + 1] = self->regionV + height - self->regionUVs[i] * height;
-		}
-	} else {
-		for (i = 0; i < self->uvsCount; i += 2) {
-			self->uvs[i] = self->regionU + self->regionUVs[i] * width;
-			self->uvs[i + 1] = self->regionV + self->regionUVs[i + 1] * height;
-		}
-	}
-}
-
-void spWeightedMeshAttachment_computeWorldVertices (spWeightedMeshAttachment* self, spSlot* slot, float* worldVertices) {
-	int w = 0, v = 0, b = 0, f = 0;
-	float x = slot->bone->skeleton->x, y = slot->bone->skeleton->y;
-	spBone** skeletonBones = slot->bone->skeleton->bones;
-	if (slot->attachmentVerticesCount == 0) {
-		for (; v < self->bonesCount; w += 2) {
-			float wx = 0, wy = 0;
-			const int nn = self->bones[v] + v;
-			v++;
-			for (; v <= nn; v++, b += 3) {
-				const spBone* bone = skeletonBones[self->bones[v]];
-				const float vx = self->weights[b], vy = self->weights[b + 1], weight = self->weights[b + 2];
-				wx += (vx * bone->a + vy * bone->b + bone->worldX) * weight;
-				wy += (vx * bone->c + vy * bone->d + bone->worldY) * weight;
-			}
-			worldVertices[w] = wx + x;
-			worldVertices[w + 1] = wy + y;
-		}
-	} else {
-		const float* ffd = slot->attachmentVertices;
-		for (; v < self->bonesCount; w += 2) {
-			float wx = 0, wy = 0;
-			const int nn = self->bones[v] + v;
-			v++;
-			for (; v <= nn; v++, b += 3, f += 2) {
-				const spBone* bone = skeletonBones[self->bones[v]];
-				const float vx = self->weights[b] + ffd[f], vy = self->weights[b + 1] + ffd[f + 1], weight = self->weights[b + 2];
-				wx += (vx * bone->a + vy * bone->b + bone->worldX) * weight;
-				wy += (vx * bone->c + vy * bone->d + bone->worldY) * weight;
-			}
-			worldVertices[w] = wx + x;
-			worldVertices[w + 1] = wy + y;
-		}
-	}
-}
-
-void spWeightedMeshAttachment_setParentMesh (spWeightedMeshAttachment* self, spWeightedMeshAttachment* parentMesh) {
-	CONST_CAST(spWeightedMeshAttachment*, self->parentMesh) = parentMesh;
-	if (parentMesh) {
-		self->bones = parentMesh->bones;
-		self->bonesCount = parentMesh->bonesCount;
-
-		self->weights = parentMesh->weights;
-		self->weightsCount = parentMesh->weightsCount;
-
-		self->regionUVs = parentMesh->regionUVs;
-		self->uvsCount = parentMesh->uvsCount;
-
-		self->triangles = parentMesh->triangles;
-		self->trianglesCount = parentMesh->trianglesCount;
-
-		self->hullLength = parentMesh->hullLength;
-
-		self->edges = parentMesh->edges;
-		self->edgesCount = parentMesh->edgesCount;
-
-		self->width = parentMesh->width;
-		self->height = parentMesh->height;
-	}
-}

+ 1 - 1
spine-cocos2d-objc/README.md

@@ -10,7 +10,7 @@ The Spine Runtimes are developed with the intent to be used with data exported f
 
 ## Spine version
 
-spine-cocos2d-objc works with data exported from Spine version 3.2.01.
+spine-cocos2d-objc works with data exported from Spine version 3.3.07.
 
 spine-cocos2d-objc supports all Spine features.
 

+ 59 - 58
spine-cocos2d-objc/Resources/goblins-mesh.atlas

@@ -1,291 +1,292 @@
 
 goblins-mesh.png
+size: 512,512
 format: RGBA8888
 filter: Linear,Linear
 repeat: none
 dagger
-  rotate: true
-  xy: 372, 100
+  rotate: false
+  xy: 26, 147
   size: 26, 108
   orig: 26, 108
   offset: 0, 0
   index: -1
 goblin/eyes-closed
   rotate: false
-  xy: 2, 7
+  xy: 329, 334
   size: 34, 12
   orig: 34, 12
   offset: 0, 0
   index: -1
 goblin/head
   rotate: false
-  xy: 107, 36
+  xy: 26, 355
   size: 103, 66
   orig: 103, 66
   offset: 0, 0
   index: -1
 goblin/left-arm
   rotate: false
-  xy: 901, 56
+  xy: 54, 142
   size: 37, 35
   orig: 37, 35
   offset: 0, 0
   index: -1
 goblin/left-foot
-  rotate: false
-  xy: 929, 95
+  rotate: true
+  xy: 2, 69
   size: 65, 31
   orig: 65, 31
   offset: 0, 0
   index: -1
 goblin/left-hand
   rotate: false
-  xy: 452, 2
+  xy: 266, 332
   size: 36, 41
   orig: 36, 41
   offset: 0, 0
   index: -1
 goblin/left-lower-leg
   rotate: true
-  xy: 713, 93
+  xy: 273, 433
   size: 33, 70
   orig: 33, 70
   offset: 0, 0
   index: -1
 goblin/left-shoulder
   rotate: false
-  xy: 610, 44
+  xy: 305, 288
   size: 29, 44
   orig: 29, 44
   offset: 0, 0
   index: -1
 goblin/left-upper-leg
-  rotate: true
-  xy: 638, 93
+  rotate: false
+  xy: 96, 280
   size: 33, 73
   orig: 33, 73
   offset: 0, 0
   index: -1
 goblin/neck
   rotate: false
-  xy: 490, 2
+  xy: 267, 289
   size: 36, 41
   orig: 36, 41
   offset: 0, 0
   index: -1
 goblin/pelvis
   rotate: false
-  xy: 482, 45
+  xy: 131, 363
   size: 62, 43
   orig: 62, 43
   offset: 0, 0
   index: -1
 goblin/right-arm
-  rotate: true
-  xy: 690, 2
+  rotate: false
+  xy: 304, 334
   size: 23, 50
   orig: 23, 50
   offset: 0, 0
   index: -1
 goblin/right-foot
   rotate: false
-  xy: 771, 58
+  xy: 201, 397
   size: 63, 33
   orig: 63, 33
   offset: 0, 0
   index: -1
 goblin/right-hand
   rotate: false
-  xy: 940, 56
+  xy: 336, 295
   size: 36, 37
   orig: 36, 37
   offset: 0, 0
   index: -1
 goblin/right-lower-leg
   rotate: true
-  xy: 482, 90
+  xy: 273, 468
   size: 36, 76
   orig: 36, 76
   offset: 0, 0
   index: -1
 goblin/right-shoulder
-  rotate: true
-  xy: 602, 3
+  rotate: false
+  xy: 196, 285
   size: 39, 45
   orig: 39, 45
   offset: 0, 0
   index: -1
 goblin/right-upper-leg
   rotate: true
-  xy: 641, 57
+  xy: 131, 282
   size: 34, 63
   orig: 34, 63
   offset: 0, 0
   index: -1
 goblin/torso
-  rotate: true
-  xy: 212, 34
+  rotate: false
+  xy: 131, 408
   size: 68, 96
   orig: 68, 96
   offset: 0, 0
   index: -1
 goblin/undie-straps
-  rotate: false
-  xy: 380, 5
+  rotate: true
+  xy: 266, 375
   size: 55, 19
   orig: 55, 19
   offset: 0, 0
   index: -1
 goblin/undies
   rotate: false
-  xy: 174, 5
+  xy: 429, 440
   size: 36, 29
   orig: 36, 29
   offset: 0, 0
   index: -1
 goblingirl/eyes-closed
   rotate: false
-  xy: 269, 11
+  xy: 96, 257
   size: 37, 21
   orig: 37, 21
   offset: 0, 0
   index: -1
 goblingirl/head
   rotate: false
-  xy: 2, 21
+  xy: 26, 423
   size: 103, 81
   orig: 103, 81
   offset: 0, 0
   index: -1
 goblingirl/left-arm
-  rotate: true
-  xy: 978, 56
+  rotate: false
+  xy: 390, 434
   size: 37, 35
   orig: 37, 35
   offset: 0, 0
   index: -1
 goblingirl/left-foot
-  rotate: false
-  xy: 107, 3
+  rotate: true
+  xy: 2, 2
   size: 65, 31
   orig: 65, 31
   offset: 0, 0
   index: -1
 goblingirl/left-hand
   rotate: false
-  xy: 565, 2
+  xy: 329, 348
   size: 35, 40
   orig: 35, 40
   offset: 0, 0
   index: -1
 goblingirl/left-lower-leg
   rotate: true
-  xy: 785, 93
+  xy: 351, 471
   size: 33, 70
   orig: 33, 70
   offset: 0, 0
   index: -1
 goblingirl/left-shoulder
-  rotate: true
-  xy: 690, 27
+  rotate: false
+  xy: 237, 284
   size: 28, 46
   orig: 28, 46
   offset: 0, 0
   index: -1
 goblingirl/left-upper-leg
   rotate: true
-  xy: 857, 93
+  xy: 423, 471
   size: 33, 70
   orig: 33, 70
   offset: 0, 0
   index: -1
 goblingirl/neck
   rotate: false
-  xy: 528, 2
+  xy: 328, 390
   size: 35, 41
   orig: 35, 41
   offset: 0, 0
   index: -1
 goblingirl/pelvis
   rotate: false
-  xy: 546, 45
+  xy: 131, 318
   size: 62, 43
   orig: 62, 43
   offset: 0, 0
   index: -1
 goblingirl/right-arm
-  rotate: false
-  xy: 452, 48
+  rotate: true
+  xy: 135, 252
   size: 28, 50
   orig: 28, 50
   offset: 0, 0
   index: -1
 goblingirl/right-foot
-  rotate: false
-  xy: 836, 58
+  rotate: true
+  xy: 231, 332
   size: 63, 33
   orig: 63, 33
   offset: 0, 0
   index: -1
 goblingirl/right-hand
   rotate: true
-  xy: 771, 20
+  xy: 351, 433
   size: 36, 37
   orig: 36, 37
   offset: 0, 0
   index: -1
 goblingirl/right-lower-leg
-  rotate: true
-  xy: 560, 90
+  rotate: false
+  xy: 54, 179
   size: 36, 76
   orig: 36, 76
   offset: 0, 0
   index: -1
 goblingirl/right-shoulder
   rotate: false
-  xy: 649, 10
+  xy: 287, 386
   size: 39, 45
   orig: 39, 45
   offset: 0, 0
   index: -1
 goblingirl/right-upper-leg
-  rotate: true
-  xy: 706, 57
+  rotate: false
+  xy: 195, 332
   size: 34, 63
   orig: 34, 63
   offset: 0, 0
   index: -1
 goblingirl/torso
   rotate: false
-  xy: 310, 2
+  xy: 26, 257
   size: 68, 96
   orig: 68, 96
   offset: 0, 0
   index: -1
 goblingirl/undie-straps
-  rotate: false
-  xy: 212, 13
+  rotate: true
+  xy: 92, 200
   size: 55, 19
   orig: 55, 19
   offset: 0, 0
   index: -1
 goblingirl/undies
-  rotate: false
-  xy: 810, 27
+  rotate: true
+  xy: 365, 395
   size: 36, 29
   orig: 36, 29
   offset: 0, 0
   index: -1
 shield
   rotate: false
-  xy: 380, 26
+  xy: 201, 432
   size: 70, 72
   orig: 70, 72
   offset: 0, 0
   index: -1
 spear
-  rotate: true
-  xy: 2, 104
+  rotate: false
+  xy: 2, 136
   size: 22, 368
   orig: 22, 368
   offset: 0, 0

+ 115 - 114
spine-cocos2d-objc/Resources/goblins-mesh.json

@@ -1,26 +1,27 @@
 {
+"skeleton": { "hash": "P7CQ4ImK+tcAICATgSttlZ5HOSM", "spine": "3.3.07", "width": 266.93, "height": 349.6, "images": "./images/" },
 "bones": [
 	{ "name": "root" },
 	{ "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 },
-	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 },
+	{ "name": "torso", "parent": "hip", "length": 85.82, "rotation": 93.92, "x": -6.42, "y": 1.97 },
+	{ "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.51, "x": 81.67, "y": -6.34 },
+	{ "name": "head", "parent": "neck", "length": 68.28, "rotation": -13.92, "x": 20.93, "y": 11.59 },
+	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.04, "y": -20.38 },
+	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.16, "x": 37.85, "y": -2.34 },
+	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "rotation": -89.09, "x": 14.45, "y": 2.81 },
+	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "rotation": -16.65, "x": 56.34, "y": 0.98 },
+	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 },
+	{ "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.07 },
 	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 },
-	{ "name": "right upper leg", "parent": "hip", "length": 42.45, "x": -20.07, "y": -6.83, "rotation": -97.49 },
-	{ "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 93.92 },
-	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "x": 56.34, "y": 0.98, "rotation": -16.65 },
-	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "x": 74.04, "y": -20.38, "rotation": -156.96 },
-	{ "name": "neck", "parent": "torso", "length": 18.38, "x": 81.67, "y": -6.34, "rotation": -1.51 },
-	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 42.99, "y": -0.61, "rotation": -14.34 },
-	{ "name": "right shoulder", "parent": "torso", "length": 37.24, "x": 76.02, "y": 18.14, "rotation": 133.88 },
-	{ "name": "head", "parent": "neck", "length": 68.28, "x": 20.93, "y": 11.59, "rotation": -13.92 },
-	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 37.85, "y": -2.34, "rotation": 28.16 },
-	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 58.94, "y": -7.61, "rotation": 102.43 },
-	{ "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 37.6, "y": 0.31, "rotation": 36.32 },
-	{ "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 },
-	{ "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 },
-	{ "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 },
-	{ "name": "spear1", "parent": "left hand", "length": 65.06, "x": 0.48, "y": 17.03, "rotation": 102.43 },
-	{ "name": "spear2", "parent": "spear1", "length": 61.41, "x": 65.05, "y": 0.04, "rotation": 0.9 },
-	{ "name": "spear3", "parent": "spear2", "length": 76.79, "x": 61.88, "y": 0.57, "rotation": -0.9 }
+	{ "name": "right shoulder", "parent": "torso", "length": 37.24, "rotation": 133.88, "x": 76.02, "y": 18.14 },
+	{ "name": "right arm", "parent": "right shoulder", "length": 36.74, "rotation": 36.32, "x": 37.6, "y": 0.31 },
+	{ "name": "right upper leg", "parent": "hip", "length": 42.45, "rotation": -97.49, "x": -20.07, "y": -6.83 },
+	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "rotation": -14.34, "x": 42.99, "y": -0.61 },
+	{ "name": "right foot", "parent": "right lower leg", "length": 45.45, "rotation": 110.3, "x": 64.88, "y": 0.04 },
+	{ "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.35, "x": 36.9, "y": 0.34 },
+	{ "name": "spear1", "parent": "left hand", "length": 65.06, "rotation": 102.43, "x": 0.48, "y": 17.03 },
+	{ "name": "spear2", "parent": "spear1", "length": 61.41, "rotation": 0.9, "x": 65.05, "y": 0.04 },
+	{ "name": "spear3", "parent": "spear2", "length": 76.79, "rotation": -0.9, "x": 61.88, "y": 0.57 }
 ],
 "slots": [
 	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
@@ -52,12 +53,12 @@
 		"left hand item": {
 			"dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 },
 			"spear": {
-				"type": "skinnedmesh",
+				"type": "mesh",
 				"uvs": [ 1, 0.11236, 0.77096, 0.13278, 0.76608, 0.21781, 0.75642, 0.386, 0.74723, 0.54607, 0.72117, 1, 0.28838, 1, 0.24208, 0.54327, 0.22589, 0.38361, 0.2089, 0.21605, 0.20043, 0.13242, 0, 0.11519, 0.4527, 0, 0.58399, 0 ],
-				"triangles": [ 5, 6, 4, 6, 7, 4, 4, 7, 3, 2, 9, 1, 9, 10, 1, 10, 12, 1, 12, 13, 1, 1, 13, 0, 10, 11, 12, 3, 8, 2, 8, 9, 2, 7, 8, 3 ],
-				"vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.51, 20, -0.31, -6.16, 0.48, 2, 18, 64.73, -5.03, 0.5, 19, -0.4, -5.06, 0.49, 1, 16, 4.56, 23.91, 1, 1, 16, 41.7, -138.95, 1, 1, 16, 32.42, -141.1, 1, 1, 16, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.5, 19, 0.53, 6.59, 0.49, 2, 19, 62.18, 6.66, 0.51, 20, 0.2, 6.09, 0.48, 1, 20, 30.96, 6.61, 1, 1, 20, 37.26, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ],
-				"edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ],
+				"triangles": [ 4, 7, 3, 6, 7, 4, 5, 6, 4, 10, 11, 12, 1, 13, 0, 12, 13, 1, 10, 12, 1, 9, 10, 1, 2, 9, 1, 8, 9, 2, 3, 8, 2, 7, 8, 3 ],
+				"vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.5116, 20, -0.31, -6.16, 0.48839, 2, 18, 64.73, -5.03, 0.50272, 19, -0.4, -5.06, 0.49728, 1, 10, 4.56, 23.91, 1, 1, 10, 41.7, -138.95, 1, 1, 10, 32.41999, -141.1, 1, 1, 10, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.50272, 19, 0.52999, 6.59, 0.49728, 2, 19, 62.18, 6.66, 0.5116, 20, 0.2, 6.09, 0.48839, 1, 20, 30.96, 6.61, 1, 1, 20, 37.25999, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ],
 				"hull": 14,
+				"edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ],
 				"width": 22,
 				"height": 368
 			}
@@ -68,8 +69,8 @@
 				"uvs": [ 0.78091, 0.38453, 1, 0.38405, 1, 0.44881, 0.73953, 0.4687, 0.74641, 0.81344, 0.34022, 1, 0.15434, 1, 0.11303, 0.78858, 0.23007, 0.47367, 0, 0.45047, 0, 0.38621, 0.22367, 0.38573, 0.24384, 0, 1, 0 ],
 				"triangles": [ 0, 12, 13, 11, 12, 0, 0, 1, 2, 9, 10, 11, 3, 11, 0, 3, 0, 2, 8, 11, 3, 9, 11, 8, 5, 6, 7, 4, 5, 8, 4, 8, 3, 5, 7, 8 ],
 				"vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 26.93, 27.49 ],
-				"edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ],
 				"hull": 14,
+				"edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ],
 				"width": 26,
 				"height": 108
 			}
@@ -87,10 +88,10 @@
 				"name": "goblin/head",
 				"type": "mesh",
 				"uvs": [ 0, 0.60494, 0.14172, 0.5145, 0.24218, 0.55229, 0.32667, 0.67806, 0.37969, 0.79352, 0.53505, 0.93014, 0.86056, 1, 0.94071, 0.94169, 0.92098, 0.69923, 0.9888, 0.65497, 0.99003, 0.51643, 0.89632, 0.43561, 0.94487, 0.41916, 1, 0.39713, 1, 0.2836, 0.94017, 0.27027, 0.87906, 0.25666, 0.80754, 0.16044, 0.66698, 0.01997, 0.4734, 0.01805, 0.29215, 0.19893, 0.25392, 0.31823, 0.09117, 0.324, 0, 0.44331, 0.43271, 0.69153, 0.466, 0.47794, 0.35996, 0.31246, 0.73473, 0.68593, 0.72215, 0.57425, 0.88179, 0.5583, 0.80267, 0.51015 ],
-				"triangles": [ 26, 20, 19, 21, 20, 26, 15, 14, 13, 12, 15, 13, 11, 16, 15, 11, 15, 12, 26, 17, 25, 18, 26, 19, 17, 26, 18, 30, 25, 17, 30, 17, 16, 30, 16, 11, 1, 22, 21, 23, 22, 1, 2, 1, 21, 2, 21, 26, 29, 30, 11, 29, 11, 10, 28, 25, 30, 0, 23, 1, 9, 29, 10, 25, 3, 2, 25, 2, 26, 29, 27, 28, 29, 28, 30, 24, 3, 25, 24, 25, 28, 24, 28, 27, 8, 29, 9, 27, 29, 8, 4, 3, 24, 5, 24, 27, 4, 24, 5, 7, 6, 27, 7, 27, 8, 5, 27, 6 ],
-				"vertices": [ 14.56, 50.42, 23.12, 35.47, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 35.89, 40.17, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 17.2, -40.65, 20.68, -33.02 ],
-				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ],
+				"triangles": [ 5, 27, 6, 7, 27, 8, 7, 6, 27, 4, 24, 5, 5, 24, 27, 4, 3, 24, 27, 29, 8, 8, 29, 9, 24, 28, 27, 24, 25, 28, 24, 3, 25, 29, 28, 30, 29, 27, 28, 25, 2, 26, 25, 3, 2, 9, 29, 10, 0, 23, 1, 28, 25, 30, 29, 11, 10, 29, 30, 11, 2, 21, 26, 2, 1, 21, 23, 22, 1, 1, 22, 21, 30, 16, 11, 30, 17, 16, 30, 25, 17, 17, 26, 18, 18, 26, 19, 26, 17, 25, 11, 15, 12, 11, 16, 15, 12, 15, 13, 15, 14, 13, 21, 20, 26, 26, 20, 19 ],
+				"vertices": [ 14.56, 50.42, 23.12, 35.47, 17.45999, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.59999, 23.41, 35.89, 40.16999, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.79999, -24.31, 17.2, -40.65, 20.68, -33.02 ],
 				"hull": 24,
+				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ],
 				"width": 103,
 				"height": 66
 			}
@@ -100,10 +101,10 @@
 				"name": "goblin/left-arm",
 				"type": "mesh",
 				"uvs": [ 0.68992, 0.29284, 1, 0.46364, 1, 0.74643, 0.84089, 1, 0.66344, 1, 0.33765, 0.64284, 0, 0.44124, 0, 0, 0.34295, 0 ],
-				"triangles": [ 6, 7, 8, 5, 6, 8, 0, 5, 8, 0, 1, 2, 5, 0, 2, 4, 5, 2, 3, 4, 2 ],
-				"vertices": [ 18.6, 8.81, 32.19, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ],
-				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ],
+				"triangles": [ 3, 4, 2, 4, 5, 2, 5, 0, 2, 0, 1, 2, 0, 5, 8, 5, 6, 8, 6, 7, 8 ],
+				"vertices": [ 18.6, 8.81, 32.18999, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ],
 				"hull": 9,
+				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ],
 				"width": 37,
 				"height": 35
 			}
@@ -115,8 +116,8 @@
 				"uvs": [ 0.15733, 0.31873, 0.08195, 0.78502, 0.15884, 0.99366, 0.41633, 0.96804, 0.68822, 0.97636, 1, 0.96388, 0.99385, 0.73501, 0.85294, 0.51862, 0.61479, 0.31056, 0.46991, 0, 0.48032, 0.75604, 0.75994, 0.77706 ],
 				"triangles": [ 0, 9, 8, 10, 0, 8, 10, 8, 7, 11, 10, 7, 11, 7, 6, 1, 0, 10, 11, 6, 5, 3, 1, 10, 4, 10, 11, 4, 11, 5, 3, 10, 4, 2, 1, 3 ],
 				"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 37.91, -5.27, 58.12, -3.71, 57.31, 3.34, 47.78, 9.51, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 42.21, 1.16 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ],
 				"hull": 10,
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ],
 				"width": 65,
 				"height": 31
 			}
@@ -127,9 +128,9 @@
 				"type": "mesh",
 				"uvs": [ 0.518, 0.12578, 1, 0.16285, 0.99788, 0.50578, 0.69745, 1, 0.37445, 1, 0, 0.80051, 0, 0.42792, 0.17601, 0, 0.43567, 0 ],
 				"triangles": [ 2, 0, 1, 0, 5, 6, 6, 7, 0, 0, 7, 8, 3, 4, 0, 4, 5, 0, 2, 3, 0 ],
-				"vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.48, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ],
-				"edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ],
+				"vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.47999, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ],
 				"hull": 9,
+				"edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ],
 				"width": 36,
 				"height": 41
 			}
@@ -140,9 +141,9 @@
 				"type": "mesh",
 				"uvs": [ 0.95508, 0.20749, 0.81927, 0.65213, 0.94754, 0.77308, 0.67842, 0.97346, 0.46463, 1, 0.26845, 1, 0.04963, 0.90706, 0.2106, 0.60115, 0.07478, 0.40195, 0.18545, 0, 0.28857, 0 ],
 				"triangles": [ 10, 8, 9, 1, 7, 10, 7, 8, 10, 0, 1, 10, 1, 4, 7, 3, 1, 2, 5, 6, 7, 7, 4, 5, 1, 3, 4 ],
-				"vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.19, -18.29 ],
-				"edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ],
+				"vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.18999, -18.29 ],
 				"hull": 11,
+				"edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ],
 				"width": 33,
 				"height": 70
 			}
@@ -152,10 +153,10 @@
 				"name": "goblin/left-shoulder",
 				"type": "mesh",
 				"uvs": [ 0.7377, 0.40692, 1, 0.75237, 1, 1, 0.62046, 1, 0.26184, 0.56601, 0, 0.29783, 0, 0, 0.44115, 0 ],
-				"triangles": [ 5, 6, 7, 4, 5, 7, 4, 7, 0, 3, 4, 0, 3, 0, 1, 3, 1, 2 ],
-				"vertices": [ 15.18, 5.74, 32.17, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.74, -4.66, 6.54 ],
-				"edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ],
+				"triangles": [ 3, 1, 2, 3, 0, 1, 3, 4, 0, 4, 7, 0, 4, 5, 7, 5, 6, 7 ],
+				"vertices": [ 15.18, 5.74, 32.16999, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.73999, -4.66, 6.54 ],
 				"hull": 8,
+				"edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ],
 				"width": 29,
 				"height": 44
 			}
@@ -167,8 +168,8 @@
 				"uvs": [ 1, 0.12167, 1, 0.54873, 0.91067, 0.78907, 0.76567, 1, 0.3087, 0.9579, 0, 0.68777, 0, 0.219, 0.51961, 0, 0.87552, 0 ],
 				"triangles": [ 7, 8, 0, 5, 6, 7, 0, 1, 7, 4, 5, 7, 1, 4, 7, 2, 4, 1, 3, 4, 2 ],
 				"vertices": [ 2.33, 13.06, 33.5, 12.57, 51, 9.34, 66.32, 4.31, 63, -10.71, 43.13, -20.58, 8.91, -20.04, -6.79, -2.64, -6.61, 9.1 ],
-				"edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ],
 				"hull": 9,
+				"edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ],
 				"width": 33,
 				"height": 73
 			}
@@ -178,10 +179,10 @@
 				"name": "goblin/neck",
 				"type": "mesh",
 				"uvs": [ 0.81967, 0.27365, 0.92101, 0.82048, 0.47134, 1, 0.15679, 0.9354, 0, 0.7556, 0.19268, 0.51833, 0.15468, 0.35706, 0, 0.21989, 0.13568, 0, 0.68878, 0, 0.70145, 0.53872 ],
-				"triangles": [ 6, 8, 9, 6, 9, 0, 7, 8, 6, 10, 5, 6, 0, 10, 6, 10, 0, 1, 3, 4, 5, 2, 5, 10, 2, 10, 1, 3, 5, 2 ],
-				"vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.05, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ],
-				"edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ],
+				"triangles": [ 3, 5, 2, 2, 10, 1, 2, 5, 10, 3, 4, 5, 10, 0, 1, 0, 10, 6, 10, 5, 6, 7, 8, 6, 6, 9, 0, 6, 8, 9 ],
+				"vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.04999, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ],
 				"hull": 10,
+				"edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ],
 				"width": 36,
 				"height": 41
 			}
@@ -193,8 +194,8 @@
 				"uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ],
 				"triangles": [ 1, 2, 3, 1, 3, 0 ],
 				"vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 25.38, 22.26 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ],
 				"hull": 4,
+				"edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ],
 				"width": 62,
 				"height": 43
 			}
@@ -204,10 +205,10 @@
 				"name": "goblin/right-arm",
 				"type": "mesh",
 				"uvs": [ 1, 0.09223, 1, 0.8501, 0.72058, 1, 0.24384, 1, 0, 0.86558, 0.20822, 0.10919, 0.50903, 0, 0.85342, 0 ],
-				"triangles": [ 6, 7, 0, 2, 3, 5, 4, 5, 3, 1, 6, 0, 6, 2, 5, 1, 2, 6 ],
-				"vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.18 ],
-				"edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ],
+				"triangles": [ 1, 2, 6, 6, 2, 5, 1, 6, 0, 4, 5, 3, 2, 3, 5, 6, 7, 0 ],
+				"vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.17999 ],
 				"hull": 8,
+				"edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ],
 				"width": 23,
 				"height": 50
 			}
@@ -219,8 +220,8 @@
 				"uvs": [ 0.40851, 0.0047, 0.59087, 0.33404, 0.75959, 0.48311, 0.88907, 0.59751, 0.97532, 0.89391, 0.90385, 1, 0.6722, 1, 0.38633, 1, 0.08074, 1, 0, 0.88921, 0, 0.65984, 0, 0.46577, 0.0906, 0.0988, 0.305, 0, 0.47461, 0.71257, 0.715, 0.74681 ],
 				"triangles": [ 1, 10, 11, 1, 13, 0, 14, 1, 2, 1, 12, 13, 12, 1, 11, 14, 10, 1, 15, 14, 2, 15, 2, 3, 9, 10, 14, 15, 3, 4, 7, 8, 9, 14, 7, 9, 6, 14, 15, 5, 6, 15, 7, 14, 6, 4, 5, 15 ],
 				"vertices": [ 17.36, 25.99, 29.13, 15.44, 39.89, 10.8, 48.14, 7.24, 53.84, -2.38, 49.43, -6, 34.84, -6.39, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 37.31, 2.03 ],
-				"edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ],
 				"hull": 14,
+				"edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ],
 				"width": 63,
 				"height": 33
 			}
@@ -231,9 +232,9 @@
 				"type": "mesh",
 				"uvs": [ 0.17957, 0, 0, 0.44772, 0, 0.79734, 0.20057, 0.94264, 0.55057, 1, 0.8539, 1, 0.89823, 0.82004, 0.8259, 0.74285, 0.84223, 0.49993, 0.96356, 0.34102, 0.66023, 0 ],
 				"triangles": [ 8, 10, 9, 0, 10, 1, 8, 2, 1, 8, 1, 10, 7, 3, 8, 3, 2, 8, 4, 3, 7, 5, 7, 6, 4, 7, 5 ],
-				"vertices": [ -10.82, -9.45, 5.95, -15.34, 18.88, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ],
+				"vertices": [ -10.82, -9.45, 5.95, -15.34, 18.87999, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ],
 				"hull": 11,
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ],
 				"width": 36,
 				"height": 37
 			}
@@ -245,8 +246,8 @@
 				"uvs": [ 0.88538, 0.22262, 0.76167, 0.3594, 0.75088, 0.78308, 0.95326, 0.84981, 1, 0.60302 ],
 				"triangles": [ 1, 0, 4, 2, 1, 4, 3, 2, 4 ],
 				"vertices": [ -2.82, 15.97, 2.4, 11.71, 18.08, 11.9, 20.27, 19.27, 11.09, 20.62 ],
-				"edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ],
 				"hull": 5,
+				"edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ],
 				"width": 36,
 				"height": 37
 			}
@@ -257,9 +258,9 @@
 				"type": "mesh",
 				"uvs": [ 1, 0.27261, 0.81312, 0.52592, 0.79587, 0.71795, 0.95544, 0.80988, 0.85193, 0.95493, 0.47241, 1, 0.14033, 1, 0, 0.8773, 0.14896, 0.67914, 0.1619, 0.30325, 0.60611, 0 ],
 				"triangles": [ 1, 10, 0, 9, 10, 1, 8, 9, 1, 2, 8, 1, 4, 2, 3, 6, 7, 8, 5, 6, 8, 2, 5, 8, 4, 5, 2 ],
-				"vertices": [ 6.26, 8.46, 23.32, 8.04, 37.1, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.77, -1.03, 58.99, -9.19, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ],
+				"vertices": [ 6.26, 8.46, 23.32, 8.04, 37.09999, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.76999, -1.03, 58.99, -9.18999, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ],
 				"hull": 11,
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ],
 				"width": 36,
 				"height": 76
 			}
@@ -269,10 +270,10 @@
 				"name": "goblin/right-shoulder",
 				"type": "mesh",
 				"uvs": [ 0.62008, 0.03708, 0.92131, 0.09048, 1, 0.38319, 0.72049, 0.6937, 0.31656, 1, 0, 1, 0, 0.75106, 0.28233, 0.49988 ],
-				"triangles": [ 2, 3, 0, 2, 0, 1, 7, 0, 3, 4, 5, 6, 4, 7, 3, 4, 6, 7 ],
+				"triangles": [ 4, 6, 7, 4, 7, 3, 4, 5, 6, 7, 0, 3, 2, 0, 1, 2, 3, 0 ],
 				"vertices": [ -3.17, -11.05, -9, -0.57, -1.01, 10.33, 16.69, 11.17, 37.41, 8.2, 45.45, -1.16, 36.95, -8.46, 21.2, -7.47 ],
-				"edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ],
 				"hull": 8,
+				"edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ],
 				"width": 39,
 				"height": 45
 			}
@@ -283,9 +284,9 @@
 				"type": "mesh",
 				"uvs": [ 0.27018, 0, 0.11618, 0.18177, 0, 0.70688, 0, 0.89577, 0.26668, 1, 0.48718, 1, 0.67618, 0.83532, 1, 0.5161, 1, 0.25543, 0.74618, 0.0571 ],
 				"triangles": [ 9, 8, 7, 9, 1, 0, 6, 9, 7, 6, 1, 9, 2, 1, 6, 4, 3, 2, 6, 4, 2, 5, 4, 6 ],
-				"vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 19.13, 18.47, 2.85, 16.32, -8.4, 6.14 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ],
+				"vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.50999, 10.18, 19.12999, 18.46999, 2.85, 16.32, -8.39999, 6.14 ],
 				"hull": 10,
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ],
 				"width": 34,
 				"height": 63
 			}
@@ -295,10 +296,10 @@
 				"name": "goblin/torso",
 				"type": "mesh",
 				"uvs": [ 0, 0.33287, 0.15945, 0.46488, 0.15761, 0.60314, 0.15502, 0.79806, 0.32807, 0.93478, 0.6875, 1, 0.80731, 1, 1, 0.77763, 1, 0.66147, 1, 0.56703, 0.93207, 0.4771, 0.86944, 0.39416, 0.83837, 0.226, 0.68085, 0, 0.14836, 0, 0, 0.07199, 0.78734, 0.86249, 0.43679, 0.79649, 0.76738, 0.61733, 0.44345, 0.58747, 0.54329, 0.38316, 0.77692, 0.73446, 0.66478, 0.51012 ],
-				"triangles": [ 0, 15, 14, 20, 14, 13, 20, 13, 12, 1, 0, 14, 20, 12, 11, 20, 1, 14, 22, 20, 11, 22, 11, 10, 19, 1, 20, 19, 20, 22, 2, 1, 19, 18, 22, 10, 18, 10, 9, 19, 22, 18, 18, 9, 8, 21, 18, 8, 21, 8, 7, 17, 2, 19, 21, 17, 19, 21, 19, 18, 3, 2, 17, 16, 21, 7, 17, 21, 16, 4, 3, 17, 5, 17, 16, 4, 17, 5, 6, 16, 7, 5, 16, 6 ],
-				"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ],
-				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ],
+				"triangles": [ 5, 16, 6, 6, 16, 7, 4, 17, 5, 5, 17, 16, 4, 3, 17, 17, 21, 16, 16, 21, 7, 3, 2, 17, 21, 19, 18, 21, 17, 19, 17, 2, 19, 21, 8, 7, 21, 18, 8, 18, 9, 8, 19, 22, 18, 18, 10, 9, 18, 22, 10, 2, 1, 19, 19, 20, 22, 19, 1, 20, 22, 11, 10, 22, 20, 11, 20, 1, 14, 20, 12, 11, 1, 0, 14, 20, 13, 12, 20, 14, 13, 0, 15, 14 ],
+				"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.87999, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ],
 				"hull": 16,
+				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ],
 				"width": 68,
 				"height": 96
 			}
@@ -309,9 +310,9 @@
 				"type": "mesh",
 				"uvs": [ 0.36097, 0.44959, 0.66297, 0.60591, 1, 0.19486, 1, 0.57117, 0.75897, 1, 0.38697, 1, 0, 0.26433, 0, 0, 0.12497, 0 ],
 				"triangles": [ 6, 7, 8, 6, 8, 0, 3, 1, 2, 5, 0, 1, 6, 0, 5, 4, 1, 3, 5, 1, 4 ],
-				"vertices": [ -10.56, 12.87, 6.53, 9.9, 25.62, 17.71, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ],
-				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ],
+				"vertices": [ -10.56, 12.87, 6.53, 9.89999, 25.62, 17.70999, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ],
 				"hull": 9,
+				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ],
 				"width": 55,
 				"height": 19
 			}
@@ -322,9 +323,9 @@
 				"type": "mesh",
 				"uvs": [ 0, 0.32029, 0.14893, 0.59457, 0.22437, 1, 0.35909, 1, 0.50998, 1, 0.79559, 0.58453, 0.9842, 0.28015, 1, 0.00588, 0.46957, 0.17646, 0, 0.03933, 0.48843, 0.59122, 0.48114, 0.43099 ],
 				"triangles": [ 6, 8, 7, 0, 9, 8, 11, 8, 6, 0, 8, 11, 5, 11, 6, 10, 11, 5, 1, 0, 11, 1, 11, 10, 3, 2, 1, 10, 3, 1, 4, 10, 5, 3, 10, 4 ],
-				"vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.59, 22.22, 6.11, 22.92, 14.05, 3.75, 9.44, -13.08, 13.71, 4.21, -2.59, 4.03, 2.05 ],
-				"edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ],
+				"vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.58999, 22.22, 6.11, 22.92, 14.05, 3.75, 9.43999, -13.08, 13.71, 4.21, -2.58999, 4.03, 2.05 ],
 				"hull": 10,
+				"edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ],
 				"width": 36,
 				"height": 29
 			}
@@ -757,7 +758,7 @@
 				]
 			}
 		},
-		"ffd": {
+		"deform": {
 			"default": {
 				"left hand item": {
 					"spear": [
@@ -769,19 +770,19 @@
 						{
 							"time": 0,
 							"offset": 26,
-							"vertices": [ 2.34, 0.14 ],
+							"vertices": [ 2.34754, 0.14469 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{
 							"time": 0.5,
 							"offset": 8,
-							"vertices": [ -1.19, 4.31, 0.07, 6.41, 1.66, 6.18, 1.75, 3.59 ],
+							"vertices": [ -1.19415, 4.31531, 0.07279, 6.41351, 1.66048, 6.18882, 1.75232, 3.59555 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{
 							"time": 1,
 							"offset": 26,
-							"vertices": [ 2.34, 0.14 ]
+							"vertices": [ 2.34754, 0.14469 ]
 						}
 					]
 				}
@@ -795,22 +796,22 @@
 						},
 						{
 							"time": 0.2,
-							"vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08, -1.08, 0.08, -1.08, 0.08, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08 ],
+							"vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391, -1.08534, 0.08391, -1.08534, 0.08391, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{
 							"time": 0.3666,
-							"vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09, 1.47, 0.09, 1.47, 0.09, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09 ],
+							"vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017, 1.47305, 0.09017, 1.47305, 0.09017, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017 ],
 							"curve": [ 0.621, 0, 0.75, 1 ]
 						},
 						{
 							"time": 0.7,
-							"vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17, -1.17, -0.17, -1.17, -0.17, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17 ],
+							"vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183, -1.1755, -0.17182, -1.1755, -0.17183, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{
 							"time": 0.8666,
-							"vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08, 0.38, 0.08, 0.38, 0.08, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08 ],
+							"vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446, 0.38687, 0.08446, 0.38687, 0.08446, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{ "time": 1 }
@@ -821,35 +822,35 @@
 						{
 							"time": 0,
 							"offset": 8,
-							"vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ]
+							"vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ]
 						},
 						{ "time": 0.1333 },
 						{
 							"time": 0.2333,
 							"offset": 8,
-							"vertices": [ -3.96, -2.34, -5.8, -12.47, -2.23, -12.99, 2.02, -9.1, 0, 0, 0, 0, 0, 0, -1.35, -5.28 ]
+							"vertices": [ -3.96072, -2.34594, -5.80445, -12.47629, -2.23129, -12.99037, 2.02941, -9.1036, 0, 0, 0, 0, 0, 0, -1.35254, -5.2883 ]
 						},
 						{
 							"time": 0.3666,
 							"offset": 8,
-							"vertices": [ 0.66, 0.33, 0.33, 2.69, -0.48, 2.54, -1.13, 1.38, 0, 0, 0, 0, 0, 0, -0.11, 0.79 ]
+							"vertices": [ 0.66504, 0.33548, 0.33902, 2.69014, -0.4817, 2.54524, -1.13592, 1.38562, 0, 0, 0, 0, 0, 0, -0.11907, 0.79273 ]
 						},
 						{ "time": 0.5, "curve": "stepped" },
 						{ "time": 0.6333 },
 						{
 							"time": 0.7333,
 							"offset": 8,
-							"vertices": [ -2.97, 9.4, -6.91, 19.92, -10.55, 18.41, -12.37, 12.38, -4.72, 6.3, 0, 0, -1.48, 4.88, -7.06, 10.7 ]
+							"vertices": [ -2.97737, 9.40254, -6.91661, 19.92794, -10.55287, 18.41085, -12.37161, 12.38473, -4.72606, 6.30798, 0, 0, -1.48902, 4.88944, -7.06773, 10.70101 ]
 						},
 						{
 							"time": 0.8333,
 							"offset": 6,
-							"vertices": [ 1.05, 1.56, -2.52, 7.99, -5.52, 17.14, -8.93, 15.79, -10.73, 10.22, -4.23, 5.36, 0, 0, 0, 0, -5.83, 8.55 ]
+							"vertices": [ 1.05318, 1.56361, -2.52722, 7.9974, -5.5203, 17.14136, -8.93317, 15.79635, -10.73747, 10.22055, -4.23801, 5.36992, 0, 0, 0, 0, -5.83147, 8.55531 ]
 						},
 						{
 							"time": 1,
 							"offset": 8,
-							"vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ]
+							"vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ]
 						}
 					]
 				},
@@ -859,22 +860,22 @@
 						{
 							"time": 0.1333,
 							"offset": 6,
-							"vertices": [ -0.68, -4.13 ]
+							"vertices": [ -0.68989, -4.13283 ]
 						},
 						{
 							"time": 0.3333,
 							"offset": 6,
-							"vertices": [ -1.04, -3.1 ]
+							"vertices": [ -1.04945, -3.10476 ]
 						},
 						{
 							"time": 0.7,
 							"offset": 6,
-							"vertices": [ -1.42, -6.3 ]
+							"vertices": [ -1.4245, -6.30616 ]
 						},
 						{
 							"time": 0.8666,
 							"offset": 6,
-							"vertices": [ -1.13, -1.79 ]
+							"vertices": [ -1.13541, -1.79035 ]
 						},
 						{ "time": 1 }
 					]
@@ -885,38 +886,38 @@
 						{
 							"time": 0.1333,
 							"offset": 2,
-							"vertices": [ -2.81, 2.63, -2.35, 3.89, -1.99, 4.86, -0.93, 5.57, -0.48, 5.09, -0.34, 3.42, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31, 1.91, -1.32, 3.65 ]
+							"vertices": [ -2.81258, 2.63114, -2.35238, 3.89441, -1.99921, 4.8639, -0.93273, 5.57982, -0.48886, 5.09854, -0.34812, 3.42912, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31305, 1.91371, -1.32986, 3.65703 ]
 						},
 						{
 							"time": 0.2333,
 							"offset": 2,
-							"vertices": [ -6.39, 6.41, -7.74, 8.27, -7.02, 11.35, -4.03, 13.93, -2.5, 12.62, -1.46, 7.58, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84, 2.61, -4.53, 7.92 ]
+							"vertices": [ -6.39088, 6.41245, -7.74575, 8.27191, -7.02471, 11.35894, -4.0347, 13.93454, -2.50399, 12.62962, -1.46124, 7.58915, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84765, 2.61215, -4.53955, 7.92357 ]
 						},
 						{
 							"time": 0.3,
 							"offset": 2,
-							"vertices": [ -8.27, 6.68, -9.29, 10.13, -8.62, 14.71, -4.58, 18.81, -2.2, 17.1, -0.07, 9.9, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94, 2.38, -4.59, 10.01 ]
+							"vertices": [ -8.27184, 6.68821, -9.29764, 10.13797, -8.62231, 14.71339, -4.58629, 18.81939, -2.20304, 17.10709, -0.07794, 9.9046, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94624, 2.38007, -4.59398, 10.01888 ]
 						},
 						{
 							"time": 0.3666,
 							"offset": 2,
-							"vertices": [ -10.47, 9.44, -13.36, 12.4, -14.32, 16.94, -9.24, 23.55, -5.51, 21.51, -1.19, 11.53, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14, 2.29, -6.63, 11.37 ]
+							"vertices": [ -10.47683, 9.44175, -13.36882, 12.40982, -14.32568, 16.94392, -9.24462, 23.55674, -5.51711, 21.51377, -1.19581, 11.53192, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14847, 2.29389, -6.63418, 11.37127 ]
 						},
 						{
 							"time": 0.5,
 							"offset": 2,
-							"vertices": [ -5.42, 4.36, -10.59, 7.04, -11.64, 11.55, -6.19, 20.12, -1.45, 18.05, 4.86, 6.41, 2.81, 0.27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96, 4.94 ]
+							"vertices": [ -5.42473, 4.36854, -10.59004, 7.04468, -11.64251, 11.55845, -6.19665, 20.12805, -1.45497, 18.05411, 4.86619, 6.41678, 2.81462, 0.27601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96412, 4.94829 ]
 						},
 						{ "time": 0.6333 },
 						{
 							"time": 0.7333,
 							"offset": 4,
-							"vertices": [ 1.31, -6.84, -0.87, -12.54, -5.98, -14.08, -7.15, -11.63, -5.67, -4.83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06, -6.93 ]
+							"vertices": [ 1.31462, -6.84099, -0.87905, -12.54479, -5.9851, -14.08367, -7.15892, -11.63193, -5.6792, -4.83544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06163, -6.93844 ]
 						},
 						{
 							"time": 0.8,
 							"offset": 4,
-							"vertices": [ 0.65, -3.42, -0.43, -6.27, -2.99, -7.04, -3.57, -5.81, -2.83, -2.41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79, -1.28, 0, 0, 0, 0, -1.03, -3.46 ]
+							"vertices": [ 0.65731, -3.42049, -0.43952, -6.27239, -2.99255, -7.04183, -3.57946, -5.81596, -2.83959, -2.41772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79687, -1.2802, 0, 0, 0, 0, -1.03081, -3.46922 ]
 						},
 						{ "time": 0.8666 }
 					]
@@ -926,13 +927,13 @@
 						{
 							"time": 0,
 							"offset": 4,
-							"vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ]
+							"vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ]
 						},
 						{ "time": 0.5 },
 						{
 							"time": 1,
 							"offset": 4,
-							"vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ]
+							"vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ]
 						}
 					]
 				},
@@ -942,7 +943,7 @@
 						{
 							"time": 0.6,
 							"offset": 6,
-							"vertices": [ 1.8, -1.56 ]
+							"vertices": [ 1.80396, -1.56552 ]
 						},
 						{ "time": 1 }
 					]
@@ -951,17 +952,17 @@
 					"right upper leg": [
 						{
 							"time": 0,
-							"vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ]
+							"vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ]
 						},
 						{ "time": 0.3333 },
 						{
 							"time": 0.8666,
 							"offset": 14,
-							"vertices": [ 0.13, -2.35, -1.33, -5.99, -1.35, -4.43 ]
+							"vertices": [ 0.13424, -2.35377, -1.33317, -5.99572, -1.35861, -4.43323 ]
 						},
 						{
 							"time": 1,
-							"vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ]
+							"vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ]
 						}
 					]
 				},
@@ -970,37 +971,37 @@
 						{
 							"time": 0,
 							"offset": 14,
-							"vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ]
+							"vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ]
 						},
 						{
 							"time": 0.1333,
 							"offset": 14,
-							"vertices": [ 1.31, -0.59, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ]
+							"vertices": [ 1.31318, -0.59727, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ]
 						},
 						{
 							"time": 0.3,
 							"offset": 14,
-							"vertices": [ 6.03, -3.13, 7.55, -1.38, 6.79, 0.31, 4.23, 1.14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07, -5.16, 0, 0, 4, 0.27, 0, 0, 0, 0, 3.43, -3.52 ]
+							"vertices": [ 6.03761, -3.13561, 7.55475, -1.38111, 6.79747, 0.31171, 4.23503, 1.14012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07575, -5.16824, 0, 0, 4.0041, 0.27245, 0, 0, 0, 0, 3.4376, -3.52286 ]
 						},
 						{
 							"time": 0.5,
 							"offset": 14,
-							"vertices": [ 2.25, -0.87, 2.57, -0.56, 3.17, -0.57, 1.48, 0.99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22, -4.43, 0, 0, 1.48, 0.01, 0, 0, 0, 0, 0.31, -3.28, -1.53, 0.17 ]
+							"vertices": [ 2.25942, -0.87202, 2.575, -0.56861, 3.17112, -0.57003, 1.48704, 0.9924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22451, -4.43862, 0, 0, 1.48691, 0.01586, 0, 0, 0, 0, 0.31388, -3.28095, -1.53797, 0.17803 ]
 						},
 						{
 							"time": 0.6333,
 							"offset": 14,
-							"vertices": [ 0.75, -1.51, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ]
+							"vertices": [ 0.75002, -1.51701, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ]
 						},
 						{
 							"time": 0.8666,
 							"offset": 14,
-							"vertices": [ 0.62, -1.26, 0.38, -2.2, 3.25, -0.5, 2.41, 2.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.66, -3.1, 0, 0, 2.3, -1.15, 0, 0, 0, 0, -0.07, -3.63, -0.93, 0.1 ]
+							"vertices": [ 0.62202, -1.26262, 0.38489, -2.20701, 3.25048, -0.50042, 2.41108, 2.39315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.6639, -3.10099, 0, 0, 2.30655, -1.15196, 0, 0, 0, 0, -0.07676, -3.63497, -0.9321, 0.1079 ]
 						},
 						{
 							"time": 1,
 							"offset": 14,
-							"vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ]
+							"vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ]
 						}
 					]
 				},
@@ -1009,32 +1010,32 @@
 						{
 							"time": 0,
 							"offset": 2,
-							"vertices": [ -1.77, 0.54, -0.96, -1.03, -0.39, -0.24, -1.77, 0.54 ]
+							"vertices": [ -1.77696, 0.54759, -0.96145, -1.03793, -0.39148, -0.24071, -1.77696, 0.54759 ]
 						},
 						{
 							"time": 0.1333,
 							"offset": 2,
-							"vertices": [ -2.25, -1.03, -1.49, -4.23, -0.74, -2.84, -1.9, 0.54 ]
+							"vertices": [ -2.25683, -1.03177, -1.49719, -4.23861, -0.74469, -2.84906, -1.90072, 0.54477 ]
 						},
 						{
 							"time": 0.3333,
 							"offset": 2,
-							"vertices": [ -2.37, -0.05, -0.49, 0.19, -0.9, 1.16, -1.6, 2.7, 0.96, 0.8 ]
+							"vertices": [ -2.37974, -0.05431, -0.49433, 0.19436, -0.90861, 1.16519, -1.60956, 2.70798, 0.96186, 0.80615 ]
 						},
 						{
 							"time": 0.7,
 							"offset": 2,
-							"vertices": [ -0.91, -2.76, -0.62, -3.63, -0.84, -2.26, -2.56, 0.52 ]
+							"vertices": [ -0.91714, -2.76567, -0.62214, -3.63489, -0.8494, -2.26772, -2.56076, 0.5297 ]
 						},
 						{
 							"time": 0.8666,
 							"offset": 2,
-							"vertices": [ -2.56, 0.52, -1.58, 0.32, -1.38, 0.32, -2.56, 0.52 ]
+							"vertices": [ -2.56076, 0.5297, -1.58064, 0.32031, -1.3847, 0.32476, -2.56076, 0.5297 ]
 						},
 						{
 							"time": 1,
 							"offset": 2,
-							"vertices": [ -1.77, 0.54, -0.8, 0.53, -0.8, 0.53, -1.77, 0.54 ]
+							"vertices": [ -1.77696, 0.54759, -0.80128, 0.53413, -0.80128, 0.53413, -1.77696, 0.54759 ]
 						}
 					]
 				},
@@ -1042,35 +1043,35 @@
 					"undies": [
 						{
 							"time": 0,
-							"vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ]
+							"vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ]
 						},
 						{
 							"time": 0.1333,
-							"vertices": [ 0.72, 0.43, 7.2, -0.16, 1.37, 0, 1.37, 0, 1.37, 0, 1.25, 0.04, -0.99, -2.95, -1.37, -3.07, 1.37, 0, 0.35, -0.29, 2.99, -0.07, 3.9, -0.14 ]
+							"vertices": [ 0.72659, 0.43319, 7.20416, -0.1638, 1.37759, 0, 1.37759, 0, 1.37759, 0, 1.25279, 0.0464, -0.99861, -2.95085, -1.37542, -3.07404, 1.37759, 0, 0.35279, -0.29279, 2.99218, -0.07019, 3.90478, -0.14039 ]
 						},
 						{
 							"time": 0.3333,
-							"vertices": [ 1.16, 0, 2.1, -0.23, 0, 0, 0, 0, 0, 0, 2.24, -0.24, -0.43, 0.6, -1.55, 0.48 ]
+							"vertices": [ 1.16999, 0, 2.10599, -0.234, 0, 0, 0, 0, 0, 0, 2.24999, -0.24999, -0.4344, 0.60551, -1.55939, 0.48051 ]
 						},
 						{
 							"time": 0.5333,
-							"vertices": [ 1.16, 0, -0.23, -0.93, -2.92, 0.35, 0, 0, 0, 0, 0.49, -0.24, -0.64, -2.07, -0.64, -2.07 ]
+							"vertices": [ 1.16999, 0, -0.234, -0.93599, -2.92499, 0.35099, 0, 0, 0, 0, 0.49999, -0.24999, -0.64078, -2.07914, -0.64078, -2.07914 ]
 						},
 						{
 							"time": 0.7,
-							"vertices": [ 1.86, -0.11, 4.66, -0.09, -1.76, 0.21, 0, 0, -0.56, 0.32, -1.13, -1.15, -2.19, -3.47, -1.29, -3.47, 0, 0, 0, 0, 1.58, -0.04, 2.65, 0.16 ]
+							"vertices": [ 1.8627, -0.11514, 4.66326, -0.09099, -1.76428, 0.21171, 0, 0, -0.56832, 0.32832, -1.13833, -1.1511, -2.19996, -3.47068, -1.29718, -3.47068, 0, 0, 0, 0, 1.58785, -0.04642, 2.65941, 0.16714 ]
 						},
 						{
 							"time": 0.8333,
-							"vertices": [ 2.41, -0.2, 8.58, 0.58, -0.83, 0.1, 0, 0, -1.02, 0.59, -2.44, -1.87, -1.62, 0, 0, 0, 0, 0, 0, 0, 2.85, -0.08, 4.78, 0.3 ]
+							"vertices": [ 2.41687, -0.20725, 8.58108, 0.585, -0.83571, 0.10028, 0, 0, -1.02299, 0.59098, -2.44899, -1.872, -1.62499, 0, 0, 0, 0, 0, 0, 0, 2.85813, -0.08356, 4.78695, 0.30086 ]
 						},
 						{
 							"time": 0.8666,
-							"vertices": [ 2.01, -0.02, 8.98, 0.44, -0.2, 0.08, 0.45, 0, -0.35, 0.47, -1.84, -1.44, -0.79, 1.26, 0.53, 1.23, 0.45, 0, 0.11, -0.09, 3.28, -0.09, 5.13, 0.19 ]
+							"vertices": [ 2.01969, -0.0214, 8.98545, 0.4446, -0.20937, 0.08022, 0.45919, 0, -0.35919, 0.47279, -1.84159, -1.4488, -0.79153, 1.2642, 0.53285, 1.23981, 0.45919, 0, 0.11759, -0.09759, 3.2839, -0.09025, 5.13115, 0.19388 ]
 						},
 						{
 							"time": 1,
-							"vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ]
+							"vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ]
 						}
 					]
 				}

二進制
spine-cocos2d-objc/Resources/goblins-mesh.png


+ 251 - 0
spine-cocos2d-objc/Resources/raptor.atlas

@@ -0,0 +1,251 @@
+
+raptor.png
+size: 2048,2048
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+back_arm
+  rotate: false
+  xy: 830, 1093
+  size: 91, 57
+  orig: 91, 57
+  offset: 0, 0
+  index: -1
+back_bracer
+  rotate: true
+  xy: 217, 113
+  size: 77, 55
+  orig: 77, 55
+  offset: 0, 0
+  index: -1
+back_hand
+  rotate: true
+  xy: 275, 501
+  size: 72, 68
+  orig: 72, 68
+  offset: 0, 0
+  index: -1
+back_knee
+  rotate: false
+  xy: 583, 955
+  size: 97, 134
+  orig: 97, 134
+  offset: 0, 0
+  index: -1
+back_thigh
+  rotate: true
+  xy: 440, 689
+  size: 78, 47
+  orig: 78, 47
+  offset: 0, 0
+  index: -1
+eyes_open
+  rotate: true
+  xy: 495, 848
+  size: 93, 89
+  orig: 93, 89
+  offset: 0, 0
+  index: -1
+front_arm
+  rotate: false
+  xy: 2, 5
+  size: 96, 60
+  orig: 96, 60
+  offset: 0, 0
+  index: -1
+front_bracer
+  rotate: true
+  xy: 217, 192
+  size: 81, 58
+  orig: 81, 58
+  offset: 0, 0
+  index: -1
+front_hand
+  rotate: false
+  xy: 586, 878
+  size: 82, 75
+  orig: 82, 75
+  offset: 0, 0
+  index: -1
+front_open_hand
+  rotate: true
+  xy: 495, 760
+  size: 86, 87
+  orig: 86, 87
+  offset: 0, 0
+  index: -1
+front_thigh
+  rotate: false
+  xy: 714, 1092
+  size: 114, 58
+  orig: 114, 58
+  offset: 0, 0
+  index: -1
+gun
+  rotate: false
+  xy: 2, 67
+  size: 213, 206
+  orig: 213, 206
+  offset: 0, 0
+  index: -1
+gun_nohand
+  rotate: false
+  xy: 1563, 1547
+  size: 210, 203
+  orig: 210, 203
+  offset: 0, 0
+  index: -1
+head
+  rotate: false
+  xy: 2, 275
+  size: 271, 298
+  orig: 271, 298
+  offset: 0, 0
+  index: -1
+lower_leg
+  rotate: true
+  xy: 386, 943
+  size: 146, 195
+  orig: 146, 195
+  offset: 0, 0
+  index: -1
+mouth_smile
+  rotate: false
+  xy: 100, 6
+  size: 93, 59
+  orig: 93, 59
+  offset: 0, 0
+  index: -1
+neck
+  rotate: false
+  xy: 1012, 1109
+  size: 36, 41
+  orig: 36, 41
+  offset: 0, 0
+  index: -1
+raptor_arm_back
+  rotate: false
+  xy: 330, 769
+  size: 163, 172
+  orig: 163, 172
+  offset: 0, 0
+  index: -1
+raptor_body
+  rotate: false
+  xy: 2, 1468
+  size: 1219, 570
+  orig: 1219, 570
+  offset: 0, 0
+  index: -1
+raptor_front_arm
+  rotate: true
+  xy: 1223, 1445
+  size: 162, 203
+  orig: 162, 203
+  offset: 0, 0
+  index: -1
+raptor_front_leg
+  rotate: false
+  xy: 2, 952
+  size: 382, 514
+  orig: 382, 514
+  offset: 0, 0
+  index: -1
+raptor_hindleg_back
+  rotate: false
+  xy: 1223, 1609
+  size: 338, 429
+  orig: 338, 429
+  offset: 0, 0
+  index: -1
+raptor_horn
+  rotate: false
+  xy: 714, 1307
+  size: 363, 159
+  orig: 363, 159
+  offset: 0, 0
+  index: -1
+raptor_horn_back
+  rotate: false
+  xy: 714, 1152
+  size: 351, 153
+  orig: 351, 153
+  offset: 0, 0
+  index: -1
+raptor_jaw
+  rotate: false
+  xy: 1563, 1752
+  size: 305, 286
+  orig: 305, 286
+  offset: 0, 0
+  index: -1
+raptor_saddle_noshadow
+  rotate: false
+  xy: 2, 575
+  size: 326, 375
+  orig: 326, 375
+  offset: 0, 0
+  index: -1
+raptor_saddle_strap_front
+  rotate: true
+  xy: 1558, 1431
+  size: 114, 189
+  orig: 114, 189
+  offset: 0, 0
+  index: -1
+raptor_saddle_strap_rear
+  rotate: false
+  xy: 1079, 1318
+  size: 108, 148
+  orig: 108, 148
+  offset: 0, 0
+  index: -1
+raptor_saddle_w_shadow
+  rotate: false
+  xy: 386, 1091
+  size: 326, 375
+  orig: 326, 375
+  offset: 0, 0
+  index: -1
+raptor_tongue
+  rotate: true
+  xy: 1428, 1436
+  size: 171, 128
+  orig: 171, 128
+  offset: 0, 0
+  index: -1
+stirrup_back
+  rotate: false
+  xy: 923, 1081
+  size: 87, 69
+  orig: 87, 69
+  offset: 0, 0
+  index: -1
+stirrup_front
+  rotate: false
+  xy: 1775, 1650
+  size: 89, 100
+  orig: 89, 100
+  offset: 0, 0
+  index: -1
+stirrup_strap
+  rotate: true
+  xy: 1775, 1551
+  size: 97, 91
+  orig: 97, 91
+  offset: 0, 0
+  index: -1
+torso
+  rotate: false
+  xy: 330, 585
+  size: 108, 182
+  orig: 108, 182
+  offset: 0, 0
+  index: -1
+visor
+  rotate: true
+  xy: 1870, 1777
+  size: 261, 168
+  orig: 261, 168
+  offset: 0, 0
+  index: -1

File diff suppressed because it is too large
+ 361 - 0
spine-cocos2d-objc/Resources/raptor.json


二進制
spine-cocos2d-objc/Resources/raptor.png


+ 93 - 92
spine-cocos2d-objc/Resources/spineboy.atlas

@@ -1,194 +1,195 @@
 
 spineboy.png
+size: 1024,1024
 format: RGBA8888
 filter: Linear,Linear
 repeat: none
 eye_indifferent
-  rotate: true
-  xy: 389, 5
-  size: 56, 53
-  orig: 56, 53
+  rotate: false
+  xy: 550, 694
+  size: 93, 89
+  orig: 93, 89
   offset: 0, 0
   index: -1
 eye_surprised
   rotate: false
-  xy: 580, 34
-  size: 56, 53
-  orig: 56, 53
+  xy: 834, 856
+  size: 93, 89
+  orig: 93, 89
   offset: 0, 0
   index: -1
 front_bracer
   rotate: false
-  xy: 732, 85
-  size: 35, 48
-  orig: 35, 48
+  xy: 678, 774
+  size: 58, 80
+  orig: 58, 80
   offset: 0, 0
   index: -1
 front_fist_closed
-  rotate: false
-  xy: 556, 91
-  size: 45, 49
-  orig: 45, 49
+  rotate: true
+  xy: 466, 593
+  size: 75, 82
+  orig: 75, 82
   offset: 0, 0
   index: -1
 front_fist_open
   rotate: false
-  xy: 668, 32
-  size: 52, 52
-  orig: 52, 52
+  xy: 550, 605
+  size: 86, 87
+  orig: 86, 87
   offset: 0, 0
   index: -1
 front_foot
   rotate: false
-  xy: 924, 201
-  size: 76, 41
-  orig: 76, 41
+  xy: 550, 785
+  size: 126, 69
+  orig: 126, 69
   offset: 0, 0
   index: -1
 front_foot_bend1
-  rotate: false
-  xy: 845, 200
-  size: 77, 42
-  orig: 77, 42
+  rotate: true
+  xy: 375, 492
+  size: 128, 70
+  orig: 128, 70
   offset: 0, 0
   index: -1
 front_foot_bend2
-  rotate: false
-  xy: 778, 186
-  size: 65, 56
-  orig: 65, 56
+  rotate: true
+  xy: 275, 330
+  size: 108, 93
+  orig: 108, 93
   offset: 0, 0
   index: -1
 front_shin
-  rotate: true
-  xy: 444, 91
-  size: 49, 110
-  orig: 49, 110
+  rotate: false
+  xy: 466, 670
+  size: 82, 184
+  orig: 82, 184
   offset: 0, 0
   index: -1
 front_thigh
-  rotate: true
-  xy: 603, 89
-  size: 29, 67
-  orig: 29, 67
+  rotate: false
+  xy: 214, 208
+  size: 48, 112
+  orig: 48, 112
   offset: 0, 0
   index: -1
 front_upper_arm
-  rotate: true
-  xy: 672, 86
-  size: 32, 58
-  orig: 32, 58
+  rotate: false
+  xy: 214, 109
+  size: 54, 97
+  orig: 54, 97
   offset: 0, 0
   index: -1
 goggles
   rotate: false
-  xy: 444, 142
-  size: 157, 100
-  orig: 157, 100
+  xy: 466, 856
+  size: 261, 166
+  orig: 261, 166
   offset: 0, 0
   index: -1
 gun
   rotate: false
-  xy: 603, 120
-  size: 126, 122
-  orig: 126, 122
+  xy: 2, 117
+  size: 210, 203
+  orig: 210, 203
   offset: 0, 0
   index: -1
 head
   rotate: false
-  xy: 279, 63
-  size: 163, 179
-  orig: 163, 179
+  xy: 2, 322
+  size: 271, 298
+  orig: 271, 298
   offset: 0, 0
   index: -1
 mouth_grind
   rotate: false
-  xy: 845, 163
-  size: 56, 35
-  orig: 56, 35
+  xy: 929, 896
+  size: 93, 59
+  orig: 93, 59
   offset: 0, 0
   index: -1
 mouth_oooo
   rotate: false
-  xy: 842, 126
-  size: 56, 35
-  orig: 56, 35
+  xy: 929, 835
+  size: 93, 59
+  orig: 93, 59
   offset: 0, 0
   index: -1
 mouth_smile
   rotate: false
-  xy: 769, 97
-  size: 56, 35
-  orig: 56, 35
+  xy: 447, 532
+  size: 93, 59
+  orig: 93, 59
   offset: 0, 0
   index: -1
 muzzle
   rotate: false
-  xy: 2, 2
-  size: 275, 240
-  orig: 277, 240
+  xy: 2, 622
+  size: 462, 400
+  orig: 462, 400
   offset: 0, 0
   index: -1
 neck
   rotate: false
-  xy: 903, 173
-  size: 22, 25
-  orig: 22, 25
+  xy: 796, 819
+  size: 36, 41
+  orig: 36, 41
   offset: 0, 0
   index: -1
 rear_bracer
   rotate: false
-  xy: 722, 40
-  size: 34, 43
-  orig: 34, 43
+  xy: 738, 788
+  size: 56, 72
+  orig: 56, 72
   offset: 0, 0
   index: -1
 rear_foot
-  rotate: false
-  xy: 444, 11
-  size: 68, 36
-  orig: 68, 36
+  rotate: true
+  xy: 2, 2
+  size: 113, 60
+  orig: 113, 60
   offset: 0, 0
   index: -1
 rear_foot_bend1
   rotate: false
-  xy: 444, 49
-  size: 70, 40
-  orig: 70, 40
+  xy: 64, 49
+  size: 117, 66
+  orig: 117, 66
   offset: 0, 0
   index: -1
 rear_foot_bend2
   rotate: false
-  xy: 778, 134
-  size: 62, 50
-  orig: 62, 50
+  xy: 729, 862
+  size: 103, 83
+  orig: 103, 83
   offset: 0, 0
   index: -1
 rear_shin
-  rotate: false
-  xy: 731, 135
-  size: 45, 107
-  orig: 45, 107
+  rotate: true
+  xy: 729, 947
+  size: 75, 178
+  orig: 75, 178
   offset: 0, 0
   index: -1
 rear_thigh
   rotate: true
-  xy: 516, 50
-  size: 39, 62
-  orig: 39, 62
+  xy: 909, 957
+  size: 65, 104
+  orig: 65, 104
   offset: 0, 0
   index: -1
 rear_upper_arm
-  rotate: false
-  xy: 638, 35
-  size: 28, 52
-  orig: 28, 52
+  rotate: true
+  xy: 447, 483
+  size: 47, 87
+  orig: 47, 87
   offset: 0, 0
   index: -1
 torso
-  rotate: true
-  xy: 279, 2
-  size: 59, 108
-  orig: 59, 108
+  rotate: false
+  xy: 275, 440
+  size: 98, 180
+  orig: 98, 180
   offset: 0, 0
   index: -1

+ 31 - 31
spine-cocos2d-objc/Resources/spineboy.json

@@ -1,39 +1,31 @@
 {
+"skeleton": { "hash": "rPoYyBLFG6F0CGZ5wsUEBKDJU9U", "spine": "3.3.07", "width": 470.71, "height": 731.57, "images": "./images/" },
 "bones": [
 	{ "name": "hip", "y": 247.47 },
-	{ "name": "front_thigh", "parent": "hip", "length": 74.8, "x": -17.45, "y": -11.64, "rotation": -95.51, "color": "00ff04ff" },
-	{ "name": "rear_thigh", "parent": "hip", "length": 85.71, "x": 8.91, "y": -5.62, "rotation": -72.54, "color": "ff000dff" },
-	{ "name": "torso", "parent": "hip", "length": 127.55, "x": -1.61, "y": 4.9, "rotation": 103.82, "color": "e0da19ff" },
-	{
-		"name": "front_shin",
-		"parent": "front_thigh",
-		"length": 128.76,
-		"x": 78.69,
-		"y": 1.6,
-		"rotation": -2.21,
-		"inheritScale": false,
-		"color": "00ff04ff"
-	},
-	{ "name": "front_upper_arm", "parent": "torso", "length": 69.45, "x": 103.75, "y": 19.32, "rotation": 168.37, "color": "00ff04ff" },
-	{ "name": "neck", "parent": "torso", "length": 25.45, "x": 127.49, "y": -0.3, "rotation": -31.53, "color": "e0da19ff" },
-	{ "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "x": 86.1, "y": -1.32, "rotation": -19.83, "color": "ff000dff" },
-	{ "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "x": 92.35, "y": -19.22, "rotation": -169.55, "color": "ff000dff" },
+	{ "name": "torso", "parent": "hip", "length": 127.55, "rotation": 103.82, "x": -1.61, "y": 4.9, "color": "e0da19ff" },
+	{ "name": "front_upper_arm", "parent": "torso", "length": 69.45, "rotation": 168.37, "x": 103.75, "y": 19.32, "color": "00ff04ff" },
 	{
 		"name": "front_bracer",
 		"parent": "front_upper_arm",
 		"length": 40.57,
+		"rotation": 18.29,
 		"x": 68.8,
 		"y": -0.68,
-		"rotation": 18.29,
 		"color": "00ff04ff"
 	},
-	{ "name": "front_foot", "parent": "front_shin", "length": 91.34, "x": 128.75, "y": -0.33, "rotation": 77.9, "color": "00ff04ff" },
-	{ "name": "head", "parent": "neck", "length": 263.57, "x": 27.66, "y": -0.25, "rotation": 23.18, "color": "e0da19ff" },
-	{ "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "x": 51.35, "rotation": 23.15, "color": "ff000dff" },
-	{ "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "x": 121.45, "y": -0.75, "rotation": 69.3, "color": "ff000dff" },
-	{ "name": "front_fist", "parent": "front_bracer", "length": 65.38, "x": 40.56, "y": 0.19, "rotation": 12.43, "color": "00ff04ff" },
-	{ "name": "gun", "parent": "rear_bracer", "length": 43.1, "x": 34.42, "y": -0.45, "rotation": 5.34, "color": "ff000dff" },
-	{ "name": "gunTip", "parent": "gun", "x": 201.04, "y": 52.13, "rotation": 6.83, "color": "ff000dff" }
+	{ "name": "front_fist", "parent": "front_bracer", "length": 65.38, "rotation": 12.43, "x": 40.56, "y": 0.19, "color": "00ff04ff" },
+	{ "name": "front_thigh", "parent": "hip", "length": 74.8, "rotation": -95.51, "x": -17.45, "y": -11.64, "color": "00ff04ff" },
+	{ "name": "front_shin", "parent": "front_thigh", "length": 128.76, "rotation": -2.21, "x": 78.69, "y": 1.6, "color": "00ff04ff" },
+	{ "name": "front_foot", "parent": "front_shin", "length": 91.34, "rotation": 77.9, "x": 128.75, "y": -0.33, "color": "00ff04ff" },
+	{ "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "rotation": -169.55, "x": 92.35, "y": -19.22, "color": "ff000dff" },
+	{ "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "rotation": 23.15, "x": 51.35, "color": "ff000dff" },
+	{ "name": "gun", "parent": "rear_bracer", "length": 43.1, "rotation": 5.34, "x": 34.42, "y": -0.45, "color": "ff000dff" },
+	{ "name": "gunTip", "parent": "gun", "rotation": 6.83, "x": 201.04, "y": 52.13, "color": "ff000dff" },
+	{ "name": "neck", "parent": "torso", "length": 25.45, "rotation": -31.53, "x": 127.49, "y": -0.3, "color": "e0da19ff" },
+	{ "name": "head", "parent": "neck", "length": 263.57, "rotation": 23.18, "x": 27.66, "y": -0.25, "color": "e0da19ff" },
+	{ "name": "rear_thigh", "parent": "hip", "length": 85.71, "rotation": -72.54, "x": 8.91, "y": -5.62, "color": "ff000dff" },
+	{ "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "rotation": -19.83, "x": 86.1, "y": -1.32, "color": "ff000dff" },
+	{ "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "rotation": 69.3, "x": 121.45, "y": -0.75, "color": "ff000dff" }
 ],
 "slots": [
 	{ "name": "rear_upper_arm", "bone": "rear_upper_arm", "attachment": "rear_upper_arm" },
@@ -54,7 +46,8 @@
 	{ "name": "goggles", "bone": "head", "attachment": "goggles" },
 	{ "name": "front_bracer", "bone": "front_bracer", "attachment": "front_bracer" },
 	{ "name": "front_fist", "bone": "front_fist", "attachment": "front_fist_closed" },
-	{ "name": "muzzle", "bone": "gunTip", "additive": true }
+	{ "name": "muzzle", "bone": "gunTip", "blend": "additive" },
+	{ "name": "head-bb", "bone": "head" }
 ],
 "skins": {
 	"default": {
@@ -92,6 +85,13 @@
 		"head": {
 			"head": { "x": 128.95, "y": 0.29, "rotation": -70.63, "width": 271, "height": 298 }
 		},
+		"head-bb": {
+			"head": {
+				"type": "boundingbox",
+				"vertexCount": 6,
+				"vertices": [ -19.14, -70.3, 40.8, -118.07, 257.77, -115.61, 285.16, 57.18, 120.77, 164.95, -5.06, 76.94 ]
+			}
+		},
 		"mouth": {
 			"mouth_grind": { "x": 23.68, "y": -32.23, "rotation": -70.63, "width": 93, "height": 59 },
 			"mouth_oooo": { "x": 23.68, "y": -32.23, "rotation": -70.63, "width": 93, "height": 59 },
@@ -1825,10 +1825,6 @@
 				]
 			},
 			"muzzle": {
-				"attachment": [
-					{ "time": 0.1333, "name": "muzzle" },
-					{ "time": 0.2666, "name": null }
-				],
 				"color": [
 					{
 						"time": 0.1333,
@@ -1841,6 +1837,10 @@
 						"curve": [ 0.821, 0, 0.909, 0.89 ]
 					},
 					{ "time": 0.2666, "color": "ffffff00" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "muzzle" },
+					{ "time": 0.2666, "name": null }
 				]
 			}
 		},
@@ -2008,7 +2008,7 @@
 				]
 			}
 		},
-		"draworder": [
+		"drawOrder": [
 			{
 				"time": 0.6666,
 				"offsets": [

二進制
spine-cocos2d-objc/Resources/spineboy.png


+ 125 - 0
spine-cocos2d-objc/Resources/tank.atlas

@@ -0,0 +1,125 @@
+
+tank.png
+size: 2048,2048
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+images/antenna
+  rotate: true
+  xy: 1295, 1730
+  size: 22, 303
+  orig: 22, 303
+  offset: 0, 0
+  index: -1
+images/cannon
+  rotate: true
+  xy: 504, 769
+  size: 931, 58
+  orig: 931, 58
+  offset: 0, 0
+  index: -1
+images/cannonConnector
+  rotate: false
+  xy: 564, 1239
+  size: 112, 135
+  orig: 112, 135
+  offset: 0, 0
+  index: -1
+images/guntower
+  rotate: false
+  xy: 1295, 1754
+  size: 730, 289
+  orig: 730, 289
+  offset: 0, 0
+  index: -1
+images/machinegun
+  rotate: true
+  xy: 504, 436
+  size: 331, 57
+  orig: 331, 57
+  offset: 0, 0
+  index: -1
+images/machinegun-mount
+  rotate: false
+  xy: 2, 2
+  size: 72, 96
+  orig: 72, 96
+  offset: 0, 0
+  index: -1
+images/rock
+  rotate: false
+  xy: 226, 358
+  size: 252, 55
+  orig: 252, 55
+  offset: 0, 0
+  index: -1
+images/tankBottom
+  rotate: true
+  xy: 226, 415
+  size: 1285, 276
+  orig: 1285, 276
+  offset: 0, 0
+  index: -1
+images/tankBottom-shadow
+  rotate: false
+  xy: 2, 1702
+  size: 1291, 341
+  orig: 1291, 341
+  offset: 0, 0
+  index: -1
+images/tankTop
+  rotate: true
+  xy: 2, 293
+  size: 1407, 222
+  orig: 1407, 222
+  offset: 0, 0
+  index: -1
+images/tread
+  rotate: false
+  xy: 226, 326
+  size: 96, 30
+  orig: 96, 30
+  offset: 0, 0
+  index: -1
+images/tread-inside
+  rotate: false
+  xy: 195, 263
+  size: 25, 28
+  orig: 25, 28
+  offset: 0, 0
+  index: -1
+images/wheel-big
+  rotate: false
+  xy: 2, 100
+  size: 191, 191
+  orig: 191, 191
+  offset: 0, 0
+  index: -1
+images/wheel-big-overlay
+  rotate: false
+  xy: 564, 1514
+  size: 186, 186
+  orig: 186, 186
+  offset: 0, 0
+  index: -1
+images/wheel-mid
+  rotate: false
+  xy: 564, 1376
+  size: 136, 136
+  orig: 136, 136
+  offset: 0, 0
+  index: -1
+images/wheel-mid-overlay
+  rotate: false
+  xy: 752, 1564
+  size: 136, 136
+  orig: 136, 136
+  offset: 0, 0
+  index: -1
+images/wheel-small
+  rotate: false
+  xy: 890, 1629
+  size: 71, 71
+  orig: 71, 71
+  offset: 0, 0
+  index: -1

+ 1899 - 0
spine-cocos2d-objc/Resources/tank.json

@@ -0,0 +1,1899 @@
+{
+"skeleton": { "hash": "kgtyty1lpfv5JU2lygtFi2u3oQQ", "spine": "3.3.07", "width": 1914.53, "height": 964.05, "images": "" },
+"bones": [
+	{ "name": "root" },
+	{ "name": "tankRoot", "parent": "root", "y": 200 },
+	{ "name": "tankTreads", "parent": "tankRoot" },
+	{ "name": "tankBody", "parent": "tankTreads", "y": 10 },
+	{ "name": "guntower", "parent": "tankBody", "x": -21.72, "y": 245.47 },
+	{ "name": "antennaRoot", "parent": "guntower", "x": 164.6, "y": 202.52 },
+	{ "name": "antenna1", "parent": "antennaRoot", "length": 40, "rotation": 90, "y": 39.99, "color": "ffee00ff" },
+	{ "name": "antenna2", "parent": "antenna1", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna3", "parent": "antenna2", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna4", "parent": "antenna3", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna5", "parent": "antenna4", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna6", "parent": "antenna5", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "cannonConnector", "parent": "guntower", "x": -235.04, "y": 96.07 },
+	{ "name": "cannonTarget", "parent": "tankRoot", "x": -1486.66, "y": 351.82, "color": "ff3f00ff" },
+	{ "name": "cannon", "parent": "cannonConnector", "length": 946.68, "rotation": 180, "color": "ff4000ff" },
+	{ "name": "cannonTip", "parent": "cannon", "x": 946.68, "color": "ff4000ff" },
+	{ "name": "machineGunTarget", "parent": "tankRoot", "x": -1474, "y": 559.42, "color": "ff3f00ff" },
+	{
+		"name": "machinegun-mount",
+		"parent": "guntower",
+		"length": 90.97,
+		"rotation": 90,
+		"x": -123.72,
+		"y": 218.32,
+		"color": "15ff00ff"
+	},
+	{
+		"name": "machinegun",
+		"parent": "machinegun-mount",
+		"length": 208.94,
+		"rotation": 90,
+		"x": 91.52,
+		"y": -1.03,
+		"color": "15ff00ff"
+	},
+	{ "name": "machinegun-tip", "parent": "machinegun", "x": 210.42, "y": -12.2 },
+	{ "name": "rock", "parent": "root", "x": -656.45 },
+	{
+		"name": "tread",
+		"parent": "tankRoot",
+		"length": 82,
+		"rotation": 180,
+		"x": -22.89,
+		"y": 213.85,
+		"scaleX": 0.993,
+		"color": "e64344ff"
+	},
+	{ "name": "tread2", "parent": "tread", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread3", "parent": "tread2", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread4", "parent": "tread3", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread5", "parent": "tread4", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread6", "parent": "tread5", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread7", "parent": "tread6", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread8", "parent": "tread7", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread9", "parent": "tread8", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread10", "parent": "tread9", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread11", "parent": "tread10", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread12", "parent": "tread11", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread13", "parent": "tread12", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread14", "parent": "tread13", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread15", "parent": "tread14", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread16", "parent": "tread15", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread17", "parent": "tread16", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread18", "parent": "tread17", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread19", "parent": "tread18", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread20", "parent": "tread19", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread21", "parent": "tread20", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread22", "parent": "tread21", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread23", "parent": "tread22", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread24", "parent": "tread23", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread25", "parent": "tread24", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread26", "parent": "tread25", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread27", "parent": "tread26", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread28", "parent": "tread27", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread29", "parent": "tread28", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread30", "parent": "tread29", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread31", "parent": "tread30", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread32", "parent": "tread31", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread33", "parent": "tread32", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread34", "parent": "tread33", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread35", "parent": "tread34", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread36", "parent": "tread35", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "wheel-midCenter", "parent": "tankRoot", "y": -114.56 },
+	{ "name": "treadCollider1", "parent": "wheel-midCenter", "x": -329.57, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider2", "parent": "wheel-midCenter", "x": -165.95, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider3", "parent": "wheel-midCenter", "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider4", "parent": "wheel-midCenter", "x": 163.56, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider5", "parent": "wheel-midCenter", "x": 329.12, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadGravity1", "parent": "tankRoot", "rotation": 180, "x": -175.35, "y": 109.99, "color": "ff00fbff" },
+	{ "name": "treadGravity2", "parent": "tankRoot", "rotation": 180, "x": 177.88, "y": 105.45, "color": "ff00fbff" },
+	{ "name": "wheel-bigRoot1", "parent": "tankTreads", "x": -549.59, "y": 14.39, "color": "abe323ff" },
+	{ "name": "wheel-big1", "parent": "wheel-bigRoot1", "x": -0.02, "color": "abe323ff" },
+	{ "name": "wheel-bigRoot2", "parent": "tankTreads", "x": 547.33, "y": 14.39 },
+	{ "name": "wheel-big2", "parent": "wheel-bigRoot2" },
+	{ "name": "wheel-midRoot1", "parent": "wheel-midCenter", "x": -410.57, "color": "abe323ff" },
+	{ "name": "wheel-mid1", "parent": "wheel-midRoot1", "color": "abe323ff" },
+	{ "name": "wheel-midRoot2", "parent": "wheel-midCenter", "x": -246.95 },
+	{ "name": "wheel-mid2", "parent": "wheel-midRoot2" },
+	{ "name": "wheel-midRoot3", "parent": "wheel-midCenter", "x": -82.72 },
+	{ "name": "wheel-mid3", "parent": "wheel-midRoot3" },
+	{ "name": "wheel-midRoot4", "parent": "wheel-midCenter", "x": 80.89 },
+	{ "name": "wheel-mid4", "parent": "wheel-midRoot4" },
+	{ "name": "wheel-midRoot5", "parent": "wheel-midCenter", "x": 244.51 },
+	{ "name": "wheel-mid5", "parent": "wheel-midRoot5" },
+	{ "name": "wheel-midRoot6", "parent": "wheel-midCenter", "x": 408.73 },
+	{ "name": "wheel-mid6", "parent": "wheel-midRoot6" },
+	{ "name": "wheel-smallRoot1", "parent": "tankTreads", "x": -337.38, "y": 109.43 },
+	{ "name": "wheel-small1", "parent": "wheel-smallRoot1", "color": "abe323ff" },
+	{ "name": "wheel-smallRoot2", "parent": "tankTreads", "x": 0.08, "y": 109.43 },
+	{ "name": "wheel-small2", "parent": "wheel-smallRoot2" },
+	{ "name": "wheel-smallRoot3", "parent": "tankTreads", "x": 334.68, "y": 109.43 },
+	{ "name": "wheel-small3", "parent": "wheel-smallRoot3" }
+],
+"slots": [
+	{ "name": "tankBody-shadow", "bone": "tankBody", "color": "ffffffb9", "attachment": "images/tankBottom-shadow" },
+	{ "name": "bottom", "bone": "tankBody", "attachment": "images/tankBottom" },
+	{ "name": "tread-inside1", "bone": "tread", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside53", "bone": "tread27", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside27", "bone": "tread14", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside3", "bone": "tread2", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside55", "bone": "tread28", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside29", "bone": "tread15", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside5", "bone": "tread3", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside57", "bone": "tread29", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside31", "bone": "tread16", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside7", "bone": "tread4", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside59", "bone": "tread30", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside33", "bone": "tread17", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside9", "bone": "tread5", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside61", "bone": "tread31", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside35", "bone": "tread18", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside11", "bone": "tread6", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside63", "bone": "tread32", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside37", "bone": "tread19", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside13", "bone": "tread7", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside65", "bone": "tread33", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside39", "bone": "tread20", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside15", "bone": "tread8", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside67", "bone": "tread34", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside69", "bone": "tread35", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside71", "bone": "tread36", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside41", "bone": "tread21", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside17", "bone": "tread9", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside43", "bone": "tread22", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside19", "bone": "tread10", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside45", "bone": "tread23", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside21", "bone": "tread11", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside47", "bone": "tread24", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside23", "bone": "tread12", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside49", "bone": "tread25", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside25", "bone": "tread13", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside51", "bone": "tread26", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside2", "bone": "tread", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside54", "bone": "tread27", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside28", "bone": "tread14", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside4", "bone": "tread2", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside56", "bone": "tread28", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside30", "bone": "tread15", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside6", "bone": "tread3", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside58", "bone": "tread29", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside32", "bone": "tread16", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside8", "bone": "tread4", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside60", "bone": "tread30", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside34", "bone": "tread17", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside10", "bone": "tread5", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside62", "bone": "tread31", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside36", "bone": "tread18", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside12", "bone": "tread6", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside64", "bone": "tread32", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside38", "bone": "tread19", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside14", "bone": "tread7", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside66", "bone": "tread33", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside40", "bone": "tread20", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside16", "bone": "tread8", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside68", "bone": "tread34", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside70", "bone": "tread35", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside72", "bone": "tread36", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside42", "bone": "tread21", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside18", "bone": "tread9", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside44", "bone": "tread22", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside20", "bone": "tread10", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside46", "bone": "tread23", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside22", "bone": "tread11", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside48", "bone": "tread24", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside24", "bone": "tread12", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside50", "bone": "tread25", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside26", "bone": "tread13", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside52", "bone": "tread26", "attachment": "images/tread-inside" },
+	{ "name": "wheel-big", "bone": "wheel-big1", "color": "dbdbdbff", "attachment": "images/wheel-big" },
+	{ "name": "wheel-big2", "bone": "wheel-big2", "color": "dbdbdbff", "attachment": "images/wheel-big" },
+	{ "name": "wheel-mid", "bone": "wheel-mid1", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid2", "bone": "wheel-mid2", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid3", "bone": "wheel-mid3", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid4", "bone": "wheel-mid4", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid5", "bone": "wheel-mid5", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid6", "bone": "wheel-mid6", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-small", "bone": "wheel-small1", "attachment": "images/wheel-small" },
+	{ "name": "wheel-small2", "bone": "wheel-small2", "attachment": "images/wheel-small" },
+	{ "name": "wheel-small3", "bone": "wheel-small3", "attachment": "images/wheel-small" },
+	{
+		"name": "wheel-mid-overlay",
+		"bone": "wheel-midRoot1",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay2",
+		"bone": "wheel-midRoot2",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay3",
+		"bone": "wheel-midRoot3",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay4",
+		"bone": "wheel-midRoot4",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay5",
+		"bone": "wheel-midRoot5",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay6",
+		"bone": "wheel-midRoot6",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-big-overlay1",
+		"bone": "wheel-bigRoot1",
+		"color": "ffffffe9",
+		"attachment": "images/wheel-big-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-big-overlay2",
+		"bone": "wheel-bigRoot2",
+		"color": "ffffffe9",
+		"attachment": "images/wheel-big-overlay",
+		"blend": "multiply"
+	},
+	{ "name": "treads", "bone": "tankRoot", "attachment": "treads" },
+	{ "name": "tread", "bone": "tread", "color": "c0974fff", "attachment": "images/tread" },
+	{ "name": "tread27", "bone": "tread27", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread14", "bone": "tread14", "attachment": "images/tread" },
+	{ "name": "tread2", "bone": "tread2", "attachment": "images/tread" },
+	{ "name": "tread28", "bone": "tread28", "attachment": "images/tread" },
+	{ "name": "tread15", "bone": "tread15", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread3", "bone": "tread3", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread29", "bone": "tread29", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread16", "bone": "tread16", "attachment": "images/tread" },
+	{ "name": "tread4", "bone": "tread4", "attachment": "images/tread" },
+	{ "name": "tread30", "bone": "tread30", "attachment": "images/tread" },
+	{ "name": "tread17", "bone": "tread17", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread5", "bone": "tread5", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread31", "bone": "tread31", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread18", "bone": "tread18", "attachment": "images/tread" },
+	{ "name": "tread6", "bone": "tread6", "attachment": "images/tread" },
+	{ "name": "tread32", "bone": "tread32", "attachment": "images/tread" },
+	{ "name": "tread19", "bone": "tread19", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread7", "bone": "tread7", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread33", "bone": "tread33", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread20", "bone": "tread20", "attachment": "images/tread" },
+	{ "name": "tread8", "bone": "tread8", "attachment": "images/tread" },
+	{ "name": "tread34", "bone": "tread34", "attachment": "images/tread" },
+	{ "name": "tread35", "bone": "tread35", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread36", "bone": "tread36", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread21", "bone": "tread21", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread9", "bone": "tread9", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread22", "bone": "tread22", "attachment": "images/tread" },
+	{ "name": "tread10", "bone": "tread10", "attachment": "images/tread" },
+	{ "name": "tread23", "bone": "tread23", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread11", "bone": "tread11", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread24", "bone": "tread24", "attachment": "images/tread" },
+	{ "name": "tread12", "bone": "tread12", "attachment": "images/tread" },
+	{ "name": "tread25", "bone": "tread25", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread13", "bone": "tread13", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread26", "bone": "tread26", "attachment": "images/tread" },
+	{ "name": "rock", "bone": "rock", "attachment": "images/rock" },
+	{ "name": "machinegun", "bone": "machinegun", "attachment": "images/machinegun" },
+	{ "name": "machinegun-mount", "bone": "machinegun-mount", "attachment": "images/machinegun-mount" },
+	{ "name": "tankTop", "bone": "tankBody", "attachment": "images/tankTop" },
+	{ "name": "guntower", "bone": "guntower", "attachment": "images/guntower" },
+	{ "name": "cannon", "bone": "cannon", "attachment": "images/cannon" },
+	{ "name": "cannonConnector", "bone": "cannonConnector", "attachment": "images/cannonConnector" },
+	{ "name": "antenna", "bone": "antennaRoot", "attachment": "images/antenna" }
+],
+"ik": [
+	{
+		"name": "cannonTarget",
+		"bones": [ "cannon" ],
+		"target": "cannonTarget"
+	},
+	{
+		"name": "machineGunTarget",
+		"bones": [ "machinegun" ],
+		"target": "machineGunTarget",
+		"mix": 0
+	}
+],
+"transform": [
+	{
+		"name": "wheel-big",
+		"bones": [ "wheel-big2" ],
+		"target": "wheel-big1",
+		"rotation": 65.6,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid1",
+		"bones": [ "wheel-mid2", "wheel-mid4" ],
+		"target": "wheel-mid1",
+		"rotation": 93,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid2",
+		"bones": [ "wheel-mid3", "wheel-mid5" ],
+		"target": "wheel-mid1",
+		"rotation": -89,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid3",
+		"bones": [ "wheel-mid6" ],
+		"target": "wheel-mid1",
+		"rotation": -152.6,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-small1",
+		"bones": [ "wheel-small2" ],
+		"target": "wheel-small1",
+		"rotation": 87,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-small2",
+		"bones": [ "wheel-small3" ],
+		"target": "wheel-small1",
+		"rotation": 54.9,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	}
+],
+"path": [
+	{
+		"name": "treads",
+		"bones": [
+			"tread",
+			"tread2",
+			"tread3",
+			"tread4",
+			"tread5",
+			"tread6",
+			"tread7",
+			"tread8",
+			"tread9",
+			"tread10",
+			"tread11",
+			"tread12",
+			"tread13",
+			"tread14",
+			"tread15",
+			"tread16",
+			"tread17",
+			"tread18",
+			"tread19",
+			"tread20",
+			"tread21",
+			"tread22",
+			"tread23",
+			"tread24",
+			"tread25",
+			"tread26",
+			"tread27",
+			"tread28",
+			"tread29",
+			"tread30",
+			"tread31",
+			"tread32",
+			"tread33",
+			"tread34",
+			"tread35",
+			"tread36"
+		],
+		"target": "treads",
+		"rotateMode": "chain"
+	}
+],
+"skins": {
+	"default": {
+		"antenna": {
+			"images/antenna": {
+				"type": "mesh",
+				"uvs": [ 0.64286, 0.07875, 0.65354, 0.15349, 0.66324, 0.22137, 0.67367, 0.29433, 0.68383, 0.36543, 0.69359, 0.43374, 0.7031, 0.50029, 0.71311, 0.5703, 0.72327, 0.64138, 0.73406, 0.71688, 0.7444, 0.78929, 0.75614, 0.8714, 0.76905, 0.9431, 1, 0.9431, 1, 1, 0, 1, 0, 0.9431, 0.20105, 0.9431, 0.20105, 0.87093, 0.21461, 0.78846, 0.22651, 0.71606, 0.23885, 0.64098, 0.25035, 0.57104, 0.26206, 0.49983, 0.27306, 0.4329, 0.2843, 0.36453, 0.29592, 0.29381, 0.308, 0.22037, 0.319, 0.15345, 0.33141, 0.07795, 0.34423, 0, 0.6316, 0 ],
+				"triangles": [ 30, 31, 0, 29, 30, 0, 29, 0, 1, 28, 29, 1, 28, 1, 2, 27, 28, 2, 27, 2, 3, 26, 3, 4, 25, 26, 4, 25, 4, 5, 26, 27, 3, 24, 5, 6, 23, 24, 6, 7, 23, 6, 24, 25, 5, 22, 7, 8, 21, 22, 8, 21, 8, 9, 7, 22, 23, 20, 9, 10, 19, 20, 10, 20, 21, 9, 19, 10, 11, 18, 19, 11, 17, 18, 11, 17, 11, 12, 15, 16, 17, 12, 13, 14, 15, 17, 12, 14, 15, 12 ],
+				"vertices": [ 2, 10, 65.37999, -3.14, 0.3125, 11, 23.38, -3.14, 0.6875, 3, 9, 84.73, -3.37, 0.0625, 10, 42.73, -3.37, 0.625, 11, 0.73, -3.37, 0.3125, 3, 9, 64.16, -3.59, 0.3125, 10, 22.16, -3.59, 0.625, 11, -19.83, -3.59, 0.0625, 3, 8, 84.06, -3.82, 0.0625, 9, 42.06, -3.82, 0.625, 10, 0.06, -3.82, 0.3125, 3, 8, 62.51, -4.04, 0.3125, 9, 20.51, -4.04, 0.625, 10, -21.48, -4.04, 0.0625, 3, 7, 83.81, -4.25, 0.0625, 8, 41.81, -4.25, 0.625, 9, -0.18, -4.25, 0.3125, 3, 7, 63.65, -4.46, 0.3125, 8, 21.65, -4.46, 0.625, 9, -20.34, -4.46, 0.0625, 3, 6, 84.43, -4.67999, 0.0625, 7, 42.43, -4.67999, 0.625, 8, 0.43, -4.67999, 0.3125, 3, 6, 62.9, -4.91, 0.3125, 7, 20.9, -4.91, 0.625, 8, -21.09, -4.91, 0.0625, 3, 5, 5.14, 80.01999, 0.0625, 6, 40.02, -5.14, 0.625, 7, -1.97, -5.14, 0.3125, 3, 5, 5.37, 58.08, 0.375, 6, 18.08, -5.37, 0.5625, 7, -23.91, -5.37, 0.0625, 1, 5, 5.63, 33.2, 1, 1, 5, 5.91, 11.48, 1, 1, 5, 11, 11.48, 1, 1, 5, 10.99, -5.75, 1, 1, 5, -11, -5.75, 1, 1, 5, -10.99, 11.48, 1, 1, 5, -6.57, 11.48, 1, 1, 5, -6.57, 33.34, 1, 3, 5, -6.27, 58.33, 0.375, 6, 18.33, 6.27, 0.5625, 7, -23.66, 6.27, 0.0625, 3, 5, -6.01, 80.26999, 0.0625, 6, 40.27, 6.01, 0.625, 7, -1.72, 6.01, 0.3125, 3, 6, 63.02, 5.74, 0.3125, 7, 21.02, 5.74, 0.625, 8, -20.96999, 5.74, 0.0625, 3, 6, 84.21, 5.49, 0.0625, 7, 42.21, 5.49, 0.625, 8, 0.21, 5.49, 0.3125, 3, 7, 63.79, 5.23, 0.3125, 8, 21.79, 5.23, 0.625, 9, -20.2, 5.23, 0.0625, 3, 7, 84.07, 4.98999, 0.0625, 8, 42.07, 4.98999, 0.625, 9, 0.07, 4.98999, 0.3125, 3, 8, 62.78, 4.73999, 0.3125, 9, 20.78, 4.73999, 0.625, 10, -21.21, 4.73999, 0.0625, 3, 8, 84.21, 4.48, 0.0625, 9, 42.21, 4.48, 0.625, 10, 0.21, 4.48, 0.3125, 3, 9, 64.46, 4.21999, 0.3125, 10, 22.46, 4.21999, 0.625, 11, -19.53, 4.21999, 0.0625, 3, 9, 84.74, 3.98, 0.0625, 10, 42.74, 3.98, 0.625, 11, 0.74, 3.98, 0.3125, 2, 10, 65.62, 3.7, 0.3125, 11, 23.62, 3.7, 0.6875, 1, 11, 47.24, 3.42, 1, 1, 11, 47.24, -2.89, 1 ],
+				"hull": 32,
+				"edges": [ 28, 30, 28, 26, 30, 32, 26, 24, 24, 22, 32, 34, 34, 24, 34, 36, 36, 22, 60, 62, 38, 36, 20, 22, 38, 20, 40, 38, 18, 20, 40, 18, 42, 40, 16, 18, 42, 16, 44, 42, 14, 16, 44, 14, 46, 44, 12, 14, 46, 12, 48, 46, 10, 12, 48, 10, 50, 48, 8, 10, 50, 8, 52, 50, 6, 8, 52, 6, 54, 52, 4, 6, 54, 4, 56, 54, 2, 4, 56, 2, 60, 58, 58, 56, 62, 0, 0, 2, 58, 0 ],
+				"width": 22,
+				"height": 303
+			}
+		},
+		"bottom": {
+			"images/tankBottom": { "x": -16.66, "y": 9.89, "width": 1285, "height": 276 }
+		},
+		"cannon": {
+			"images/cannon": { "x": 481.95, "y": -0.02, "rotation": 179.99, "width": 931, "height": 58 }
+		},
+		"cannonConnector": {
+			"images/cannonConnector": {
+				"type": "mesh",
+				"uvs": [ 1, 0.03236, 1, 0.10602, 0.90987, 0.32859, 0.81975, 0.55116, 0.72962, 0.77372, 0.6395, 0.99629, 0.42157, 0.99629, 0.20364, 0.99629, 0, 0.85433, 0, 0.69901, 0.02267, 0.52884, 0, 0.31444, 0.21601, 0.12998, 0.43367, 0, 0.63546, 0.0037, 0.48407, 0.77059, 0.31496, 0.52496, 0.64132, 0.19648, 0.21516, 0.76765, 0.58345, 0.5647, 0.68444, 0.40146, 0.46758, 0.36649, 0.28934, 0.34603 ],
+				"triangles": [ 21, 22, 12, 11, 12, 22, 17, 21, 13, 17, 13, 14, 21, 12, 13, 21, 17, 20, 16, 22, 21, 10, 11, 22, 10, 22, 16, 19, 21, 20, 16, 21, 19, 18, 10, 16, 9, 10, 18, 15, 16, 19, 18, 16, 15, 8, 9, 18, 7, 8, 18, 6, 18, 15, 7, 18, 6, 14, 0, 1, 17, 14, 1, 2, 17, 1, 20, 17, 2, 3, 20, 2, 19, 20, 3, 4, 19, 3, 15, 19, 4, 5, 15, 4, 6, 15, 5 ],
+				"vertices": [ 1, 12, 35.91, 69.08, 1, 1, 12, 35.91, 59.13, 1, 1, 12, 25.81, 29.09, 1, 1, 12, 15.72, -0.95, 1, 1, 12, 5.63, -31, 1, 1, 12, -4.46, -61.04, 1, 2, 12, -28.87, -61.04, 0.33333, 14, 28.87, 61.03, 0.66666, 1, 14, 53.27, 61.01, 1, 1, 14, 76.08, 41.83, 1, 1, 14, 71.17, 21.62, 1, 1, 14, 72.83, -1.62, 1, 1, 14, 70.37, -29.12, 1, 1, 14, 50.66, -56.13, 1, 2, 12, -28.43, 74.37, 0.41, 14, 28.43, -74.39, 0.58999, 2, 12, -4.91, 72.94999, 0.52, 14, 4.91, -72.94999, 0.48, 2, 12, -21.87, -30.57, 0.49, 14, 21.87, 30.56, 0.51, 1, 14, 40.81, -2.59999, 1, 2, 12, -4.25, 46.92, 0.49, 14, 4.25, -46.92, 0.51, 1, 14, 51.98, 30.15, 1, 2, 12, -10.74, -2.78, 0.49, 14, 10.74, 2.77, 0.51, 2, 12, 0.56, 19.25, 0.49, 14, -0.56, -19.25, 0.51, 1, 14, 23.71, -23.98, 1, 1, 14, 43.68, -26.76, 1 ],
+				"hull": 15,
+				"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, 0 ],
+				"width": 112,
+				"height": 135
+			}
+		},
+		"guntower": {
+			"images/guntower": { "x": 77.22, "y": 122.58, "width": 730, "height": 289 }
+		},
+		"machinegun": {
+			"images/machinegun": { "x": 44.85, "y": -5.72, "rotation": -180, "width": 331, "height": 57 }
+		},
+		"machinegun-mount": {
+			"images/machinegun-mount": { "x": 47.42, "y": -1.53, "rotation": -90, "width": 72, "height": 96 }
+		},
+		"rock": {
+			"images/rock": { "color": "404040ff", "x": 25.23, "y": 27.35, "width": 252, "height": 55 }
+		},
+		"tankBody-shadow": {
+			"images/tankBottom-shadow": { "x": -11.43, "y": -42.88, "width": 1291, "height": 341 }
+		},
+		"tankTop": {
+			"images/tankTop": { "x": 6.8, "y": 168.71, "width": 1407, "height": 222 }
+		},
+		"tread": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread-inside1": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside10": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside11": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside12": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside13": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside14": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside15": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside16": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside17": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside18": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside19": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside2": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside20": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside21": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside22": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside23": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside24": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside25": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside26": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside27": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside28": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside29": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside3": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside30": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside31": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside32": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside33": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside34": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside35": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside36": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside37": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside38": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside39": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside4": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside40": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside41": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside42": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside43": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside44": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside45": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside46": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside47": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside48": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside49": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside5": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside50": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside51": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside52": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside53": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside54": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside55": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside56": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside57": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside58": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside59": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside6": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside60": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside61": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside62": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside63": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside64": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside65": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside66": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside67": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside68": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside69": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside7": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside70": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside71": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside72": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside8": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside9": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread10": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread11": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread12": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread13": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread14": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread15": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread16": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread17": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread18": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread19": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread2": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread20": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread21": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread22": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread23": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread24": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread25": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread26": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread27": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread28": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread29": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread3": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread30": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread31": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread32": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread33": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread34": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread35": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread36": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread4": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread5": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread6": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread7": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread8": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread9": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"treads": {
+			"treads": {
+				"type": "path",
+				"closed": true,
+				"lengths": [ 182.41, 349, 472.77, 602.99, 780.46, 1052.96, 1133.44, 1218.43, 1298.34, 1382.7, 1465.57, 1546.11, 1628.02, 1707.73, 1794.36, 1876.75, 2158.69, 2321.34, 2438.56, 2579.42, 2745.35, 2919.23 ],
+				"vertexCount": 66,
+				"vertices": [ 1, 83, 11.23, 41.86, 1, 1, 83, 0.78, 41.93999, 1, 1, 83, -34.72, 42.23, 1, 1, 63, -104.21, 0.41, 1, 1, 63, 0.07, 0.55, 1, 1, 63, 68.8, 0.64, 1, 1, 81, 20.5, 43.47, 1, 1, 81, 1.13, 40.81, 1, 1, 81, -27.38, 36.84, 1, 1, 65, 147.06, 105, 1, 1, 65, 96.21, 96.63, 1, 1, 65, 43.87, 87.71, 1, 1, 65, 16.18, 103.34, 1, 1, 65, -33.66999, 94.2, 1, 1, 65, -99.35, 81.25, 1, 1, 65, -122.04, -1.69, 1, 1, 65, -83.58, -47.92, 1, 1, 65, -33.53, -109.36, 1, 1, 69, -83.56, -66.08999, 1, 1, 69, -2.16, -67.89, 1, 2, 69, 56.68, -41.48, 0.67999, 58, -24.31, -41.49, 0.32, 1, 58, -26.58, 16.69, 1, 1, 58, -2.69, 16.69, 1, 1, 58, 13.51, 16.69, 1, 2, 71, -52.41, -46.51, 0.74399, 58, 30.2, -46.51, 0.256, 1, 71, -0.32, -68.92, 1, 2, 71, 52.09, -44.72, 0.712, 59, -28.9, -44.73, 0.28799, 1, 59, -22.8, 16.24, 1, 1, 59, -1.42, 16.24, 1, 1, 59, 20.46999, 16.24, 1, 2, 73, -47.21, -47.45, 0.744, 59, 36.00999, -47.46, 0.25599, 1, 73, -0.28, -69.65, 1, 2, 73, 45.23, -47.26, 0.736, 60, -37.48, -47.26, 0.26399, 1, 60, -23.76, 15.27, 1, 1, 60, -0.13, 15.27, 1, 1, 60, 24.45, 15.27, 1, 2, 75, -47.36, -48.7, 0.74399, 60, 33.52, -48.7, 0.256, 1, 75, -0.49, -70.39, 1, 2, 75, 49.09, -48.33, 0.744, 61, -33.57, -48.34, 0.25599, 1, 61, -20.89, 15.83, 1, 1, 61, -1.25, 15.83, 1, 1, 61, 15.78, 15.83, 1, 2, 77, -52.49, -48.21, 0.75999, 61, 28.45, -48.21, 0.24, 1, 77, -2.5, -68.92, 1, 2, 77, 55.72, -47.82, 0.752, 62, -28.88, -47.82, 0.248, 1, 62, -21.64, 16.69, 1, 1, 62, -0.48, 16.69, 1, 1, 62, 20.73, 16.69, 1, 2, 79, -53.65, -48.89, 0.76, 62, 25.96, -48.89, 0.23999, 1, 79, 2.27, -69.65, 1, 1, 79, 44.94, -69.74, 1, 1, 65, 1172.98, -85.6, 1, 1, 65, 1190.53, -42.24, 1, 1, 65, 1215.63, 19.75, 1, 1, 65, 1175.55, 76.62, 1, 1, 65, 1134.22, 95.07, 1, 1, 65, 1128.4, 97.66, 1, 1, 65, 1081.79, 87.47, 1, 1, 65, 1017.16, 92.52, 1, 1, 65, 977.9, 95.58, 1, 1, 85, 47.07, 42.29, 1, 1, 85, 0.24, 42.74, 1, 1, 85, -29.63, 43.28, 1, 1, 64, -86.64, 1.35, 1, 1, 64, 0.49, 0.25, 1, 1, 64, 92.42, -0.89, 1 ]
+			}
+		},
+		"wheel-big": {
+			"images/wheel-big": { "width": 191, "height": 191 }
+		},
+		"wheel-big-overlay1": {
+			"images/wheel-big-overlay": { "width": 186, "height": 186 }
+		},
+		"wheel-big-overlay2": {
+			"images/wheel-big-overlay": { "width": 186, "height": 186 }
+		},
+		"wheel-big2": {
+			"images/wheel-big": { "width": 191, "height": 191 }
+		},
+		"wheel-mid": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay2": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay3": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay4": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay5": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay6": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid2": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid3": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid4": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid5": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid6": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-small": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		},
+		"wheel-small2": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		},
+		"wheel-small3": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		}
+	}
+},
+"animations": {
+	"drive": {
+		"bones": {
+			"tankRoot": {
+				"translate": [
+					{
+						"time": 0,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.549, 0, 0.907, 0.84 ]
+					},
+					{
+						"time": 3.0333,
+						"x": -1426.14,
+						"y": 0,
+						"curve": [ 0.211, 0.23, 0.851, 0.92 ]
+					},
+					{
+						"time": 4.8666,
+						"x": -2806.98,
+						"y": 0,
+						"curve": [ 0.253, 0.27, 0.625, 0.94 ]
+					},
+					{ "time": 5.3333, "x": -2903.34, "y": 0 }
+				]
+			},
+			"wheel-midRoot1": {
+				"translate": [
+					{ "time": 0.7666, "x": 0, "y": 0 },
+					{
+						"time": 1.1666,
+						"x": 0,
+						"y": 50.95,
+						"curve": [ 0.633, 0, 0.907, 0.82 ]
+					},
+					{ "time": 1.5666, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider1": {
+				"rotate": [
+					{ "time": 1.1, "angle": 0 },
+					{ "time": 1.2333, "angle": -19.78 },
+					{ "time": 1.4666, "angle": 0 },
+					{ "time": 1.6, "angle": 28.87 },
+					{ "time": 1.8, "angle": 0 }
+				],
+				"translate": [
+					{ "time": 1.1, "x": 0, "y": 0 },
+					{
+						"time": 1.4666,
+						"x": 0,
+						"y": 58.66,
+						"curve": [ 0.352, 0, 0.828, 0.92 ]
+					},
+					{ "time": 1.8, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot2": {
+				"translate": [
+					{ "time": 1.2666, "x": 0, "y": 0 },
+					{
+						"time": 1.6333,
+						"x": 0,
+						"y": 55.07,
+						"curve": [ 0.889, 0.01, 0.843, 0.81 ]
+					},
+					{ "time": 1.9333, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider2": {
+				"rotate": [
+					{ "time": 1.5333, "angle": 0 },
+					{ "time": 1.6333, "angle": -18.67 },
+					{ "time": 1.8, "angle": 0 },
+					{ "time": 1.9, "angle": 29.49 },
+					{ "time": 2.0666, "angle": 0 }
+				],
+				"translate": [
+					{
+						"time": 1.5333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.16, 0.25, 0.813, 0.82 ]
+					},
+					{
+						"time": 1.8,
+						"x": 0,
+						"y": 59.03,
+						"curve": [ 0.376, 0.26, 0.879, 0.79 ]
+					},
+					{ "time": 2.0666, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot3": {
+				"translate": [
+					{ "time": 1.6666, "x": 0, "y": 0 },
+					{
+						"time": 1.9333,
+						"x": 0,
+						"y": 60.17,
+						"curve": [ 0.544, 0, 0.838, 0.77 ]
+					},
+					{ "time": 2.2, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider3": {
+				"rotate": [
+					{ "time": 1.8666, "angle": 0 },
+					{ "time": 1.9333, "angle": -20.16 },
+					{ "time": 2.0666, "angle": 0.57 },
+					{ "time": 2.1666, "angle": 33.66 },
+					{ "time": 2.3333, "angle": 0 }
+				],
+				"translate": [
+					{ "time": 1.8666, "x": 0, "y": 0 },
+					{
+						"time": 2.0666,
+						"x": 0,
+						"y": 61.53,
+						"curve": [ 0.582, 0, 0.836, 0.77 ]
+					},
+					{ "time": 2.3333, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot4": {
+				"translate": [
+					{ "time": 1.9333, "x": 0, "y": 0 },
+					{
+						"time": 2.2,
+						"x": 0,
+						"y": 58.89,
+						"curve": [ 0.48, 0, 0.75, 1 ]
+					},
+					{ "time": 2.4666, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider4": {
+				"rotate": [
+					{ "time": 2.1333, "angle": 0 },
+					{ "time": 2.2, "angle": -20.43 },
+					{ "time": 2.3333, "angle": 4.49 },
+					{ "time": 2.4333, "angle": 35.87 },
+					{ "time": 2.5666, "angle": 0 }
+				],
+				"translate": [
+					{
+						"time": 2.1333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.191, 0.49, 0.75, 1 ]
+					},
+					{ "time": 2.3333, "x": 0, "y": 66.64 },
+					{ "time": 2.5666, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot5": {
+				"translate": [
+					{ "time": 2.2, "x": 0, "y": 0 },
+					{ "time": 2.4333, "x": 0, "y": 60.26 },
+					{ "time": 2.7, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider5": {
+				"rotate": [
+					{ "time": 2.3333, "angle": 0 },
+					{ "time": 2.4333, "angle": -23.6 },
+					{ "time": 2.5666, "angle": 6.49 },
+					{ "time": 2.6666, "angle": 29.93 },
+					{ "time": 2.8, "angle": -0.13 }
+				],
+				"translate": [
+					{ "time": 2.3333, "x": 0, "y": 0 },
+					{ "time": 2.4333, "x": 0, "y": 36.34 },
+					{ "time": 2.5, "x": 0, "y": 56.39 },
+					{ "time": 2.5666, "x": 0, "y": 61.34 },
+					{ "time": 2.8, "x": 0, "y": 2.04 }
+				]
+			},
+			"wheel-midRoot6": {
+				"translate": [
+					{
+						"time": 2.4333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.19, 0.26, 0.804, 0.8 ]
+					},
+					{
+						"time": 2.6333,
+						"x": 0,
+						"y": 51.86,
+						"curve": [ 0.346, 0, 0.852, 0.7 ]
+					},
+					{ "time": 2.8, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-mid1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 21,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 0.8, "angle": 120 },
+					{ "time": 1.2333, "angle": 240 },
+					{ "time": 1.6, "angle": 0 },
+					{ "time": 1.9, "angle": 120 },
+					{ "time": 2.1666, "angle": 240 },
+					{ "time": 2.4, "angle": 0 },
+					{ "time": 2.5666, "angle": 120 },
+					{ "time": 2.7333, "angle": 240 },
+					{ "time": 2.9333, "angle": 0 },
+					{ "time": 3.1, "angle": 120 },
+					{ "time": 3.2666, "angle": 240 },
+					{ "time": 3.4333, "angle": 0 },
+					{ "time": 3.6333, "angle": 120 },
+					{ "time": 3.8, "angle": 240 },
+					{ "time": 3.9666, "angle": 0 },
+					{ "time": 4.1666, "angle": 120 },
+					{ "time": 4.3333, "angle": 240 },
+					{ "time": 4.5, "angle": 0 },
+					{ "time": 4.7, "angle": 120 },
+					{ "time": 4.8666, "angle": 240 },
+					{ "time": 5.2666, "angle": -67.99 }
+				]
+			},
+			"tankTreads": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.145, 0.34, 0.75, 1 ]
+					},
+					{ "time": 1.1, "angle": -3.9 },
+					{ "time": 1.3333, "angle": -2.37 },
+					{ "time": 1.6333, "angle": -3.54 },
+					{ "time": 2.1666, "angle": 0.27 },
+					{
+						"time": 2.4666,
+						"angle": 2.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.7,
+						"angle": 3.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 3, "angle": -3.62 },
+					{ "time": 3.2333, "angle": -1.23, "curve": "stepped" },
+					{
+						"time": 4.8666,
+						"angle": -1.23,
+						"curve": [ 0.188, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 5.2,
+						"angle": 4.47,
+						"curve": [ 0.416, 0.01, 0.75, 1 ]
+					},
+					{
+						"time": 5.5666,
+						"angle": -3.08,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 5.8333, "angle": -1.23 }
+				]
+			},
+			"wheel-big1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 1.1, "angle": 120 },
+					{ "time": 1.5333, "angle": 240 },
+					{ "time": 1.8, "angle": 360 },
+					{ "time": 2.0333, "angle": 120 },
+					{ "time": 2.2666, "angle": 240 },
+					{ "time": 2.4666, "angle": 360 },
+					{ "time": 2.7, "angle": 120 },
+					{ "time": 2.9333, "angle": 240 },
+					{ "time": 3.1333, "angle": 360 },
+					{ "time": 3.3666, "angle": 120 },
+					{ "time": 3.5666, "angle": 240 },
+					{ "time": 3.8, "angle": -24 },
+					{ "time": 4.0333, "angle": 120 },
+					{ "time": 4.2333, "angle": 240 },
+					{ "time": 4.4666, "angle": -24 },
+					{ "time": 4.7, "angle": 120 },
+					{ "time": 4.8666, "angle": -143.99 },
+					{
+						"time": 5.0666,
+						"angle": -131.4,
+						"curve": [ 0.14, 0.25, 0.75, 1 ]
+					},
+					{ "time": 5.6666, "angle": -76.85 },
+					{ "time": 5.8333, "angle": -72.3 }
+				]
+			},
+			"treadGravity1": {
+				"translate": [
+					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
+					{ "time": 1.4666, "x": 0, "y": 0 },
+					{ "time": 1.8, "x": 0, "y": 29.44 },
+					{ "time": 2.3333, "x": 0, "y": -0.52 },
+					{ "time": 2.5666, "x": 0, "y": 5.2 },
+					{ "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" },
+					{ "time": 4.8666, "x": 0, "y": -11.05 },
+					{ "time": 5.0666, "x": 0, "y": -1.91 },
+					{ "time": 5.5333, "x": 0, "y": -6.9 },
+					{ "time": 5.7333, "x": 0, "y": -11.05 }
+				]
+			},
+			"treadGravity2": {
+				"translate": [
+					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
+					{ "time": 1.4666, "x": 0, "y": 0 },
+					{ "time": 1.8, "x": 0, "y": 8.5 },
+					{ "time": 2.3333, "x": 0, "y": 34.74 },
+					{ "time": 2.5666, "x": 0, "y": 5.2 },
+					{ "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" },
+					{ "time": 4.8666, "x": 0, "y": -11.05 },
+					{ "time": 5.0666, "x": 0, "y": 3.9 },
+					{ "time": 5.5333, "x": 0, "y": -6.9 },
+					{ "time": 5.7333, "x": 0, "y": -11.05 }
+				]
+			},
+			"wheel-small1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 0.7, "angle": 120 },
+					{ "time": 1.1, "angle": 240 },
+					{ "time": 1.4666, "angle": 360 },
+					{ "time": 1.7666, "angle": 120 },
+					{ "time": 2.0333, "angle": 240 },
+					{ "time": 2.2666, "angle": 360 },
+					{ "time": 2.4333, "angle": 120 },
+					{ "time": 2.5666, "angle": 240 },
+					{ "time": 2.7, "angle": 360 },
+					{ "time": 2.8333, "angle": 120 },
+					{ "time": 2.9666, "angle": 240 },
+					{ "time": 3.1, "angle": 360 },
+					{ "time": 3.2333, "angle": 120 },
+					{ "time": 3.3666, "angle": 240 },
+					{ "time": 3.5, "angle": 360 },
+					{ "time": 3.6333, "angle": 120 },
+					{ "time": 3.7666, "angle": 240 },
+					{ "time": 3.9, "angle": 360 },
+					{ "time": 4.0333, "angle": 120 },
+					{ "time": 4.1666, "angle": 240 },
+					{ "time": 4.3, "angle": 360 },
+					{ "time": 4.4333, "angle": 120 },
+					{ "time": 4.5666, "angle": 240 },
+					{ "time": 4.7, "angle": 360 },
+					{ "time": 4.8333, "angle": 120 },
+					{ "time": 5, "angle": 240 },
+					{
+						"time": 5.2,
+						"angle": -25.64,
+						"curve": [ 0.181, 0.26, 0.75, 1 ]
+					},
+					{ "time": 5.5666, "angle": 90 }
+				]
+			},
+			"tankBody": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.1666,
+						"angle": -1.41,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.9333,
+						"angle": -0.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3,
+						"angle": 0.84,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -2.33,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.4666,
+						"angle": -0.45,
+						"curve": [ 0.329, 0.32, 0.757, 1 ]
+					},
+					{
+						"time": 4.8666,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3333,
+						"angle": 1.82,
+						"curve": [ 0.324, 0.01, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -1.15,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.0333, "angle": 0 }
+				]
+			},
+			"antenna1": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna2": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna3": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna4": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna5": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna6": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"machinegun": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 2.8333,
+						"angle": 0,
+						"curve": [ 0.183, 0.17, 0.75, 1 ]
+					},
+					{
+						"time": 3,
+						"angle": -4.43,
+						"curve": [ 0.156, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 3.1666,
+						"angle": -2.93,
+						"curve": [ 0.156, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 4.8333,
+						"angle": 0,
+						"curve": [ 0.183, 0.17, 0.75, 1 ]
+					},
+					{
+						"time": 5.1666,
+						"angle": -6.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.4,
+						"angle": 6.15,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 5.6, "angle": -1.26 }
+				]
+			},
+			"cannon": {
+				"rotate": [
+					{ "time": 0, "angle": 0 }
+				]
+			},
+			"cannonTarget": {
+				"translate": [
+					{
+						"time": 5,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.3333, "x": -15.38, "y": 99.99 }
+				]
+			}
+		},
+		"ik": {
+			"cannonTarget": [
+				{ "time": 0, "mix": 0.809, "curve": "stepped" },
+				{ "time": 4.7333, "mix": 0.809 },
+				{ "time": 5.1666, "mix": 0.504 },
+				{ "time": 5.6666 }
+			]
+		},
+		"paths": {
+			"treads": {
+				"position": [
+					{
+						"time": 0,
+						"curve": [ 0.549, 0, 0.907, 0.84 ]
+					},
+					{ "time": 3.0333, "position": 0.51 },
+					{ "time": 4.8666, "position": 0.9794 },
+					{
+						"time": 5.2666,
+						"position": 1,
+						"curve": [ 0.226, 0.15, 0.765, 0.96 ]
+					},
+					{
+						"time": 5.5333,
+						"position": 1.02,
+						"curve": [ 0.279, 0.32, 0.694, 0.99 ]
+					},
+					{ "time": 5.8333, "position": 1.021 }
+				]
+			}
+		}
+	}
+}
+}

二進制
spine-cocos2d-objc/Resources/tank.png


+ 2 - 2
spine-cocos2d-objc/example/GoblinsExample.m

@@ -30,7 +30,7 @@
  *****************************************************************************/
 
 #import "GoblinsExample.h"
-#import "SpineboyExample.h"
+#import "RaptorExample.h"
 
 @implementation GoblinsExample
 
@@ -65,7 +65,7 @@
 	else if (skeletonNode.timeScale == 1)
 		skeletonNode.timeScale = 0.3f;
 	else
-		[[CCDirector sharedDirector] replaceScene:[SpineboyExample scene]];
+		[[CCDirector sharedDirector] replaceScene:[RaptorExample scene]];
 }
 #endif
 

+ 41 - 0
spine-cocos2d-objc/example/RaptorExample.h

@@ -0,0 +1,41 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ * 
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#import "cocos2d.h"
+#import <spine/spine-cocos2d-objc.h>
+
+@interface RaptorExample : CCNode {
+	SkeletonAnimation* skeletonNode;
+}
+
++ (CCScene*) scene;
+
+@end

+ 71 - 0
spine-cocos2d-objc/example/RaptorExample.m

@@ -0,0 +1,71 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#import "RaptorExample.h"
+#import "TankExample.h"
+
+@implementation RaptorExample
+
++ (CCScene*) scene {
+    CCScene *scene = [CCScene node];
+    [scene addChild:[RaptorExample node]];
+    return scene;
+}
+
+-(id) init {
+    self = [super init];
+    if (!self) return nil;
+    
+    skeletonNode = [SkeletonAnimation skeletonWithFile:@"raptor.json" atlasFile:@"raptor.atlas" scale:0.3f];
+    [skeletonNode setAnimationForTrack:0 name:@"walk" loop:YES];
+    
+    CGSize windowSize = [[CCDirector sharedDirector] viewSize];
+    [skeletonNode setPosition:ccp(windowSize.width / 2, 20)];
+    [self addChild:skeletonNode];
+    
+    self.userInteractionEnabled = YES;
+    self.contentSize = windowSize;
+    
+    return self;
+}
+
+#if ( TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR )
+- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
+    if (!skeletonNode.debugBones)
+        skeletonNode.debugBones = true;
+    else if (skeletonNode.timeScale == 1)
+        skeletonNode.timeScale = 0.3f;
+    else
+        [[CCDirector sharedDirector] replaceScene:[TankExample scene]];
+}
+#endif
+
+@end

+ 41 - 0
spine-cocos2d-objc/example/TankExample.h

@@ -0,0 +1,41 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ * 
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#import "cocos2d.h"
+#import <spine/spine-cocos2d-objc.h>
+
+@interface TankExample : CCNode {
+	SkeletonAnimation* skeletonNode;
+}
+
++ (CCScene*) scene;
+
+@end

+ 71 - 0
spine-cocos2d-objc/example/TankExample.m

@@ -0,0 +1,71 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ *
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#import "TankExample.h"
+#import "SpineboyExample.h"
+
+@implementation TankExample
+
++ (CCScene*) scene {
+    CCScene *scene = [CCScene node];
+    [scene addChild:[TankExample node]];
+    return scene;
+}
+
+-(id) init {
+    self = [super init];
+    if (!self) return nil;
+    
+    skeletonNode = [SkeletonAnimation skeletonWithFile:@"tank.json" atlasFile:@"tank.atlas" scale:0.2f];
+    [skeletonNode setAnimationForTrack:0 name:@"drive" loop:YES];
+    
+    CGSize windowSize = [[CCDirector sharedDirector] viewSize];
+    [skeletonNode setPosition:ccp(windowSize.width / 2, 20)];
+    [self addChild:skeletonNode];
+    
+    self.userInteractionEnabled = YES;
+    self.contentSize = windowSize;
+    
+    return self;
+}
+
+#if ( TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR )
+- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
+    if (!skeletonNode.debugBones)
+        skeletonNode.debugBones = true;
+    else if (skeletonNode.timeScale == 1)
+        skeletonNode.timeScale = 0.3f;
+    else
+        [[CCDirector sharedDirector] replaceScene:[SpineboyExample scene]];
+}
+#endif
+
+@end

+ 162 - 170
spine-cocos2d-objc/spine-cocos2d-objc.xcodeproj/project.pbxproj

@@ -7,11 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		431FF7F31C735D8D00D52DF2 /* TransformConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 431FF7F01C735D8D00D52DF2 /* TransformConstraint.c */; };
-		431FF7F41C735D8D00D52DF2 /* TransformConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 431FF7F11C735D8D00D52DF2 /* TransformConstraintData.c */; };
-		431FF7F51C735D8D00D52DF2 /* WeightedMeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 431FF7F21C735D8D00D52DF2 /* WeightedMeshAttachment.c */; };
-		43B7CC0919DC4ACD0031321C /* IkConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 43B7CC0719DC4ACD0031321C /* IkConstraint.c */; };
-		43B7CC0A19DC4ACD0031321C /* IkConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 43B7CC0819DC4ACD0031321C /* IkConstraintData.c */; };
 		43C3282F170B0C19004A9460 /* spine-cocos2d-objc.m in Sources */ = {isa = PBXBuildFile; fileRef = 43C3282D170B0C19004A9460 /* spine-cocos2d-objc.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
 		43C3286C170B0DA6004A9460 /* spineboy.json in Resources */ = {isa = PBXBuildFile; fileRef = 43C32868170B0DA6004A9460 /* spineboy.json */; };
 		43C3286E170B0DA6004A9460 /* spineboy.atlas in Resources */ = {isa = PBXBuildFile; fileRef = 43C3286A170B0DA6004A9460 /* spineboy.atlas */; };
@@ -33,34 +28,50 @@
 		43F7010F1927FBC700CA4038 /* goblins-mesh.atlas in Resources */ = {isa = PBXBuildFile; fileRef = 43F7010C1927FBC700CA4038 /* goblins-mesh.atlas */; };
 		43F701101927FBC700CA4038 /* goblins-mesh.json in Resources */ = {isa = PBXBuildFile; fileRef = 43F7010D1927FBC700CA4038 /* goblins-mesh.json */; };
 		43F701111927FBC700CA4038 /* goblins-mesh.png in Resources */ = {isa = PBXBuildFile; fileRef = 43F7010E1927FBC700CA4038 /* goblins-mesh.png */; };
-		43F7FF511927F91900CA4038 /* Animation.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF381927F91900CA4038 /* Animation.c */; };
-		43F7FF521927F91900CA4038 /* AnimationState.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF391927F91900CA4038 /* AnimationState.c */; };
-		43F7FF531927F91900CA4038 /* AnimationStateData.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF3A1927F91900CA4038 /* AnimationStateData.c */; };
-		43F7FF541927F91900CA4038 /* Atlas.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF3B1927F91900CA4038 /* Atlas.c */; };
-		43F7FF551927F91900CA4038 /* AtlasAttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF3C1927F91900CA4038 /* AtlasAttachmentLoader.c */; };
-		43F7FF561927F91900CA4038 /* Attachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF3D1927F91900CA4038 /* Attachment.c */; };
-		43F7FF571927F91900CA4038 /* AttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF3E1927F91900CA4038 /* AttachmentLoader.c */; };
-		43F7FF581927F91900CA4038 /* Bone.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF3F1927F91900CA4038 /* Bone.c */; };
-		43F7FF591927F91900CA4038 /* BoneData.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF401927F91900CA4038 /* BoneData.c */; };
-		43F7FF5A1927F91900CA4038 /* BoundingBoxAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF411927F91900CA4038 /* BoundingBoxAttachment.c */; };
-		43F7FF5B1927F91900CA4038 /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF421927F91900CA4038 /* Event.c */; };
-		43F7FF5C1927F91900CA4038 /* EventData.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF431927F91900CA4038 /* EventData.c */; };
-		43F7FF5D1927F91900CA4038 /* extension.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF441927F91900CA4038 /* extension.c */; };
-		43F7FF5E1927F91900CA4038 /* Json.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF451927F91900CA4038 /* Json.c */; };
-		43F7FF5F1927F91900CA4038 /* MeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF471927F91900CA4038 /* MeshAttachment.c */; };
-		43F7FF601927F91900CA4038 /* RegionAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF481927F91900CA4038 /* RegionAttachment.c */; };
-		43F7FF611927F91900CA4038 /* Skeleton.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF491927F91900CA4038 /* Skeleton.c */; };
-		43F7FF621927F91900CA4038 /* SkeletonBounds.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF4A1927F91900CA4038 /* SkeletonBounds.c */; };
-		43F7FF631927F91900CA4038 /* SkeletonData.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF4B1927F91900CA4038 /* SkeletonData.c */; };
-		43F7FF641927F91900CA4038 /* SkeletonJson.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF4C1927F91900CA4038 /* SkeletonJson.c */; };
-		43F7FF651927F91900CA4038 /* Skin.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF4D1927F91900CA4038 /* Skin.c */; };
-		43F7FF671927F91900CA4038 /* Slot.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF4F1927F91900CA4038 /* Slot.c */; };
-		43F7FF681927F91900CA4038 /* SlotData.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF501927F91900CA4038 /* SlotData.c */; };
 		43F7FF881927F94800CA4038 /* SkeletonAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF841927F94800CA4038 /* SkeletonAnimation.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
 		43F7FF891927F94800CA4038 /* SkeletonRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF861927F94800CA4038 /* SkeletonRenderer.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
 		43F7FF8E1927F96700CA4038 /* GoblinsExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF8B1927F96700CA4038 /* GoblinsExample.m */; };
 		43F7FF8F1927F96700CA4038 /* SpineboyExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F7FF8D1927F96700CA4038 /* SpineboyExample.m */; };
 		652107961895250000B1FF07 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 652107951895250000B1FF07 /* CoreText.framework */; };
+		76F5BD7D1D2BDCB5005917E5 /* Animation.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD5D1D2BDCB5005917E5 /* Animation.c */; };
+		76F5BD7E1D2BDCB5005917E5 /* AnimationState.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD5E1D2BDCB5005917E5 /* AnimationState.c */; };
+		76F5BD7F1D2BDCB5005917E5 /* AnimationStateData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD5F1D2BDCB5005917E5 /* AnimationStateData.c */; };
+		76F5BD801D2BDCB5005917E5 /* Atlas.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD601D2BDCB5005917E5 /* Atlas.c */; };
+		76F5BD811D2BDCB5005917E5 /* AtlasAttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD611D2BDCB5005917E5 /* AtlasAttachmentLoader.c */; };
+		76F5BD821D2BDCB5005917E5 /* Attachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD621D2BDCB5005917E5 /* Attachment.c */; };
+		76F5BD831D2BDCB5005917E5 /* AttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD631D2BDCB5005917E5 /* AttachmentLoader.c */; };
+		76F5BD841D2BDCB5005917E5 /* Bone.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD641D2BDCB5005917E5 /* Bone.c */; };
+		76F5BD851D2BDCB5005917E5 /* BoneData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD651D2BDCB5005917E5 /* BoneData.c */; };
+		76F5BD861D2BDCB5005917E5 /* BoundingBoxAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD661D2BDCB5005917E5 /* BoundingBoxAttachment.c */; };
+		76F5BD871D2BDCB5005917E5 /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD671D2BDCB5005917E5 /* Event.c */; };
+		76F5BD881D2BDCB5005917E5 /* EventData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD681D2BDCB5005917E5 /* EventData.c */; };
+		76F5BD891D2BDCB5005917E5 /* extension.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD691D2BDCB5005917E5 /* extension.c */; };
+		76F5BD8A1D2BDCB5005917E5 /* IkConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD6A1D2BDCB5005917E5 /* IkConstraint.c */; };
+		76F5BD8B1D2BDCB5005917E5 /* IkConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD6B1D2BDCB5005917E5 /* IkConstraintData.c */; };
+		76F5BD8C1D2BDCB5005917E5 /* Json.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD6C1D2BDCB5005917E5 /* Json.c */; };
+		76F5BD8D1D2BDCB5005917E5 /* MeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD6E1D2BDCB5005917E5 /* MeshAttachment.c */; };
+		76F5BD8E1D2BDCB5005917E5 /* PathAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD6F1D2BDCB5005917E5 /* PathAttachment.c */; };
+		76F5BD8F1D2BDCB5005917E5 /* PathConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD701D2BDCB5005917E5 /* PathConstraint.c */; };
+		76F5BD901D2BDCB5005917E5 /* PathConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD711D2BDCB5005917E5 /* PathConstraintData.c */; };
+		76F5BD911D2BDCB5005917E5 /* RegionAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD721D2BDCB5005917E5 /* RegionAttachment.c */; };
+		76F5BD921D2BDCB5005917E5 /* Skeleton.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD731D2BDCB5005917E5 /* Skeleton.c */; };
+		76F5BD931D2BDCB5005917E5 /* SkeletonBounds.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD741D2BDCB5005917E5 /* SkeletonBounds.c */; };
+		76F5BD941D2BDCB5005917E5 /* SkeletonData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD751D2BDCB5005917E5 /* SkeletonData.c */; };
+		76F5BD951D2BDCB5005917E5 /* SkeletonJson.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD761D2BDCB5005917E5 /* SkeletonJson.c */; };
+		76F5BD961D2BDCB5005917E5 /* Skin.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD771D2BDCB5005917E5 /* Skin.c */; };
+		76F5BD971D2BDCB5005917E5 /* Slot.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD781D2BDCB5005917E5 /* Slot.c */; };
+		76F5BD981D2BDCB5005917E5 /* SlotData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD791D2BDCB5005917E5 /* SlotData.c */; };
+		76F5BD991D2BDCB5005917E5 /* TransformConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD7A1D2BDCB5005917E5 /* TransformConstraint.c */; };
+		76F5BD9A1D2BDCB5005917E5 /* TransformConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD7B1D2BDCB5005917E5 /* TransformConstraintData.c */; };
+		76F5BD9B1D2BDCB5005917E5 /* VertexAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD7C1D2BDCB5005917E5 /* VertexAttachment.c */; };
+		76F5BDA21D2BDE1C005917E5 /* raptor.atlas in Resources */ = {isa = PBXBuildFile; fileRef = 76F5BD9C1D2BDE1C005917E5 /* raptor.atlas */; };
+		76F5BDA31D2BDE1C005917E5 /* raptor.json in Resources */ = {isa = PBXBuildFile; fileRef = 76F5BD9D1D2BDE1C005917E5 /* raptor.json */; };
+		76F5BDA41D2BDE1C005917E5 /* raptor.png in Resources */ = {isa = PBXBuildFile; fileRef = 76F5BD9E1D2BDE1C005917E5 /* raptor.png */; };
+		76F5BDA51D2BDE1C005917E5 /* tank.atlas in Resources */ = {isa = PBXBuildFile; fileRef = 76F5BD9F1D2BDE1C005917E5 /* tank.atlas */; };
+		76F5BDA61D2BDE1C005917E5 /* tank.json in Resources */ = {isa = PBXBuildFile; fileRef = 76F5BDA01D2BDE1C005917E5 /* tank.json */; };
+		76F5BDA71D2BDE1C005917E5 /* tank.png in Resources */ = {isa = PBXBuildFile; fileRef = 76F5BDA11D2BDE1C005917E5 /* tank.png */; };
+		76F5BDAA1D2BDE67005917E5 /* RaptorExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BDA91D2BDE67005917E5 /* RaptorExample.m */; };
+		76F5BDAD1D2BDFA2005917E5 /* TankExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BDAC1D2BDFA2005917E5 /* TankExample.m */; };
 		83F1A0EF1986955A001F6B44 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83F1A0EE1986955A001F6B44 /* GLKit.framework */; };
 		9A5D2499170A94DA0030D4DD /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A5D2498170A94DA0030D4DD /* QuartzCore.framework */; };
 		9A5D249B170A94DA0030D4DD /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A5D249A170A94DA0030D4DD /* OpenGLES.framework */; };
@@ -112,16 +123,6 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
-		431FF7ED1C735D7A00D52DF2 /* TransformConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TransformConstraint.h; path = "../spine-c/include/spine/TransformConstraint.h"; sourceTree = "<group>"; };
-		431FF7EE1C735D7A00D52DF2 /* TransformConstraintData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TransformConstraintData.h; path = "../spine-c/include/spine/TransformConstraintData.h"; sourceTree = "<group>"; };
-		431FF7EF1C735D7A00D52DF2 /* WeightedMeshAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WeightedMeshAttachment.h; path = "../spine-c/include/spine/WeightedMeshAttachment.h"; sourceTree = "<group>"; };
-		431FF7F01C735D8D00D52DF2 /* TransformConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TransformConstraint.c; path = "../spine-c/src/spine/TransformConstraint.c"; sourceTree = "<group>"; };
-		431FF7F11C735D8D00D52DF2 /* TransformConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TransformConstraintData.c; path = "../spine-c/src/spine/TransformConstraintData.c"; sourceTree = "<group>"; };
-		431FF7F21C735D8D00D52DF2 /* WeightedMeshAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = WeightedMeshAttachment.c; path = "../spine-c/src/spine/WeightedMeshAttachment.c"; sourceTree = "<group>"; };
-		43B7CC0719DC4ACD0031321C /* IkConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IkConstraint.c; path = "../spine-c/src/spine/IkConstraint.c"; sourceTree = "<group>"; };
-		43B7CC0819DC4ACD0031321C /* IkConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IkConstraintData.c; path = "../spine-c/src/spine/IkConstraintData.c"; sourceTree = "<group>"; };
-		43B7CC0D19DC4AE30031321C /* IkConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IkConstraint.h; path = "../spine-c/include/spine/IkConstraint.h"; sourceTree = "<group>"; };
-		43B7CC0E19DC4AE30031321C /* IkConstraintData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IkConstraintData.h; path = "../spine-c/include/spine/IkConstraintData.h"; sourceTree = "<group>"; };
 		43C3282D170B0C19004A9460 /* spine-cocos2d-objc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "spine-cocos2d-objc.m"; path = "src/spine/spine-cocos2d-objc.m"; sourceTree = "<group>"; };
 		43C3282E170B0C19004A9460 /* spine-cocos2d-objc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "spine-cocos2d-objc.h"; path = "src/spine/spine-cocos2d-objc.h"; sourceTree = "<group>"; };
 		43C32868170B0DA6004A9460 /* spineboy.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = spineboy.json; path = Resources/spineboy.json; sourceTree = "<group>"; };
@@ -146,53 +147,6 @@
 		43F7010C1927FBC700CA4038 /* goblins-mesh.atlas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "goblins-mesh.atlas"; path = "Resources/goblins-mesh.atlas"; sourceTree = "<group>"; };
 		43F7010D1927FBC700CA4038 /* goblins-mesh.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "goblins-mesh.json"; path = "Resources/goblins-mesh.json"; sourceTree = "<group>"; };
 		43F7010E1927FBC700CA4038 /* goblins-mesh.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "goblins-mesh.png"; path = "Resources/goblins-mesh.png"; sourceTree = "<group>"; };
-		43F7FF381927F91900CA4038 /* Animation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Animation.c; path = "../spine-c/src/spine/Animation.c"; sourceTree = "<group>"; };
-		43F7FF391927F91900CA4038 /* AnimationState.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AnimationState.c; path = "../spine-c/src/spine/AnimationState.c"; sourceTree = "<group>"; };
-		43F7FF3A1927F91900CA4038 /* AnimationStateData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AnimationStateData.c; path = "../spine-c/src/spine/AnimationStateData.c"; sourceTree = "<group>"; };
-		43F7FF3B1927F91900CA4038 /* Atlas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Atlas.c; path = "../spine-c/src/spine/Atlas.c"; sourceTree = "<group>"; };
-		43F7FF3C1927F91900CA4038 /* AtlasAttachmentLoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AtlasAttachmentLoader.c; path = "../spine-c/src/spine/AtlasAttachmentLoader.c"; sourceTree = "<group>"; };
-		43F7FF3D1927F91900CA4038 /* Attachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Attachment.c; path = "../spine-c/src/spine/Attachment.c"; sourceTree = "<group>"; };
-		43F7FF3E1927F91900CA4038 /* AttachmentLoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AttachmentLoader.c; path = "../spine-c/src/spine/AttachmentLoader.c"; sourceTree = "<group>"; };
-		43F7FF3F1927F91900CA4038 /* Bone.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Bone.c; path = "../spine-c/src/spine/Bone.c"; sourceTree = "<group>"; };
-		43F7FF401927F91900CA4038 /* BoneData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BoneData.c; path = "../spine-c/src/spine/BoneData.c"; sourceTree = "<group>"; };
-		43F7FF411927F91900CA4038 /* BoundingBoxAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BoundingBoxAttachment.c; path = "../spine-c/src/spine/BoundingBoxAttachment.c"; sourceTree = "<group>"; };
-		43F7FF421927F91900CA4038 /* Event.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Event.c; path = "../spine-c/src/spine/Event.c"; sourceTree = "<group>"; };
-		43F7FF431927F91900CA4038 /* EventData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = EventData.c; path = "../spine-c/src/spine/EventData.c"; sourceTree = "<group>"; };
-		43F7FF441927F91900CA4038 /* extension.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = extension.c; path = "../spine-c/src/spine/extension.c"; sourceTree = "<group>"; };
-		43F7FF451927F91900CA4038 /* Json.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Json.c; path = "../spine-c/src/spine/Json.c"; sourceTree = "<group>"; };
-		43F7FF461927F91900CA4038 /* Json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Json.h; path = "../spine-c/src/spine/Json.h"; sourceTree = "<group>"; };
-		43F7FF471927F91900CA4038 /* MeshAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = MeshAttachment.c; path = "../spine-c/src/spine/MeshAttachment.c"; sourceTree = "<group>"; };
-		43F7FF481927F91900CA4038 /* RegionAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = RegionAttachment.c; path = "../spine-c/src/spine/RegionAttachment.c"; sourceTree = "<group>"; };
-		43F7FF491927F91900CA4038 /* Skeleton.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Skeleton.c; path = "../spine-c/src/spine/Skeleton.c"; sourceTree = "<group>"; };
-		43F7FF4A1927F91900CA4038 /* SkeletonBounds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonBounds.c; path = "../spine-c/src/spine/SkeletonBounds.c"; sourceTree = "<group>"; };
-		43F7FF4B1927F91900CA4038 /* SkeletonData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonData.c; path = "../spine-c/src/spine/SkeletonData.c"; sourceTree = "<group>"; };
-		43F7FF4C1927F91900CA4038 /* SkeletonJson.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonJson.c; path = "../spine-c/src/spine/SkeletonJson.c"; sourceTree = "<group>"; };
-		43F7FF4D1927F91900CA4038 /* Skin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Skin.c; path = "../spine-c/src/spine/Skin.c"; sourceTree = "<group>"; };
-		43F7FF4F1927F91900CA4038 /* Slot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Slot.c; path = "../spine-c/src/spine/Slot.c"; sourceTree = "<group>"; };
-		43F7FF501927F91900CA4038 /* SlotData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SlotData.c; path = "../spine-c/src/spine/SlotData.c"; sourceTree = "<group>"; };
-		43F7FF691927F92500CA4038 /* Animation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Animation.h; path = "../spine-c/include/spine/Animation.h"; sourceTree = "<group>"; };
-		43F7FF6A1927F92500CA4038 /* AnimationState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AnimationState.h; path = "../spine-c/include/spine/AnimationState.h"; sourceTree = "<group>"; };
-		43F7FF6B1927F92500CA4038 /* AnimationStateData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AnimationStateData.h; path = "../spine-c/include/spine/AnimationStateData.h"; sourceTree = "<group>"; };
-		43F7FF6C1927F92500CA4038 /* Atlas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Atlas.h; path = "../spine-c/include/spine/Atlas.h"; sourceTree = "<group>"; };
-		43F7FF6D1927F92500CA4038 /* AtlasAttachmentLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AtlasAttachmentLoader.h; path = "../spine-c/include/spine/AtlasAttachmentLoader.h"; sourceTree = "<group>"; };
-		43F7FF6E1927F92500CA4038 /* Attachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Attachment.h; path = "../spine-c/include/spine/Attachment.h"; sourceTree = "<group>"; };
-		43F7FF6F1927F92500CA4038 /* AttachmentLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AttachmentLoader.h; path = "../spine-c/include/spine/AttachmentLoader.h"; sourceTree = "<group>"; };
-		43F7FF701927F92500CA4038 /* Bone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Bone.h; path = "../spine-c/include/spine/Bone.h"; sourceTree = "<group>"; };
-		43F7FF711927F92500CA4038 /* BoneData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BoneData.h; path = "../spine-c/include/spine/BoneData.h"; sourceTree = "<group>"; };
-		43F7FF721927F92500CA4038 /* BoundingBoxAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BoundingBoxAttachment.h; path = "../spine-c/include/spine/BoundingBoxAttachment.h"; sourceTree = "<group>"; };
-		43F7FF731927F92500CA4038 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Event.h; path = "../spine-c/include/spine/Event.h"; sourceTree = "<group>"; };
-		43F7FF741927F92500CA4038 /* EventData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EventData.h; path = "../spine-c/include/spine/EventData.h"; sourceTree = "<group>"; };
-		43F7FF751927F92500CA4038 /* extension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = extension.h; path = "../spine-c/include/spine/extension.h"; sourceTree = "<group>"; };
-		43F7FF761927F92500CA4038 /* MeshAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MeshAttachment.h; path = "../spine-c/include/spine/MeshAttachment.h"; sourceTree = "<group>"; };
-		43F7FF771927F92500CA4038 /* RegionAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegionAttachment.h; path = "../spine-c/include/spine/RegionAttachment.h"; sourceTree = "<group>"; };
-		43F7FF781927F92500CA4038 /* Skeleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Skeleton.h; path = "../spine-c/include/spine/Skeleton.h"; sourceTree = "<group>"; };
-		43F7FF791927F92500CA4038 /* SkeletonBounds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkeletonBounds.h; path = "../spine-c/include/spine/SkeletonBounds.h"; sourceTree = "<group>"; };
-		43F7FF7A1927F92500CA4038 /* SkeletonData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkeletonData.h; path = "../spine-c/include/spine/SkeletonData.h"; sourceTree = "<group>"; };
-		43F7FF7B1927F92500CA4038 /* SkeletonJson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkeletonJson.h; path = "../spine-c/include/spine/SkeletonJson.h"; sourceTree = "<group>"; };
-		43F7FF7C1927F92500CA4038 /* Skin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Skin.h; path = "../spine-c/include/spine/Skin.h"; sourceTree = "<group>"; };
-		43F7FF7E1927F92500CA4038 /* Slot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Slot.h; path = "../spine-c/include/spine/Slot.h"; sourceTree = "<group>"; };
-		43F7FF7F1927F92500CA4038 /* SlotData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SlotData.h; path = "../spine-c/include/spine/SlotData.h"; sourceTree = "<group>"; };
-		43F7FF801927F92500CA4038 /* spine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spine.h; path = "../spine-c/include/spine/spine.h"; sourceTree = "<group>"; };
 		43F7FF831927F94800CA4038 /* SkeletonAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkeletonAnimation.h; path = src/spine/SkeletonAnimation.h; sourceTree = "<group>"; };
 		43F7FF841927F94800CA4038 /* SkeletonAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SkeletonAnimation.m; path = src/spine/SkeletonAnimation.m; sourceTree = "<group>"; };
 		43F7FF851927F94800CA4038 /* SkeletonRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkeletonRenderer.h; path = src/spine/SkeletonRenderer.h; sourceTree = "<group>"; };
@@ -202,6 +156,48 @@
 		43F7FF8C1927F96700CA4038 /* SpineboyExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpineboyExample.h; path = example/SpineboyExample.h; sourceTree = "<group>"; };
 		43F7FF8D1927F96700CA4038 /* SpineboyExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpineboyExample.m; path = example/SpineboyExample.m; sourceTree = "<group>"; };
 		652107951895250000B1FF07 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+		76F5BD5D1D2BDCB5005917E5 /* Animation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Animation.c; path = "../spine-c/src/spine/Animation.c"; sourceTree = "<group>"; };
+		76F5BD5E1D2BDCB5005917E5 /* AnimationState.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AnimationState.c; path = "../spine-c/src/spine/AnimationState.c"; sourceTree = "<group>"; };
+		76F5BD5F1D2BDCB5005917E5 /* AnimationStateData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AnimationStateData.c; path = "../spine-c/src/spine/AnimationStateData.c"; sourceTree = "<group>"; };
+		76F5BD601D2BDCB5005917E5 /* Atlas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Atlas.c; path = "../spine-c/src/spine/Atlas.c"; sourceTree = "<group>"; };
+		76F5BD611D2BDCB5005917E5 /* AtlasAttachmentLoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AtlasAttachmentLoader.c; path = "../spine-c/src/spine/AtlasAttachmentLoader.c"; sourceTree = "<group>"; };
+		76F5BD621D2BDCB5005917E5 /* Attachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Attachment.c; path = "../spine-c/src/spine/Attachment.c"; sourceTree = "<group>"; };
+		76F5BD631D2BDCB5005917E5 /* AttachmentLoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AttachmentLoader.c; path = "../spine-c/src/spine/AttachmentLoader.c"; sourceTree = "<group>"; };
+		76F5BD641D2BDCB5005917E5 /* Bone.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Bone.c; path = "../spine-c/src/spine/Bone.c"; sourceTree = "<group>"; };
+		76F5BD651D2BDCB5005917E5 /* BoneData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BoneData.c; path = "../spine-c/src/spine/BoneData.c"; sourceTree = "<group>"; };
+		76F5BD661D2BDCB5005917E5 /* BoundingBoxAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BoundingBoxAttachment.c; path = "../spine-c/src/spine/BoundingBoxAttachment.c"; sourceTree = "<group>"; };
+		76F5BD671D2BDCB5005917E5 /* Event.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Event.c; path = "../spine-c/src/spine/Event.c"; sourceTree = "<group>"; };
+		76F5BD681D2BDCB5005917E5 /* EventData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = EventData.c; path = "../spine-c/src/spine/EventData.c"; sourceTree = "<group>"; };
+		76F5BD691D2BDCB5005917E5 /* extension.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = extension.c; path = "../spine-c/src/spine/extension.c"; sourceTree = "<group>"; };
+		76F5BD6A1D2BDCB5005917E5 /* IkConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IkConstraint.c; path = "../spine-c/src/spine/IkConstraint.c"; sourceTree = "<group>"; };
+		76F5BD6B1D2BDCB5005917E5 /* IkConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IkConstraintData.c; path = "../spine-c/src/spine/IkConstraintData.c"; sourceTree = "<group>"; };
+		76F5BD6C1D2BDCB5005917E5 /* Json.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Json.c; path = "../spine-c/src/spine/Json.c"; sourceTree = "<group>"; };
+		76F5BD6D1D2BDCB5005917E5 /* Json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Json.h; path = "../spine-c/src/spine/Json.h"; sourceTree = "<group>"; };
+		76F5BD6E1D2BDCB5005917E5 /* MeshAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = MeshAttachment.c; path = "../spine-c/src/spine/MeshAttachment.c"; sourceTree = "<group>"; };
+		76F5BD6F1D2BDCB5005917E5 /* PathAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = PathAttachment.c; path = "../spine-c/src/spine/PathAttachment.c"; sourceTree = "<group>"; };
+		76F5BD701D2BDCB5005917E5 /* PathConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = PathConstraint.c; path = "../spine-c/src/spine/PathConstraint.c"; sourceTree = "<group>"; };
+		76F5BD711D2BDCB5005917E5 /* PathConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = PathConstraintData.c; path = "../spine-c/src/spine/PathConstraintData.c"; sourceTree = "<group>"; };
+		76F5BD721D2BDCB5005917E5 /* RegionAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = RegionAttachment.c; path = "../spine-c/src/spine/RegionAttachment.c"; sourceTree = "<group>"; };
+		76F5BD731D2BDCB5005917E5 /* Skeleton.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Skeleton.c; path = "../spine-c/src/spine/Skeleton.c"; sourceTree = "<group>"; };
+		76F5BD741D2BDCB5005917E5 /* SkeletonBounds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonBounds.c; path = "../spine-c/src/spine/SkeletonBounds.c"; sourceTree = "<group>"; };
+		76F5BD751D2BDCB5005917E5 /* SkeletonData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonData.c; path = "../spine-c/src/spine/SkeletonData.c"; sourceTree = "<group>"; };
+		76F5BD761D2BDCB5005917E5 /* SkeletonJson.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonJson.c; path = "../spine-c/src/spine/SkeletonJson.c"; sourceTree = "<group>"; };
+		76F5BD771D2BDCB5005917E5 /* Skin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Skin.c; path = "../spine-c/src/spine/Skin.c"; sourceTree = "<group>"; };
+		76F5BD781D2BDCB5005917E5 /* Slot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Slot.c; path = "../spine-c/src/spine/Slot.c"; sourceTree = "<group>"; };
+		76F5BD791D2BDCB5005917E5 /* SlotData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SlotData.c; path = "../spine-c/src/spine/SlotData.c"; sourceTree = "<group>"; };
+		76F5BD7A1D2BDCB5005917E5 /* TransformConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TransformConstraint.c; path = "../spine-c/src/spine/TransformConstraint.c"; sourceTree = "<group>"; };
+		76F5BD7B1D2BDCB5005917E5 /* TransformConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TransformConstraintData.c; path = "../spine-c/src/spine/TransformConstraintData.c"; sourceTree = "<group>"; };
+		76F5BD7C1D2BDCB5005917E5 /* VertexAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = VertexAttachment.c; path = "../spine-c/src/spine/VertexAttachment.c"; sourceTree = "<group>"; };
+		76F5BD9C1D2BDE1C005917E5 /* raptor.atlas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = raptor.atlas; path = Resources/raptor.atlas; sourceTree = "<group>"; };
+		76F5BD9D1D2BDE1C005917E5 /* raptor.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = raptor.json; path = Resources/raptor.json; sourceTree = "<group>"; };
+		76F5BD9E1D2BDE1C005917E5 /* raptor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = raptor.png; path = Resources/raptor.png; sourceTree = "<group>"; };
+		76F5BD9F1D2BDE1C005917E5 /* tank.atlas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tank.atlas; path = Resources/tank.atlas; sourceTree = "<group>"; };
+		76F5BDA01D2BDE1C005917E5 /* tank.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = tank.json; path = Resources/tank.json; sourceTree = "<group>"; };
+		76F5BDA11D2BDE1C005917E5 /* tank.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tank.png; path = Resources/tank.png; sourceTree = "<group>"; };
+		76F5BDA81D2BDE67005917E5 /* RaptorExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RaptorExample.h; path = example/RaptorExample.h; sourceTree = "<group>"; };
+		76F5BDA91D2BDE67005917E5 /* RaptorExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RaptorExample.m; path = example/RaptorExample.m; sourceTree = "<group>"; };
+		76F5BDAB1D2BDFA2005917E5 /* TankExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TankExample.h; path = example/TankExample.h; sourceTree = "<group>"; };
+		76F5BDAC1D2BDFA2005917E5 /* TankExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TankExample.m; path = example/TankExample.m; sourceTree = "<group>"; };
 		83F1A0EE1986955A001F6B44 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; };
 		9A5D2495170A94DA0030D4DD /* SpineExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SpineExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		9A5D2498170A94DA0030D4DD /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
@@ -259,6 +255,10 @@
 				43F7FF8D1927F96700CA4038 /* SpineboyExample.m */,
 				43F7FF8A1927F96700CA4038 /* GoblinsExample.h */,
 				43F7FF8B1927F96700CA4038 /* GoblinsExample.m */,
+				76F5BDA81D2BDE67005917E5 /* RaptorExample.h */,
+				76F5BDA91D2BDE67005917E5 /* RaptorExample.m */,
+				76F5BDAB1D2BDFA2005917E5 /* TankExample.h */,
+				76F5BDAC1D2BDFA2005917E5 /* TankExample.m */,
 				43C32A07170B10FF004A9460 /* AppDelegate.h */,
 				43C32A08170B10FF004A9460 /* AppDelegate.m */,
 				43C32A05170B0F93004A9460 /* main.m */,
@@ -270,63 +270,38 @@
 		43C32822170B0BC2004A9460 /* spine-c */ = {
 			isa = PBXGroup;
 			children = (
-				43F7FF381927F91900CA4038 /* Animation.c */,
-				43F7FF691927F92500CA4038 /* Animation.h */,
-				43F7FF391927F91900CA4038 /* AnimationState.c */,
-				43F7FF6A1927F92500CA4038 /* AnimationState.h */,
-				43F7FF3A1927F91900CA4038 /* AnimationStateData.c */,
-				43F7FF6B1927F92500CA4038 /* AnimationStateData.h */,
-				43F7FF3B1927F91900CA4038 /* Atlas.c */,
-				43F7FF6C1927F92500CA4038 /* Atlas.h */,
-				43F7FF3C1927F91900CA4038 /* AtlasAttachmentLoader.c */,
-				43F7FF6D1927F92500CA4038 /* AtlasAttachmentLoader.h */,
-				43F7FF3D1927F91900CA4038 /* Attachment.c */,
-				43F7FF6E1927F92500CA4038 /* Attachment.h */,
-				43F7FF3E1927F91900CA4038 /* AttachmentLoader.c */,
-				43F7FF6F1927F92500CA4038 /* AttachmentLoader.h */,
-				43F7FF3F1927F91900CA4038 /* Bone.c */,
-				43F7FF701927F92500CA4038 /* Bone.h */,
-				43F7FF401927F91900CA4038 /* BoneData.c */,
-				43F7FF711927F92500CA4038 /* BoneData.h */,
-				43F7FF411927F91900CA4038 /* BoundingBoxAttachment.c */,
-				43F7FF721927F92500CA4038 /* BoundingBoxAttachment.h */,
-				43F7FF421927F91900CA4038 /* Event.c */,
-				43F7FF731927F92500CA4038 /* Event.h */,
-				43F7FF431927F91900CA4038 /* EventData.c */,
-				43F7FF741927F92500CA4038 /* EventData.h */,
-				43F7FF441927F91900CA4038 /* extension.c */,
-				43F7FF751927F92500CA4038 /* extension.h */,
-				43B7CC0719DC4ACD0031321C /* IkConstraint.c */,
-				43B7CC0D19DC4AE30031321C /* IkConstraint.h */,
-				43B7CC0819DC4ACD0031321C /* IkConstraintData.c */,
-				43B7CC0E19DC4AE30031321C /* IkConstraintData.h */,
-				43F7FF451927F91900CA4038 /* Json.c */,
-				43F7FF461927F91900CA4038 /* Json.h */,
-				43F7FF471927F91900CA4038 /* MeshAttachment.c */,
-				43F7FF761927F92500CA4038 /* MeshAttachment.h */,
-				43F7FF481927F91900CA4038 /* RegionAttachment.c */,
-				43F7FF771927F92500CA4038 /* RegionAttachment.h */,
-				43F7FF491927F91900CA4038 /* Skeleton.c */,
-				43F7FF781927F92500CA4038 /* Skeleton.h */,
-				43F7FF4A1927F91900CA4038 /* SkeletonBounds.c */,
-				43F7FF791927F92500CA4038 /* SkeletonBounds.h */,
-				43F7FF4B1927F91900CA4038 /* SkeletonData.c */,
-				43F7FF7A1927F92500CA4038 /* SkeletonData.h */,
-				43F7FF4C1927F91900CA4038 /* SkeletonJson.c */,
-				43F7FF7B1927F92500CA4038 /* SkeletonJson.h */,
-				43F7FF4D1927F91900CA4038 /* Skin.c */,
-				43F7FF7C1927F92500CA4038 /* Skin.h */,
-				43F7FF4F1927F91900CA4038 /* Slot.c */,
-				43F7FF7E1927F92500CA4038 /* Slot.h */,
-				43F7FF501927F91900CA4038 /* SlotData.c */,
-				43F7FF7F1927F92500CA4038 /* SlotData.h */,
-				43F7FF801927F92500CA4038 /* spine.h */,
-				431FF7F01C735D8D00D52DF2 /* TransformConstraint.c */,
-				431FF7ED1C735D7A00D52DF2 /* TransformConstraint.h */,
-				431FF7F11C735D8D00D52DF2 /* TransformConstraintData.c */,
-				431FF7EE1C735D7A00D52DF2 /* TransformConstraintData.h */,
-				431FF7F21C735D8D00D52DF2 /* WeightedMeshAttachment.c */,
-				431FF7EF1C735D7A00D52DF2 /* WeightedMeshAttachment.h */,
+				76F5BD5D1D2BDCB5005917E5 /* Animation.c */,
+				76F5BD5E1D2BDCB5005917E5 /* AnimationState.c */,
+				76F5BD5F1D2BDCB5005917E5 /* AnimationStateData.c */,
+				76F5BD601D2BDCB5005917E5 /* Atlas.c */,
+				76F5BD611D2BDCB5005917E5 /* AtlasAttachmentLoader.c */,
+				76F5BD621D2BDCB5005917E5 /* Attachment.c */,
+				76F5BD631D2BDCB5005917E5 /* AttachmentLoader.c */,
+				76F5BD641D2BDCB5005917E5 /* Bone.c */,
+				76F5BD651D2BDCB5005917E5 /* BoneData.c */,
+				76F5BD661D2BDCB5005917E5 /* BoundingBoxAttachment.c */,
+				76F5BD671D2BDCB5005917E5 /* Event.c */,
+				76F5BD681D2BDCB5005917E5 /* EventData.c */,
+				76F5BD691D2BDCB5005917E5 /* extension.c */,
+				76F5BD6A1D2BDCB5005917E5 /* IkConstraint.c */,
+				76F5BD6B1D2BDCB5005917E5 /* IkConstraintData.c */,
+				76F5BD6C1D2BDCB5005917E5 /* Json.c */,
+				76F5BD6D1D2BDCB5005917E5 /* Json.h */,
+				76F5BD6E1D2BDCB5005917E5 /* MeshAttachment.c */,
+				76F5BD6F1D2BDCB5005917E5 /* PathAttachment.c */,
+				76F5BD701D2BDCB5005917E5 /* PathConstraint.c */,
+				76F5BD711D2BDCB5005917E5 /* PathConstraintData.c */,
+				76F5BD721D2BDCB5005917E5 /* RegionAttachment.c */,
+				76F5BD731D2BDCB5005917E5 /* Skeleton.c */,
+				76F5BD741D2BDCB5005917E5 /* SkeletonBounds.c */,
+				76F5BD751D2BDCB5005917E5 /* SkeletonData.c */,
+				76F5BD761D2BDCB5005917E5 /* SkeletonJson.c */,
+				76F5BD771D2BDCB5005917E5 /* Skin.c */,
+				76F5BD781D2BDCB5005917E5 /* Slot.c */,
+				76F5BD791D2BDCB5005917E5 /* SlotData.c */,
+				76F5BD7A1D2BDCB5005917E5 /* TransformConstraint.c */,
+				76F5BD7B1D2BDCB5005917E5 /* TransformConstraintData.c */,
+				76F5BD7C1D2BDCB5005917E5 /* VertexAttachment.c */,
 			);
 			name = "spine-c";
 			sourceTree = "<group>";
@@ -347,6 +322,12 @@
 		43C32867170B0C7F004A9460 /* Resources */ = {
 			isa = PBXGroup;
 			children = (
+				76F5BD9C1D2BDE1C005917E5 /* raptor.atlas */,
+				76F5BD9D1D2BDE1C005917E5 /* raptor.json */,
+				76F5BD9E1D2BDE1C005917E5 /* raptor.png */,
+				76F5BD9F1D2BDE1C005917E5 /* tank.atlas */,
+				76F5BDA01D2BDE1C005917E5 /* tank.json */,
+				76F5BDA11D2BDE1C005917E5 /* tank.png */,
 				43F7010C1927FBC700CA4038 /* goblins-mesh.atlas */,
 				43F7010D1927FBC700CA4038 /* goblins-mesh.json */,
 				43F7010E1927FBC700CA4038 /* goblins-mesh.png */,
@@ -512,19 +493,25 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				76F5BDA51D2BDE1C005917E5 /* tank.atlas in Resources */,
 				43C3286C170B0DA6004A9460 /* spineboy.json in Resources */,
 				43C3286E170B0DA6004A9460 /* spineboy.atlas in Resources */,
 				43C3286F170B0DA6004A9460 /* spineboy.png in Resources */,
 				43C3287D170B0DBE004A9460 /* [email protected] in Resources */,
 				43C3287E170B0DBE004A9460 /* Default-Landscape~ipad.png in Resources */,
 				43C3287F170B0DBE004A9460 /* Default.png in Resources */,
+				76F5BDA31D2BDE1C005917E5 /* raptor.json in Resources */,
 				43C32880170B0DBE004A9460 /* [email protected] in Resources */,
 				43C32881170B0DBE004A9460 /* Icon-72.png in Resources */,
+				76F5BDA41D2BDE1C005917E5 /* raptor.png in Resources */,
 				43C32882170B0DBE004A9460 /* Icon-Small-50.png in Resources */,
+				76F5BDA21D2BDE1C005917E5 /* raptor.atlas in Resources */,
 				43C32883170B0DBE004A9460 /* Icon-Small.png in Resources */,
 				43C32884170B0DBE004A9460 /* [email protected] in Resources */,
 				43C32885170B0DBE004A9460 /* Icon.png in Resources */,
+				76F5BDA71D2BDE1C005917E5 /* tank.png in Resources */,
 				43C32886170B0DBE004A9460 /* [email protected] in Resources */,
+				76F5BDA61D2BDE1C005917E5 /* tank.json in Resources */,
 				43C32888170B0DBE004A9460 /* iTunesArtwork in Resources */,
 				43F7010F1927FBC700CA4038 /* goblins-mesh.atlas in Resources */,
 				43F701101927FBC700CA4038 /* goblins-mesh.json in Resources */,
@@ -539,41 +526,46 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				76F5BDAA1D2BDE67005917E5 /* RaptorExample.m in Sources */,
+				76F5BD8E1D2BDCB5005917E5 /* PathAttachment.c in Sources */,
+				76F5BDAD1D2BDFA2005917E5 /* TankExample.m in Sources */,
+				76F5BD931D2BDCB5005917E5 /* SkeletonBounds.c in Sources */,
+				76F5BD871D2BDCB5005917E5 /* Event.c in Sources */,
+				76F5BD8C1D2BDCB5005917E5 /* Json.c in Sources */,
+				76F5BD891D2BDCB5005917E5 /* extension.c in Sources */,
+				76F5BD881D2BDCB5005917E5 /* EventData.c in Sources */,
+				76F5BD7F1D2BDCB5005917E5 /* AnimationStateData.c in Sources */,
+				76F5BD8B1D2BDCB5005917E5 /* IkConstraintData.c in Sources */,
+				76F5BD831D2BDCB5005917E5 /* AttachmentLoader.c in Sources */,
+				76F5BD9A1D2BDCB5005917E5 /* TransformConstraintData.c in Sources */,
+				76F5BD971D2BDCB5005917E5 /* Slot.c in Sources */,
+				76F5BD861D2BDCB5005917E5 /* BoundingBoxAttachment.c in Sources */,
+				76F5BD9B1D2BDCB5005917E5 /* VertexAttachment.c in Sources */,
 				43C3282F170B0C19004A9460 /* spine-cocos2d-objc.m in Sources */,
+				76F5BD821D2BDCB5005917E5 /* Attachment.c in Sources */,
+				76F5BD801D2BDCB5005917E5 /* Atlas.c in Sources */,
+				76F5BD911D2BDCB5005917E5 /* RegionAttachment.c in Sources */,
 				43C32A06170B0F93004A9460 /* main.m in Sources */,
+				76F5BD8F1D2BDCB5005917E5 /* PathConstraint.c in Sources */,
 				43C32A09170B10FF004A9460 /* AppDelegate.m in Sources */,
-				43F7FF511927F91900CA4038 /* Animation.c in Sources */,
-				43F7FF521927F91900CA4038 /* AnimationState.c in Sources */,
-				43F7FF531927F91900CA4038 /* AnimationStateData.c in Sources */,
-				43F7FF541927F91900CA4038 /* Atlas.c in Sources */,
-				43F7FF551927F91900CA4038 /* AtlasAttachmentLoader.c in Sources */,
-				43F7FF561927F91900CA4038 /* Attachment.c in Sources */,
-				43F7FF571927F91900CA4038 /* AttachmentLoader.c in Sources */,
-				43F7FF581927F91900CA4038 /* Bone.c in Sources */,
-				43F7FF591927F91900CA4038 /* BoneData.c in Sources */,
-				43F7FF5A1927F91900CA4038 /* BoundingBoxAttachment.c in Sources */,
-				43F7FF5B1927F91900CA4038 /* Event.c in Sources */,
-				43F7FF5C1927F91900CA4038 /* EventData.c in Sources */,
-				43B7CC0A19DC4ACD0031321C /* IkConstraintData.c in Sources */,
-				43F7FF5D1927F91900CA4038 /* extension.c in Sources */,
-				43F7FF5E1927F91900CA4038 /* Json.c in Sources */,
-				43F7FF5F1927F91900CA4038 /* MeshAttachment.c in Sources */,
-				43F7FF601927F91900CA4038 /* RegionAttachment.c in Sources */,
-				431FF7F51C735D8D00D52DF2 /* WeightedMeshAttachment.c in Sources */,
-				43F7FF611927F91900CA4038 /* Skeleton.c in Sources */,
-				43F7FF621927F91900CA4038 /* SkeletonBounds.c in Sources */,
-				43F7FF631927F91900CA4038 /* SkeletonData.c in Sources */,
-				43F7FF641927F91900CA4038 /* SkeletonJson.c in Sources */,
-				43F7FF651927F91900CA4038 /* Skin.c in Sources */,
-				43B7CC0919DC4ACD0031321C /* IkConstraint.c in Sources */,
-				43F7FF671927F91900CA4038 /* Slot.c in Sources */,
-				43F7FF681927F91900CA4038 /* SlotData.c in Sources */,
+				76F5BD981D2BDCB5005917E5 /* SlotData.c in Sources */,
+				76F5BD7E1D2BDCB5005917E5 /* AnimationState.c in Sources */,
 				43F7FF881927F94800CA4038 /* SkeletonAnimation.m in Sources */,
+				76F5BD851D2BDCB5005917E5 /* BoneData.c in Sources */,
+				76F5BD7D1D2BDCB5005917E5 /* Animation.c in Sources */,
+				76F5BD841D2BDCB5005917E5 /* Bone.c in Sources */,
+				76F5BD901D2BDCB5005917E5 /* PathConstraintData.c in Sources */,
 				43F7FF891927F94800CA4038 /* SkeletonRenderer.m in Sources */,
+				76F5BD921D2BDCB5005917E5 /* Skeleton.c in Sources */,
+				76F5BD811D2BDCB5005917E5 /* AtlasAttachmentLoader.c in Sources */,
+				76F5BD961D2BDCB5005917E5 /* Skin.c in Sources */,
 				43F7FF8E1927F96700CA4038 /* GoblinsExample.m in Sources */,
-				431FF7F41C735D8D00D52DF2 /* TransformConstraintData.c in Sources */,
+				76F5BD941D2BDCB5005917E5 /* SkeletonData.c in Sources */,
+				76F5BD8A1D2BDCB5005917E5 /* IkConstraint.c in Sources */,
 				43F7FF8F1927F96700CA4038 /* SpineboyExample.m in Sources */,
-				431FF7F31C735D8D00D52DF2 /* TransformConstraint.c in Sources */,
+				76F5BD951D2BDCB5005917E5 /* SkeletonJson.c in Sources */,
+				76F5BD8D1D2BDCB5005917E5 /* MeshAttachment.c in Sources */,
+				76F5BD991D2BDCB5005917E5 /* TransformConstraint.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 0 - 1
spine-cocos2d-objc/src/spine/SkeletonRenderer.h

@@ -57,7 +57,6 @@
 
 - (CCTexture*) getTextureForRegion:(spRegionAttachment*)attachment;
 - (CCTexture*) getTextureForMesh:(spMeshAttachment*)attachment;
-- (CCTexture*) getTextureForWeightedMesh:(spWeightedMeshAttachment*)attachment;
 
 // --- Convenience methods for common Skeleton_* functions.
 - (void) updateWorldTransform;

+ 2 - 24
spine-cocos2d-objc/src/spine/SkeletonRenderer.m

@@ -174,21 +174,7 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 			spMeshAttachment_computeWorldVertices(attachment, slot, _worldVertices);
 			texture = [self getTextureForMesh:attachment];
 			uvs = attachment->uvs;
-			verticesCount = attachment->verticesCount;
-			triangles = attachment->triangles;
-			trianglesCount = attachment->trianglesCount;
-			r = attachment->r;
-			g = attachment->g;
-			b = attachment->b;
-			a = attachment->a;
-			break;
-		}
-		case SP_ATTACHMENT_WEIGHTED_MESH: {
-			spWeightedMeshAttachment* attachment = (spWeightedMeshAttachment*)slot->attachment;
-			spWeightedMeshAttachment_computeWorldVertices(attachment, slot, _worldVertices);
-			texture = [self getTextureForWeightedMesh:attachment];
-			uvs = attachment->uvs;
-			verticesCount = attachment->uvsCount;
+			verticesCount = attachment->super.worldVerticesLength;
 			triangles = attachment->triangles;
 			trianglesCount = attachment->trianglesCount;
 			r = attachment->r;
@@ -288,10 +274,6 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 	return (CCTexture*)((spAtlasRegion*)attachment->rendererObject)->page->rendererObject;
 }
 
-- (CCTexture*) getTextureForWeightedMesh:(spWeightedMeshAttachment*)attachment {
-	return (CCTexture*)((spAtlasRegion*)attachment->rendererObject)->page->rendererObject;
-}
-
 - (CGRect) boundingBox {
 	float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
 	float scaleX = self.scaleX, scaleY = self.scaleY;
@@ -306,11 +288,7 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		} else if (slot->attachment->type == SP_ATTACHMENT_MESH) {
 			spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment;
 			spMeshAttachment_computeWorldVertices(mesh, slot, _worldVertices);
-			verticesCount = mesh->verticesCount;
-		} else if (slot->attachment->type == SP_ATTACHMENT_WEIGHTED_MESH) {
-			spWeightedMeshAttachment* mesh = (spWeightedMeshAttachment*)slot->attachment;
-			spWeightedMeshAttachment_computeWorldVertices(mesh, slot, _worldVertices);
-			verticesCount = mesh->uvsCount;
+			verticesCount = mesh->super.worldVerticesLength;
 		} else
 			continue;
 		for (int ii = 0; ii < verticesCount; ii += 2) {

+ 1 - 0
spine-cocos2dx/CMakeLists.txt

@@ -1,3 +1,4 @@
+cmake_minimum_required(VERSION 2.8)
 set(EXAMPLE_DIR "${CMAKE_CURRENT_LIST_DIR}/example")
 if (NOT EXISTS ${EXAMPLE_DIR}/cocos2d)
 	message("Downloading cocos2dx, this may take some time!")

+ 3 - 2
spine-cocos2dx/README.md

@@ -10,7 +10,7 @@ The Spine Runtimes are developed with the intent to be used with data exported f
 
 ## Spine version
 
-spine-cocos2dx works with data exported from Spine version 3.2.01.
+spine-cocos2dx works with data exported from Spine version 3.3.07.
 
 spine-cocos2dx supports all Spine features.
 
@@ -40,6 +40,7 @@ The Spine cocos2d-x example works on Windows and Mac OS X.
 7. Click `Configure`. This will download the cocos2d-x dependency and wire it up with the example source code in `spine-runtimes/spine-cocos2dx/example`. The download is 400mb, so get yourself a cup of tea.
 8. Open the `spine-runtimes/spine-cocos2dx/example/proj.win32/spine-cocos2d-x.sln` file in Visual Studio 2015. Visual Studio may ask you to install the Windows XP/7 SDK, which you should install.
 9. Expand the cocos2d_libs sub project and delete the `editor-support/spine` group. This will remove the outdated Spine cocos2d-x runtime shipped by cocos2d-x from your build.
+9. Expand `References` of the cocos2d_libs sub project, and remove the entry for `libSpine`, which should be marked with an error.
 9. Right click the `spine-cocos2d-x` project in the solution explorer and select `Set as Startup Project` from the context menu
 10. Click `Local Windows Debugger` to run the example
 
@@ -51,7 +52,7 @@ The Spine cocos2d-x example works on Windows and Mac OS X.
 4. Open a terminal, and `cd` into the `spine-runtimes/spine-cocos2dx` folder
 5. Type `mkdir build && cd build && cmake ../..`. This will download the cocos2d-x dependency and wire it up with the example source code in `spine-runtimes/spine-cocos2dx/example`. The download is 400mb, so get yourself a cup of tea.
 6. Open the Xcode project in `spine-runtimes/spine-cocos2dx/example/proj.ios_mac`
-7. Expand the `cocos2d_libs.xcodeproj` sub project, delete the group `editor-support/spine`. This will remove the 
+7. Expand the `cocos2d_libs.xcodeproj` sub project, delete the group `editor-support/spine`. This will remove the outdated Spine cocos2d-x runtime shipped by cocos2d-x.
 8. Click the `Run` button or type `CMD+R` to run the example
 
 ## Notes

+ 1 - 1
spine-cocos2dx/example/Classes/AppDelegate.h

@@ -41,7 +41,7 @@ public:
 
 	virtual bool applicationDidFinishLaunching ();
 	virtual void applicationDidEnterBackground ();
-	virtual void applicationWillEnterForeground ();
+	virtual void applicationWillEnterForeground ();    
 };
 
 #endif // _APPDELEGATE_H_

+ 2 - 2
spine-cocos2dx/example/Classes/RaptorExample.cpp

@@ -30,7 +30,7 @@
  *****************************************************************************/
 
 #include "RaptorExample.h"
-#include "BatchingExample.h"
+#include "TankExample.h"
 
 USING_NS_CC;
 using namespace spine;
@@ -61,7 +61,7 @@ bool RaptorExample::init () {
 		else if (skeletonNode->getTimeScale() == 1)
 			skeletonNode->setTimeScale(0.3f);
 		else
-			Director::getInstance()->replaceScene(BatchingExample::scene());
+			Director::getInstance()->replaceScene(TankExample::scene());
 		return true;
 	};
 	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

+ 68 - 0
spine-cocos2dx/example/Classes/TankExample.cpp

@@ -0,0 +1,68 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ * 
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#include "TankExample.h"
+#include "BatchingExample.h"
+
+USING_NS_CC;
+using namespace spine;
+
+Scene* TankExample::scene () {
+	Scene *scene = Scene::create();
+	scene->addChild(TankExample::create());
+	return scene;
+}
+
+bool TankExample::init () {
+	if (!LayerColor::initWithColor(Color4B(128, 128, 128, 255))) return false;
+
+	skeletonNode = SkeletonAnimation::createWithFile("tank.json", "tank.atlas", 0.5f);
+	skeletonNode->setAnimation(0, "drive", true);
+
+	skeletonNode->setPosition(Vec2(_contentSize.width / 2 + 400, 20));
+	addChild(skeletonNode);
+
+	scheduleUpdate();
+	
+	EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
+	listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
+		if (!skeletonNode->getDebugBonesEnabled())
+			skeletonNode->setDebugBonesEnabled(true);
+		else if (skeletonNode->getTimeScale() == 1)
+			skeletonNode->setTimeScale(0.3f);
+		else
+			Director::getInstance()->replaceScene(BatchingExample::scene());
+		return true;
+	};
+	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
+
+	return true;
+}

+ 50 - 0
spine-cocos2dx/example/Classes/TankExample.h

@@ -0,0 +1,50 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.3
+ * 
+ * Copyright (c) 2013-2015, 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 (the "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 otherwise create derivative works, improvements of the
+ * Software or develop new applications using the Software 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; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) 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.
+ *****************************************************************************/
+
+#ifndef _TANKEXAMPLE_H_
+#define _TANKEXAMPLE_H_
+
+#include "cocos2d.h"
+#include <spine/spine-cocos2dx.h>
+
+class TankExample : public cocos2d::LayerColor {
+public:
+	static cocos2d::Scene* scene ();
+
+	CREATE_FUNC(TankExample);
+
+	virtual bool init ();
+
+private:
+	spine::SkeletonAnimation* skeletonNode;
+};
+
+#endif // _TANKEXAMPLE_H_

+ 293 - 0
spine-cocos2dx/example/Resources/common/goblins-mesh.atlas

@@ -0,0 +1,293 @@
+
+goblins-mesh.png
+size: 512,512
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+dagger
+  rotate: false
+  xy: 26, 147
+  size: 26, 108
+  orig: 26, 108
+  offset: 0, 0
+  index: -1
+goblin/eyes-closed
+  rotate: false
+  xy: 329, 334
+  size: 34, 12
+  orig: 34, 12
+  offset: 0, 0
+  index: -1
+goblin/head
+  rotate: false
+  xy: 26, 355
+  size: 103, 66
+  orig: 103, 66
+  offset: 0, 0
+  index: -1
+goblin/left-arm
+  rotate: false
+  xy: 54, 142
+  size: 37, 35
+  orig: 37, 35
+  offset: 0, 0
+  index: -1
+goblin/left-foot
+  rotate: true
+  xy: 2, 69
+  size: 65, 31
+  orig: 65, 31
+  offset: 0, 0
+  index: -1
+goblin/left-hand
+  rotate: false
+  xy: 266, 332
+  size: 36, 41
+  orig: 36, 41
+  offset: 0, 0
+  index: -1
+goblin/left-lower-leg
+  rotate: true
+  xy: 273, 433
+  size: 33, 70
+  orig: 33, 70
+  offset: 0, 0
+  index: -1
+goblin/left-shoulder
+  rotate: false
+  xy: 305, 288
+  size: 29, 44
+  orig: 29, 44
+  offset: 0, 0
+  index: -1
+goblin/left-upper-leg
+  rotate: false
+  xy: 96, 280
+  size: 33, 73
+  orig: 33, 73
+  offset: 0, 0
+  index: -1
+goblin/neck
+  rotate: false
+  xy: 267, 289
+  size: 36, 41
+  orig: 36, 41
+  offset: 0, 0
+  index: -1
+goblin/pelvis
+  rotate: false
+  xy: 131, 363
+  size: 62, 43
+  orig: 62, 43
+  offset: 0, 0
+  index: -1
+goblin/right-arm
+  rotate: false
+  xy: 304, 334
+  size: 23, 50
+  orig: 23, 50
+  offset: 0, 0
+  index: -1
+goblin/right-foot
+  rotate: false
+  xy: 201, 397
+  size: 63, 33
+  orig: 63, 33
+  offset: 0, 0
+  index: -1
+goblin/right-hand
+  rotate: false
+  xy: 336, 295
+  size: 36, 37
+  orig: 36, 37
+  offset: 0, 0
+  index: -1
+goblin/right-lower-leg
+  rotate: true
+  xy: 273, 468
+  size: 36, 76
+  orig: 36, 76
+  offset: 0, 0
+  index: -1
+goblin/right-shoulder
+  rotate: false
+  xy: 196, 285
+  size: 39, 45
+  orig: 39, 45
+  offset: 0, 0
+  index: -1
+goblin/right-upper-leg
+  rotate: true
+  xy: 131, 282
+  size: 34, 63
+  orig: 34, 63
+  offset: 0, 0
+  index: -1
+goblin/torso
+  rotate: false
+  xy: 131, 408
+  size: 68, 96
+  orig: 68, 96
+  offset: 0, 0
+  index: -1
+goblin/undie-straps
+  rotate: true
+  xy: 266, 375
+  size: 55, 19
+  orig: 55, 19
+  offset: 0, 0
+  index: -1
+goblin/undies
+  rotate: false
+  xy: 429, 440
+  size: 36, 29
+  orig: 36, 29
+  offset: 0, 0
+  index: -1
+goblingirl/eyes-closed
+  rotate: false
+  xy: 96, 257
+  size: 37, 21
+  orig: 37, 21
+  offset: 0, 0
+  index: -1
+goblingirl/head
+  rotate: false
+  xy: 26, 423
+  size: 103, 81
+  orig: 103, 81
+  offset: 0, 0
+  index: -1
+goblingirl/left-arm
+  rotate: false
+  xy: 390, 434
+  size: 37, 35
+  orig: 37, 35
+  offset: 0, 0
+  index: -1
+goblingirl/left-foot
+  rotate: true
+  xy: 2, 2
+  size: 65, 31
+  orig: 65, 31
+  offset: 0, 0
+  index: -1
+goblingirl/left-hand
+  rotate: false
+  xy: 329, 348
+  size: 35, 40
+  orig: 35, 40
+  offset: 0, 0
+  index: -1
+goblingirl/left-lower-leg
+  rotate: true
+  xy: 351, 471
+  size: 33, 70
+  orig: 33, 70
+  offset: 0, 0
+  index: -1
+goblingirl/left-shoulder
+  rotate: false
+  xy: 237, 284
+  size: 28, 46
+  orig: 28, 46
+  offset: 0, 0
+  index: -1
+goblingirl/left-upper-leg
+  rotate: true
+  xy: 423, 471
+  size: 33, 70
+  orig: 33, 70
+  offset: 0, 0
+  index: -1
+goblingirl/neck
+  rotate: false
+  xy: 328, 390
+  size: 35, 41
+  orig: 35, 41
+  offset: 0, 0
+  index: -1
+goblingirl/pelvis
+  rotate: false
+  xy: 131, 318
+  size: 62, 43
+  orig: 62, 43
+  offset: 0, 0
+  index: -1
+goblingirl/right-arm
+  rotate: true
+  xy: 135, 252
+  size: 28, 50
+  orig: 28, 50
+  offset: 0, 0
+  index: -1
+goblingirl/right-foot
+  rotate: true
+  xy: 231, 332
+  size: 63, 33
+  orig: 63, 33
+  offset: 0, 0
+  index: -1
+goblingirl/right-hand
+  rotate: true
+  xy: 351, 433
+  size: 36, 37
+  orig: 36, 37
+  offset: 0, 0
+  index: -1
+goblingirl/right-lower-leg
+  rotate: false
+  xy: 54, 179
+  size: 36, 76
+  orig: 36, 76
+  offset: 0, 0
+  index: -1
+goblingirl/right-shoulder
+  rotate: false
+  xy: 287, 386
+  size: 39, 45
+  orig: 39, 45
+  offset: 0, 0
+  index: -1
+goblingirl/right-upper-leg
+  rotate: false
+  xy: 195, 332
+  size: 34, 63
+  orig: 34, 63
+  offset: 0, 0
+  index: -1
+goblingirl/torso
+  rotate: false
+  xy: 26, 257
+  size: 68, 96
+  orig: 68, 96
+  offset: 0, 0
+  index: -1
+goblingirl/undie-straps
+  rotate: true
+  xy: 92, 200
+  size: 55, 19
+  orig: 55, 19
+  offset: 0, 0
+  index: -1
+goblingirl/undies
+  rotate: true
+  xy: 365, 395
+  size: 36, 29
+  orig: 36, 29
+  offset: 0, 0
+  index: -1
+shield
+  rotate: false
+  xy: 201, 432
+  size: 70, 72
+  orig: 70, 72
+  offset: 0, 0
+  index: -1
+spear
+  rotate: false
+  xy: 2, 136
+  size: 22, 368
+  orig: 22, 368
+  offset: 0, 0
+  index: -1

+ 115 - 114
spine-cocos2dx/example/Resources/common/goblins-mesh.json

@@ -1,26 +1,27 @@
 {
+"skeleton": { "hash": "P7CQ4ImK+tcAICATgSttlZ5HOSM", "spine": "3.3.07", "width": 266.93, "height": 349.6, "images": "./images/" },
 "bones": [
 	{ "name": "root" },
 	{ "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 },
-	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 },
+	{ "name": "torso", "parent": "hip", "length": 85.82, "rotation": 93.92, "x": -6.42, "y": 1.97 },
+	{ "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.51, "x": 81.67, "y": -6.34 },
+	{ "name": "head", "parent": "neck", "length": 68.28, "rotation": -13.92, "x": 20.93, "y": 11.59 },
+	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.04, "y": -20.38 },
+	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.16, "x": 37.85, "y": -2.34 },
+	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "rotation": -89.09, "x": 14.45, "y": 2.81 },
+	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "rotation": -16.65, "x": 56.34, "y": 0.98 },
+	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 },
+	{ "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.07 },
 	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 },
-	{ "name": "right upper leg", "parent": "hip", "length": 42.45, "x": -20.07, "y": -6.83, "rotation": -97.49 },
-	{ "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 93.92 },
-	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "x": 56.34, "y": 0.98, "rotation": -16.65 },
-	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "x": 74.04, "y": -20.38, "rotation": -156.96 },
-	{ "name": "neck", "parent": "torso", "length": 18.38, "x": 81.67, "y": -6.34, "rotation": -1.51 },
-	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 42.99, "y": -0.61, "rotation": -14.34 },
-	{ "name": "right shoulder", "parent": "torso", "length": 37.24, "x": 76.02, "y": 18.14, "rotation": 133.88 },
-	{ "name": "head", "parent": "neck", "length": 68.28, "x": 20.93, "y": 11.59, "rotation": -13.92 },
-	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 37.85, "y": -2.34, "rotation": 28.16 },
-	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 58.94, "y": -7.61, "rotation": 102.43 },
-	{ "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 37.6, "y": 0.31, "rotation": 36.32 },
-	{ "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 },
-	{ "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 },
-	{ "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 },
-	{ "name": "spear1", "parent": "left hand", "length": 65.06, "x": 0.48, "y": 17.03, "rotation": 102.43 },
-	{ "name": "spear2", "parent": "spear1", "length": 61.41, "x": 65.05, "y": 0.04, "rotation": 0.9 },
-	{ "name": "spear3", "parent": "spear2", "length": 76.79, "x": 61.88, "y": 0.57, "rotation": -0.9 }
+	{ "name": "right shoulder", "parent": "torso", "length": 37.24, "rotation": 133.88, "x": 76.02, "y": 18.14 },
+	{ "name": "right arm", "parent": "right shoulder", "length": 36.74, "rotation": 36.32, "x": 37.6, "y": 0.31 },
+	{ "name": "right upper leg", "parent": "hip", "length": 42.45, "rotation": -97.49, "x": -20.07, "y": -6.83 },
+	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "rotation": -14.34, "x": 42.99, "y": -0.61 },
+	{ "name": "right foot", "parent": "right lower leg", "length": 45.45, "rotation": 110.3, "x": 64.88, "y": 0.04 },
+	{ "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.35, "x": 36.9, "y": 0.34 },
+	{ "name": "spear1", "parent": "left hand", "length": 65.06, "rotation": 102.43, "x": 0.48, "y": 17.03 },
+	{ "name": "spear2", "parent": "spear1", "length": 61.41, "rotation": 0.9, "x": 65.05, "y": 0.04 },
+	{ "name": "spear3", "parent": "spear2", "length": 76.79, "rotation": -0.9, "x": 61.88, "y": 0.57 }
 ],
 "slots": [
 	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
@@ -52,12 +53,12 @@
 		"left hand item": {
 			"dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 },
 			"spear": {
-				"type": "skinnedmesh",
+				"type": "mesh",
 				"uvs": [ 1, 0.11236, 0.77096, 0.13278, 0.76608, 0.21781, 0.75642, 0.386, 0.74723, 0.54607, 0.72117, 1, 0.28838, 1, 0.24208, 0.54327, 0.22589, 0.38361, 0.2089, 0.21605, 0.20043, 0.13242, 0, 0.11519, 0.4527, 0, 0.58399, 0 ],
-				"triangles": [ 5, 6, 4, 6, 7, 4, 4, 7, 3, 2, 9, 1, 9, 10, 1, 10, 12, 1, 12, 13, 1, 1, 13, 0, 10, 11, 12, 3, 8, 2, 8, 9, 2, 7, 8, 3 ],
-				"vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.51, 20, -0.31, -6.16, 0.48, 2, 18, 64.73, -5.03, 0.5, 19, -0.4, -5.06, 0.49, 1, 16, 4.56, 23.91, 1, 1, 16, 41.7, -138.95, 1, 1, 16, 32.42, -141.1, 1, 1, 16, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.5, 19, 0.53, 6.59, 0.49, 2, 19, 62.18, 6.66, 0.51, 20, 0.2, 6.09, 0.48, 1, 20, 30.96, 6.61, 1, 1, 20, 37.26, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ],
-				"edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ],
+				"triangles": [ 4, 7, 3, 6, 7, 4, 5, 6, 4, 10, 11, 12, 1, 13, 0, 12, 13, 1, 10, 12, 1, 9, 10, 1, 2, 9, 1, 8, 9, 2, 3, 8, 2, 7, 8, 3 ],
+				"vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.5116, 20, -0.31, -6.16, 0.48839, 2, 18, 64.73, -5.03, 0.50272, 19, -0.4, -5.06, 0.49728, 1, 10, 4.56, 23.91, 1, 1, 10, 41.7, -138.95, 1, 1, 10, 32.41999, -141.1, 1, 1, 10, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.50272, 19, 0.52999, 6.59, 0.49728, 2, 19, 62.18, 6.66, 0.5116, 20, 0.2, 6.09, 0.48839, 1, 20, 30.96, 6.61, 1, 1, 20, 37.25999, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ],
 				"hull": 14,
+				"edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ],
 				"width": 22,
 				"height": 368
 			}
@@ -68,8 +69,8 @@
 				"uvs": [ 0.78091, 0.38453, 1, 0.38405, 1, 0.44881, 0.73953, 0.4687, 0.74641, 0.81344, 0.34022, 1, 0.15434, 1, 0.11303, 0.78858, 0.23007, 0.47367, 0, 0.45047, 0, 0.38621, 0.22367, 0.38573, 0.24384, 0, 1, 0 ],
 				"triangles": [ 0, 12, 13, 11, 12, 0, 0, 1, 2, 9, 10, 11, 3, 11, 0, 3, 0, 2, 8, 11, 3, 9, 11, 8, 5, 6, 7, 4, 5, 8, 4, 8, 3, 5, 7, 8 ],
 				"vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 26.93, 27.49 ],
-				"edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ],
 				"hull": 14,
+				"edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ],
 				"width": 26,
 				"height": 108
 			}
@@ -87,10 +88,10 @@
 				"name": "goblin/head",
 				"type": "mesh",
 				"uvs": [ 0, 0.60494, 0.14172, 0.5145, 0.24218, 0.55229, 0.32667, 0.67806, 0.37969, 0.79352, 0.53505, 0.93014, 0.86056, 1, 0.94071, 0.94169, 0.92098, 0.69923, 0.9888, 0.65497, 0.99003, 0.51643, 0.89632, 0.43561, 0.94487, 0.41916, 1, 0.39713, 1, 0.2836, 0.94017, 0.27027, 0.87906, 0.25666, 0.80754, 0.16044, 0.66698, 0.01997, 0.4734, 0.01805, 0.29215, 0.19893, 0.25392, 0.31823, 0.09117, 0.324, 0, 0.44331, 0.43271, 0.69153, 0.466, 0.47794, 0.35996, 0.31246, 0.73473, 0.68593, 0.72215, 0.57425, 0.88179, 0.5583, 0.80267, 0.51015 ],
-				"triangles": [ 26, 20, 19, 21, 20, 26, 15, 14, 13, 12, 15, 13, 11, 16, 15, 11, 15, 12, 26, 17, 25, 18, 26, 19, 17, 26, 18, 30, 25, 17, 30, 17, 16, 30, 16, 11, 1, 22, 21, 23, 22, 1, 2, 1, 21, 2, 21, 26, 29, 30, 11, 29, 11, 10, 28, 25, 30, 0, 23, 1, 9, 29, 10, 25, 3, 2, 25, 2, 26, 29, 27, 28, 29, 28, 30, 24, 3, 25, 24, 25, 28, 24, 28, 27, 8, 29, 9, 27, 29, 8, 4, 3, 24, 5, 24, 27, 4, 24, 5, 7, 6, 27, 7, 27, 8, 5, 27, 6 ],
-				"vertices": [ 14.56, 50.42, 23.12, 35.47, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 35.89, 40.17, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 17.2, -40.65, 20.68, -33.02 ],
-				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ],
+				"triangles": [ 5, 27, 6, 7, 27, 8, 7, 6, 27, 4, 24, 5, 5, 24, 27, 4, 3, 24, 27, 29, 8, 8, 29, 9, 24, 28, 27, 24, 25, 28, 24, 3, 25, 29, 28, 30, 29, 27, 28, 25, 2, 26, 25, 3, 2, 9, 29, 10, 0, 23, 1, 28, 25, 30, 29, 11, 10, 29, 30, 11, 2, 21, 26, 2, 1, 21, 23, 22, 1, 1, 22, 21, 30, 16, 11, 30, 17, 16, 30, 25, 17, 17, 26, 18, 18, 26, 19, 26, 17, 25, 11, 15, 12, 11, 16, 15, 12, 15, 13, 15, 14, 13, 21, 20, 26, 26, 20, 19 ],
+				"vertices": [ 14.56, 50.42, 23.12, 35.47, 17.45999, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.59999, 23.41, 35.89, 40.16999, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.79999, -24.31, 17.2, -40.65, 20.68, -33.02 ],
 				"hull": 24,
+				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ],
 				"width": 103,
 				"height": 66
 			}
@@ -100,10 +101,10 @@
 				"name": "goblin/left-arm",
 				"type": "mesh",
 				"uvs": [ 0.68992, 0.29284, 1, 0.46364, 1, 0.74643, 0.84089, 1, 0.66344, 1, 0.33765, 0.64284, 0, 0.44124, 0, 0, 0.34295, 0 ],
-				"triangles": [ 6, 7, 8, 5, 6, 8, 0, 5, 8, 0, 1, 2, 5, 0, 2, 4, 5, 2, 3, 4, 2 ],
-				"vertices": [ 18.6, 8.81, 32.19, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ],
-				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ],
+				"triangles": [ 3, 4, 2, 4, 5, 2, 5, 0, 2, 0, 1, 2, 0, 5, 8, 5, 6, 8, 6, 7, 8 ],
+				"vertices": [ 18.6, 8.81, 32.18999, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ],
 				"hull": 9,
+				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ],
 				"width": 37,
 				"height": 35
 			}
@@ -115,8 +116,8 @@
 				"uvs": [ 0.15733, 0.31873, 0.08195, 0.78502, 0.15884, 0.99366, 0.41633, 0.96804, 0.68822, 0.97636, 1, 0.96388, 0.99385, 0.73501, 0.85294, 0.51862, 0.61479, 0.31056, 0.46991, 0, 0.48032, 0.75604, 0.75994, 0.77706 ],
 				"triangles": [ 0, 9, 8, 10, 0, 8, 10, 8, 7, 11, 10, 7, 11, 7, 6, 1, 0, 10, 11, 6, 5, 3, 1, 10, 4, 10, 11, 4, 11, 5, 3, 10, 4, 2, 1, 3 ],
 				"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 37.91, -5.27, 58.12, -3.71, 57.31, 3.34, 47.78, 9.51, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 42.21, 1.16 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ],
 				"hull": 10,
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ],
 				"width": 65,
 				"height": 31
 			}
@@ -127,9 +128,9 @@
 				"type": "mesh",
 				"uvs": [ 0.518, 0.12578, 1, 0.16285, 0.99788, 0.50578, 0.69745, 1, 0.37445, 1, 0, 0.80051, 0, 0.42792, 0.17601, 0, 0.43567, 0 ],
 				"triangles": [ 2, 0, 1, 0, 5, 6, 6, 7, 0, 0, 7, 8, 3, 4, 0, 4, 5, 0, 2, 3, 0 ],
-				"vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.48, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ],
-				"edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ],
+				"vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.47999, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ],
 				"hull": 9,
+				"edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ],
 				"width": 36,
 				"height": 41
 			}
@@ -140,9 +141,9 @@
 				"type": "mesh",
 				"uvs": [ 0.95508, 0.20749, 0.81927, 0.65213, 0.94754, 0.77308, 0.67842, 0.97346, 0.46463, 1, 0.26845, 1, 0.04963, 0.90706, 0.2106, 0.60115, 0.07478, 0.40195, 0.18545, 0, 0.28857, 0 ],
 				"triangles": [ 10, 8, 9, 1, 7, 10, 7, 8, 10, 0, 1, 10, 1, 4, 7, 3, 1, 2, 5, 6, 7, 7, 4, 5, 1, 3, 4 ],
-				"vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.19, -18.29 ],
-				"edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ],
+				"vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.18999, -18.29 ],
 				"hull": 11,
+				"edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ],
 				"width": 33,
 				"height": 70
 			}
@@ -152,10 +153,10 @@
 				"name": "goblin/left-shoulder",
 				"type": "mesh",
 				"uvs": [ 0.7377, 0.40692, 1, 0.75237, 1, 1, 0.62046, 1, 0.26184, 0.56601, 0, 0.29783, 0, 0, 0.44115, 0 ],
-				"triangles": [ 5, 6, 7, 4, 5, 7, 4, 7, 0, 3, 4, 0, 3, 0, 1, 3, 1, 2 ],
-				"vertices": [ 15.18, 5.74, 32.17, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.74, -4.66, 6.54 ],
-				"edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ],
+				"triangles": [ 3, 1, 2, 3, 0, 1, 3, 4, 0, 4, 7, 0, 4, 5, 7, 5, 6, 7 ],
+				"vertices": [ 15.18, 5.74, 32.16999, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.73999, -4.66, 6.54 ],
 				"hull": 8,
+				"edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ],
 				"width": 29,
 				"height": 44
 			}
@@ -167,8 +168,8 @@
 				"uvs": [ 1, 0.12167, 1, 0.54873, 0.91067, 0.78907, 0.76567, 1, 0.3087, 0.9579, 0, 0.68777, 0, 0.219, 0.51961, 0, 0.87552, 0 ],
 				"triangles": [ 7, 8, 0, 5, 6, 7, 0, 1, 7, 4, 5, 7, 1, 4, 7, 2, 4, 1, 3, 4, 2 ],
 				"vertices": [ 2.33, 13.06, 33.5, 12.57, 51, 9.34, 66.32, 4.31, 63, -10.71, 43.13, -20.58, 8.91, -20.04, -6.79, -2.64, -6.61, 9.1 ],
-				"edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ],
 				"hull": 9,
+				"edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ],
 				"width": 33,
 				"height": 73
 			}
@@ -178,10 +179,10 @@
 				"name": "goblin/neck",
 				"type": "mesh",
 				"uvs": [ 0.81967, 0.27365, 0.92101, 0.82048, 0.47134, 1, 0.15679, 0.9354, 0, 0.7556, 0.19268, 0.51833, 0.15468, 0.35706, 0, 0.21989, 0.13568, 0, 0.68878, 0, 0.70145, 0.53872 ],
-				"triangles": [ 6, 8, 9, 6, 9, 0, 7, 8, 6, 10, 5, 6, 0, 10, 6, 10, 0, 1, 3, 4, 5, 2, 5, 10, 2, 10, 1, 3, 5, 2 ],
-				"vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.05, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ],
-				"edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ],
+				"triangles": [ 3, 5, 2, 2, 10, 1, 2, 5, 10, 3, 4, 5, 10, 0, 1, 0, 10, 6, 10, 5, 6, 7, 8, 6, 6, 9, 0, 6, 8, 9 ],
+				"vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.04999, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ],
 				"hull": 10,
+				"edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ],
 				"width": 36,
 				"height": 41
 			}
@@ -193,8 +194,8 @@
 				"uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ],
 				"triangles": [ 1, 2, 3, 1, 3, 0 ],
 				"vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 25.38, 22.26 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ],
 				"hull": 4,
+				"edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ],
 				"width": 62,
 				"height": 43
 			}
@@ -204,10 +205,10 @@
 				"name": "goblin/right-arm",
 				"type": "mesh",
 				"uvs": [ 1, 0.09223, 1, 0.8501, 0.72058, 1, 0.24384, 1, 0, 0.86558, 0.20822, 0.10919, 0.50903, 0, 0.85342, 0 ],
-				"triangles": [ 6, 7, 0, 2, 3, 5, 4, 5, 3, 1, 6, 0, 6, 2, 5, 1, 2, 6 ],
-				"vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.18 ],
-				"edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ],
+				"triangles": [ 1, 2, 6, 6, 2, 5, 1, 6, 0, 4, 5, 3, 2, 3, 5, 6, 7, 0 ],
+				"vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.17999 ],
 				"hull": 8,
+				"edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ],
 				"width": 23,
 				"height": 50
 			}
@@ -219,8 +220,8 @@
 				"uvs": [ 0.40851, 0.0047, 0.59087, 0.33404, 0.75959, 0.48311, 0.88907, 0.59751, 0.97532, 0.89391, 0.90385, 1, 0.6722, 1, 0.38633, 1, 0.08074, 1, 0, 0.88921, 0, 0.65984, 0, 0.46577, 0.0906, 0.0988, 0.305, 0, 0.47461, 0.71257, 0.715, 0.74681 ],
 				"triangles": [ 1, 10, 11, 1, 13, 0, 14, 1, 2, 1, 12, 13, 12, 1, 11, 14, 10, 1, 15, 14, 2, 15, 2, 3, 9, 10, 14, 15, 3, 4, 7, 8, 9, 14, 7, 9, 6, 14, 15, 5, 6, 15, 7, 14, 6, 4, 5, 15 ],
 				"vertices": [ 17.36, 25.99, 29.13, 15.44, 39.89, 10.8, 48.14, 7.24, 53.84, -2.38, 49.43, -6, 34.84, -6.39, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 37.31, 2.03 ],
-				"edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ],
 				"hull": 14,
+				"edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ],
 				"width": 63,
 				"height": 33
 			}
@@ -231,9 +232,9 @@
 				"type": "mesh",
 				"uvs": [ 0.17957, 0, 0, 0.44772, 0, 0.79734, 0.20057, 0.94264, 0.55057, 1, 0.8539, 1, 0.89823, 0.82004, 0.8259, 0.74285, 0.84223, 0.49993, 0.96356, 0.34102, 0.66023, 0 ],
 				"triangles": [ 8, 10, 9, 0, 10, 1, 8, 2, 1, 8, 1, 10, 7, 3, 8, 3, 2, 8, 4, 3, 7, 5, 7, 6, 4, 7, 5 ],
-				"vertices": [ -10.82, -9.45, 5.95, -15.34, 18.88, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ],
+				"vertices": [ -10.82, -9.45, 5.95, -15.34, 18.87999, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ],
 				"hull": 11,
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ],
 				"width": 36,
 				"height": 37
 			}
@@ -245,8 +246,8 @@
 				"uvs": [ 0.88538, 0.22262, 0.76167, 0.3594, 0.75088, 0.78308, 0.95326, 0.84981, 1, 0.60302 ],
 				"triangles": [ 1, 0, 4, 2, 1, 4, 3, 2, 4 ],
 				"vertices": [ -2.82, 15.97, 2.4, 11.71, 18.08, 11.9, 20.27, 19.27, 11.09, 20.62 ],
-				"edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ],
 				"hull": 5,
+				"edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ],
 				"width": 36,
 				"height": 37
 			}
@@ -257,9 +258,9 @@
 				"type": "mesh",
 				"uvs": [ 1, 0.27261, 0.81312, 0.52592, 0.79587, 0.71795, 0.95544, 0.80988, 0.85193, 0.95493, 0.47241, 1, 0.14033, 1, 0, 0.8773, 0.14896, 0.67914, 0.1619, 0.30325, 0.60611, 0 ],
 				"triangles": [ 1, 10, 0, 9, 10, 1, 8, 9, 1, 2, 8, 1, 4, 2, 3, 6, 7, 8, 5, 6, 8, 2, 5, 8, 4, 5, 2 ],
-				"vertices": [ 6.26, 8.46, 23.32, 8.04, 37.1, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.77, -1.03, 58.99, -9.19, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ],
+				"vertices": [ 6.26, 8.46, 23.32, 8.04, 37.09999, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.76999, -1.03, 58.99, -9.18999, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ],
 				"hull": 11,
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ],
 				"width": 36,
 				"height": 76
 			}
@@ -269,10 +270,10 @@
 				"name": "goblin/right-shoulder",
 				"type": "mesh",
 				"uvs": [ 0.62008, 0.03708, 0.92131, 0.09048, 1, 0.38319, 0.72049, 0.6937, 0.31656, 1, 0, 1, 0, 0.75106, 0.28233, 0.49988 ],
-				"triangles": [ 2, 3, 0, 2, 0, 1, 7, 0, 3, 4, 5, 6, 4, 7, 3, 4, 6, 7 ],
+				"triangles": [ 4, 6, 7, 4, 7, 3, 4, 5, 6, 7, 0, 3, 2, 0, 1, 2, 3, 0 ],
 				"vertices": [ -3.17, -11.05, -9, -0.57, -1.01, 10.33, 16.69, 11.17, 37.41, 8.2, 45.45, -1.16, 36.95, -8.46, 21.2, -7.47 ],
-				"edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ],
 				"hull": 8,
+				"edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ],
 				"width": 39,
 				"height": 45
 			}
@@ -283,9 +284,9 @@
 				"type": "mesh",
 				"uvs": [ 0.27018, 0, 0.11618, 0.18177, 0, 0.70688, 0, 0.89577, 0.26668, 1, 0.48718, 1, 0.67618, 0.83532, 1, 0.5161, 1, 0.25543, 0.74618, 0.0571 ],
 				"triangles": [ 9, 8, 7, 9, 1, 0, 6, 9, 7, 6, 1, 9, 2, 1, 6, 4, 3, 2, 6, 4, 2, 5, 4, 6 ],
-				"vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 19.13, 18.47, 2.85, 16.32, -8.4, 6.14 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ],
+				"vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.50999, 10.18, 19.12999, 18.46999, 2.85, 16.32, -8.39999, 6.14 ],
 				"hull": 10,
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ],
 				"width": 34,
 				"height": 63
 			}
@@ -295,10 +296,10 @@
 				"name": "goblin/torso",
 				"type": "mesh",
 				"uvs": [ 0, 0.33287, 0.15945, 0.46488, 0.15761, 0.60314, 0.15502, 0.79806, 0.32807, 0.93478, 0.6875, 1, 0.80731, 1, 1, 0.77763, 1, 0.66147, 1, 0.56703, 0.93207, 0.4771, 0.86944, 0.39416, 0.83837, 0.226, 0.68085, 0, 0.14836, 0, 0, 0.07199, 0.78734, 0.86249, 0.43679, 0.79649, 0.76738, 0.61733, 0.44345, 0.58747, 0.54329, 0.38316, 0.77692, 0.73446, 0.66478, 0.51012 ],
-				"triangles": [ 0, 15, 14, 20, 14, 13, 20, 13, 12, 1, 0, 14, 20, 12, 11, 20, 1, 14, 22, 20, 11, 22, 11, 10, 19, 1, 20, 19, 20, 22, 2, 1, 19, 18, 22, 10, 18, 10, 9, 19, 22, 18, 18, 9, 8, 21, 18, 8, 21, 8, 7, 17, 2, 19, 21, 17, 19, 21, 19, 18, 3, 2, 17, 16, 21, 7, 17, 21, 16, 4, 3, 17, 5, 17, 16, 4, 17, 5, 6, 16, 7, 5, 16, 6 ],
-				"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ],
-				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ],
+				"triangles": [ 5, 16, 6, 6, 16, 7, 4, 17, 5, 5, 17, 16, 4, 3, 17, 17, 21, 16, 16, 21, 7, 3, 2, 17, 21, 19, 18, 21, 17, 19, 17, 2, 19, 21, 8, 7, 21, 18, 8, 18, 9, 8, 19, 22, 18, 18, 10, 9, 18, 22, 10, 2, 1, 19, 19, 20, 22, 19, 1, 20, 22, 11, 10, 22, 20, 11, 20, 1, 14, 20, 12, 11, 1, 0, 14, 20, 13, 12, 20, 14, 13, 0, 15, 14 ],
+				"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.87999, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ],
 				"hull": 16,
+				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ],
 				"width": 68,
 				"height": 96
 			}
@@ -309,9 +310,9 @@
 				"type": "mesh",
 				"uvs": [ 0.36097, 0.44959, 0.66297, 0.60591, 1, 0.19486, 1, 0.57117, 0.75897, 1, 0.38697, 1, 0, 0.26433, 0, 0, 0.12497, 0 ],
 				"triangles": [ 6, 7, 8, 6, 8, 0, 3, 1, 2, 5, 0, 1, 6, 0, 5, 4, 1, 3, 5, 1, 4 ],
-				"vertices": [ -10.56, 12.87, 6.53, 9.9, 25.62, 17.71, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ],
-				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ],
+				"vertices": [ -10.56, 12.87, 6.53, 9.89999, 25.62, 17.70999, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ],
 				"hull": 9,
+				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ],
 				"width": 55,
 				"height": 19
 			}
@@ -322,9 +323,9 @@
 				"type": "mesh",
 				"uvs": [ 0, 0.32029, 0.14893, 0.59457, 0.22437, 1, 0.35909, 1, 0.50998, 1, 0.79559, 0.58453, 0.9842, 0.28015, 1, 0.00588, 0.46957, 0.17646, 0, 0.03933, 0.48843, 0.59122, 0.48114, 0.43099 ],
 				"triangles": [ 6, 8, 7, 0, 9, 8, 11, 8, 6, 0, 8, 11, 5, 11, 6, 10, 11, 5, 1, 0, 11, 1, 11, 10, 3, 2, 1, 10, 3, 1, 4, 10, 5, 3, 10, 4 ],
-				"vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.59, 22.22, 6.11, 22.92, 14.05, 3.75, 9.44, -13.08, 13.71, 4.21, -2.59, 4.03, 2.05 ],
-				"edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ],
+				"vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.58999, 22.22, 6.11, 22.92, 14.05, 3.75, 9.43999, -13.08, 13.71, 4.21, -2.58999, 4.03, 2.05 ],
 				"hull": 10,
+				"edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ],
 				"width": 36,
 				"height": 29
 			}
@@ -757,7 +758,7 @@
 				]
 			}
 		},
-		"ffd": {
+		"deform": {
 			"default": {
 				"left hand item": {
 					"spear": [
@@ -769,19 +770,19 @@
 						{
 							"time": 0,
 							"offset": 26,
-							"vertices": [ 2.34, 0.14 ],
+							"vertices": [ 2.34754, 0.14469 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{
 							"time": 0.5,
 							"offset": 8,
-							"vertices": [ -1.19, 4.31, 0.07, 6.41, 1.66, 6.18, 1.75, 3.59 ],
+							"vertices": [ -1.19415, 4.31531, 0.07279, 6.41351, 1.66048, 6.18882, 1.75232, 3.59555 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{
 							"time": 1,
 							"offset": 26,
-							"vertices": [ 2.34, 0.14 ]
+							"vertices": [ 2.34754, 0.14469 ]
 						}
 					]
 				}
@@ -795,22 +796,22 @@
 						},
 						{
 							"time": 0.2,
-							"vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08, -1.08, 0.08, -1.08, 0.08, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08 ],
+							"vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391, -1.08534, 0.08391, -1.08534, 0.08391, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{
 							"time": 0.3666,
-							"vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09, 1.47, 0.09, 1.47, 0.09, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09 ],
+							"vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017, 1.47305, 0.09017, 1.47305, 0.09017, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017 ],
 							"curve": [ 0.621, 0, 0.75, 1 ]
 						},
 						{
 							"time": 0.7,
-							"vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17, -1.17, -0.17, -1.17, -0.17, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17 ],
+							"vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183, -1.1755, -0.17182, -1.1755, -0.17183, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{
 							"time": 0.8666,
-							"vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08, 0.38, 0.08, 0.38, 0.08, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08 ],
+							"vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446, 0.38687, 0.08446, 0.38687, 0.08446, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446 ],
 							"curve": [ 0.25, 0, 0.75, 1 ]
 						},
 						{ "time": 1 }
@@ -821,35 +822,35 @@
 						{
 							"time": 0,
 							"offset": 8,
-							"vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ]
+							"vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ]
 						},
 						{ "time": 0.1333 },
 						{
 							"time": 0.2333,
 							"offset": 8,
-							"vertices": [ -3.96, -2.34, -5.8, -12.47, -2.23, -12.99, 2.02, -9.1, 0, 0, 0, 0, 0, 0, -1.35, -5.28 ]
+							"vertices": [ -3.96072, -2.34594, -5.80445, -12.47629, -2.23129, -12.99037, 2.02941, -9.1036, 0, 0, 0, 0, 0, 0, -1.35254, -5.2883 ]
 						},
 						{
 							"time": 0.3666,
 							"offset": 8,
-							"vertices": [ 0.66, 0.33, 0.33, 2.69, -0.48, 2.54, -1.13, 1.38, 0, 0, 0, 0, 0, 0, -0.11, 0.79 ]
+							"vertices": [ 0.66504, 0.33548, 0.33902, 2.69014, -0.4817, 2.54524, -1.13592, 1.38562, 0, 0, 0, 0, 0, 0, -0.11907, 0.79273 ]
 						},
 						{ "time": 0.5, "curve": "stepped" },
 						{ "time": 0.6333 },
 						{
 							"time": 0.7333,
 							"offset": 8,
-							"vertices": [ -2.97, 9.4, -6.91, 19.92, -10.55, 18.41, -12.37, 12.38, -4.72, 6.3, 0, 0, -1.48, 4.88, -7.06, 10.7 ]
+							"vertices": [ -2.97737, 9.40254, -6.91661, 19.92794, -10.55287, 18.41085, -12.37161, 12.38473, -4.72606, 6.30798, 0, 0, -1.48902, 4.88944, -7.06773, 10.70101 ]
 						},
 						{
 							"time": 0.8333,
 							"offset": 6,
-							"vertices": [ 1.05, 1.56, -2.52, 7.99, -5.52, 17.14, -8.93, 15.79, -10.73, 10.22, -4.23, 5.36, 0, 0, 0, 0, -5.83, 8.55 ]
+							"vertices": [ 1.05318, 1.56361, -2.52722, 7.9974, -5.5203, 17.14136, -8.93317, 15.79635, -10.73747, 10.22055, -4.23801, 5.36992, 0, 0, 0, 0, -5.83147, 8.55531 ]
 						},
 						{
 							"time": 1,
 							"offset": 8,
-							"vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ]
+							"vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ]
 						}
 					]
 				},
@@ -859,22 +860,22 @@
 						{
 							"time": 0.1333,
 							"offset": 6,
-							"vertices": [ -0.68, -4.13 ]
+							"vertices": [ -0.68989, -4.13283 ]
 						},
 						{
 							"time": 0.3333,
 							"offset": 6,
-							"vertices": [ -1.04, -3.1 ]
+							"vertices": [ -1.04945, -3.10476 ]
 						},
 						{
 							"time": 0.7,
 							"offset": 6,
-							"vertices": [ -1.42, -6.3 ]
+							"vertices": [ -1.4245, -6.30616 ]
 						},
 						{
 							"time": 0.8666,
 							"offset": 6,
-							"vertices": [ -1.13, -1.79 ]
+							"vertices": [ -1.13541, -1.79035 ]
 						},
 						{ "time": 1 }
 					]
@@ -885,38 +886,38 @@
 						{
 							"time": 0.1333,
 							"offset": 2,
-							"vertices": [ -2.81, 2.63, -2.35, 3.89, -1.99, 4.86, -0.93, 5.57, -0.48, 5.09, -0.34, 3.42, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31, 1.91, -1.32, 3.65 ]
+							"vertices": [ -2.81258, 2.63114, -2.35238, 3.89441, -1.99921, 4.8639, -0.93273, 5.57982, -0.48886, 5.09854, -0.34812, 3.42912, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31305, 1.91371, -1.32986, 3.65703 ]
 						},
 						{
 							"time": 0.2333,
 							"offset": 2,
-							"vertices": [ -6.39, 6.41, -7.74, 8.27, -7.02, 11.35, -4.03, 13.93, -2.5, 12.62, -1.46, 7.58, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84, 2.61, -4.53, 7.92 ]
+							"vertices": [ -6.39088, 6.41245, -7.74575, 8.27191, -7.02471, 11.35894, -4.0347, 13.93454, -2.50399, 12.62962, -1.46124, 7.58915, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84765, 2.61215, -4.53955, 7.92357 ]
 						},
 						{
 							"time": 0.3,
 							"offset": 2,
-							"vertices": [ -8.27, 6.68, -9.29, 10.13, -8.62, 14.71, -4.58, 18.81, -2.2, 17.1, -0.07, 9.9, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94, 2.38, -4.59, 10.01 ]
+							"vertices": [ -8.27184, 6.68821, -9.29764, 10.13797, -8.62231, 14.71339, -4.58629, 18.81939, -2.20304, 17.10709, -0.07794, 9.9046, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94624, 2.38007, -4.59398, 10.01888 ]
 						},
 						{
 							"time": 0.3666,
 							"offset": 2,
-							"vertices": [ -10.47, 9.44, -13.36, 12.4, -14.32, 16.94, -9.24, 23.55, -5.51, 21.51, -1.19, 11.53, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14, 2.29, -6.63, 11.37 ]
+							"vertices": [ -10.47683, 9.44175, -13.36882, 12.40982, -14.32568, 16.94392, -9.24462, 23.55674, -5.51711, 21.51377, -1.19581, 11.53192, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14847, 2.29389, -6.63418, 11.37127 ]
 						},
 						{
 							"time": 0.5,
 							"offset": 2,
-							"vertices": [ -5.42, 4.36, -10.59, 7.04, -11.64, 11.55, -6.19, 20.12, -1.45, 18.05, 4.86, 6.41, 2.81, 0.27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96, 4.94 ]
+							"vertices": [ -5.42473, 4.36854, -10.59004, 7.04468, -11.64251, 11.55845, -6.19665, 20.12805, -1.45497, 18.05411, 4.86619, 6.41678, 2.81462, 0.27601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96412, 4.94829 ]
 						},
 						{ "time": 0.6333 },
 						{
 							"time": 0.7333,
 							"offset": 4,
-							"vertices": [ 1.31, -6.84, -0.87, -12.54, -5.98, -14.08, -7.15, -11.63, -5.67, -4.83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06, -6.93 ]
+							"vertices": [ 1.31462, -6.84099, -0.87905, -12.54479, -5.9851, -14.08367, -7.15892, -11.63193, -5.6792, -4.83544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06163, -6.93844 ]
 						},
 						{
 							"time": 0.8,
 							"offset": 4,
-							"vertices": [ 0.65, -3.42, -0.43, -6.27, -2.99, -7.04, -3.57, -5.81, -2.83, -2.41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79, -1.28, 0, 0, 0, 0, -1.03, -3.46 ]
+							"vertices": [ 0.65731, -3.42049, -0.43952, -6.27239, -2.99255, -7.04183, -3.57946, -5.81596, -2.83959, -2.41772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79687, -1.2802, 0, 0, 0, 0, -1.03081, -3.46922 ]
 						},
 						{ "time": 0.8666 }
 					]
@@ -926,13 +927,13 @@
 						{
 							"time": 0,
 							"offset": 4,
-							"vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ]
+							"vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ]
 						},
 						{ "time": 0.5 },
 						{
 							"time": 1,
 							"offset": 4,
-							"vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ]
+							"vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ]
 						}
 					]
 				},
@@ -942,7 +943,7 @@
 						{
 							"time": 0.6,
 							"offset": 6,
-							"vertices": [ 1.8, -1.56 ]
+							"vertices": [ 1.80396, -1.56552 ]
 						},
 						{ "time": 1 }
 					]
@@ -951,17 +952,17 @@
 					"right upper leg": [
 						{
 							"time": 0,
-							"vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ]
+							"vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ]
 						},
 						{ "time": 0.3333 },
 						{
 							"time": 0.8666,
 							"offset": 14,
-							"vertices": [ 0.13, -2.35, -1.33, -5.99, -1.35, -4.43 ]
+							"vertices": [ 0.13424, -2.35377, -1.33317, -5.99572, -1.35861, -4.43323 ]
 						},
 						{
 							"time": 1,
-							"vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ]
+							"vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ]
 						}
 					]
 				},
@@ -970,37 +971,37 @@
 						{
 							"time": 0,
 							"offset": 14,
-							"vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ]
+							"vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ]
 						},
 						{
 							"time": 0.1333,
 							"offset": 14,
-							"vertices": [ 1.31, -0.59, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ]
+							"vertices": [ 1.31318, -0.59727, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ]
 						},
 						{
 							"time": 0.3,
 							"offset": 14,
-							"vertices": [ 6.03, -3.13, 7.55, -1.38, 6.79, 0.31, 4.23, 1.14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07, -5.16, 0, 0, 4, 0.27, 0, 0, 0, 0, 3.43, -3.52 ]
+							"vertices": [ 6.03761, -3.13561, 7.55475, -1.38111, 6.79747, 0.31171, 4.23503, 1.14012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07575, -5.16824, 0, 0, 4.0041, 0.27245, 0, 0, 0, 0, 3.4376, -3.52286 ]
 						},
 						{
 							"time": 0.5,
 							"offset": 14,
-							"vertices": [ 2.25, -0.87, 2.57, -0.56, 3.17, -0.57, 1.48, 0.99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22, -4.43, 0, 0, 1.48, 0.01, 0, 0, 0, 0, 0.31, -3.28, -1.53, 0.17 ]
+							"vertices": [ 2.25942, -0.87202, 2.575, -0.56861, 3.17112, -0.57003, 1.48704, 0.9924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22451, -4.43862, 0, 0, 1.48691, 0.01586, 0, 0, 0, 0, 0.31388, -3.28095, -1.53797, 0.17803 ]
 						},
 						{
 							"time": 0.6333,
 							"offset": 14,
-							"vertices": [ 0.75, -1.51, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ]
+							"vertices": [ 0.75002, -1.51701, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ]
 						},
 						{
 							"time": 0.8666,
 							"offset": 14,
-							"vertices": [ 0.62, -1.26, 0.38, -2.2, 3.25, -0.5, 2.41, 2.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.66, -3.1, 0, 0, 2.3, -1.15, 0, 0, 0, 0, -0.07, -3.63, -0.93, 0.1 ]
+							"vertices": [ 0.62202, -1.26262, 0.38489, -2.20701, 3.25048, -0.50042, 2.41108, 2.39315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.6639, -3.10099, 0, 0, 2.30655, -1.15196, 0, 0, 0, 0, -0.07676, -3.63497, -0.9321, 0.1079 ]
 						},
 						{
 							"time": 1,
 							"offset": 14,
-							"vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ]
+							"vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ]
 						}
 					]
 				},
@@ -1009,32 +1010,32 @@
 						{
 							"time": 0,
 							"offset": 2,
-							"vertices": [ -1.77, 0.54, -0.96, -1.03, -0.39, -0.24, -1.77, 0.54 ]
+							"vertices": [ -1.77696, 0.54759, -0.96145, -1.03793, -0.39148, -0.24071, -1.77696, 0.54759 ]
 						},
 						{
 							"time": 0.1333,
 							"offset": 2,
-							"vertices": [ -2.25, -1.03, -1.49, -4.23, -0.74, -2.84, -1.9, 0.54 ]
+							"vertices": [ -2.25683, -1.03177, -1.49719, -4.23861, -0.74469, -2.84906, -1.90072, 0.54477 ]
 						},
 						{
 							"time": 0.3333,
 							"offset": 2,
-							"vertices": [ -2.37, -0.05, -0.49, 0.19, -0.9, 1.16, -1.6, 2.7, 0.96, 0.8 ]
+							"vertices": [ -2.37974, -0.05431, -0.49433, 0.19436, -0.90861, 1.16519, -1.60956, 2.70798, 0.96186, 0.80615 ]
 						},
 						{
 							"time": 0.7,
 							"offset": 2,
-							"vertices": [ -0.91, -2.76, -0.62, -3.63, -0.84, -2.26, -2.56, 0.52 ]
+							"vertices": [ -0.91714, -2.76567, -0.62214, -3.63489, -0.8494, -2.26772, -2.56076, 0.5297 ]
 						},
 						{
 							"time": 0.8666,
 							"offset": 2,
-							"vertices": [ -2.56, 0.52, -1.58, 0.32, -1.38, 0.32, -2.56, 0.52 ]
+							"vertices": [ -2.56076, 0.5297, -1.58064, 0.32031, -1.3847, 0.32476, -2.56076, 0.5297 ]
 						},
 						{
 							"time": 1,
 							"offset": 2,
-							"vertices": [ -1.77, 0.54, -0.8, 0.53, -0.8, 0.53, -1.77, 0.54 ]
+							"vertices": [ -1.77696, 0.54759, -0.80128, 0.53413, -0.80128, 0.53413, -1.77696, 0.54759 ]
 						}
 					]
 				},
@@ -1042,35 +1043,35 @@
 					"undies": [
 						{
 							"time": 0,
-							"vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ]
+							"vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ]
 						},
 						{
 							"time": 0.1333,
-							"vertices": [ 0.72, 0.43, 7.2, -0.16, 1.37, 0, 1.37, 0, 1.37, 0, 1.25, 0.04, -0.99, -2.95, -1.37, -3.07, 1.37, 0, 0.35, -0.29, 2.99, -0.07, 3.9, -0.14 ]
+							"vertices": [ 0.72659, 0.43319, 7.20416, -0.1638, 1.37759, 0, 1.37759, 0, 1.37759, 0, 1.25279, 0.0464, -0.99861, -2.95085, -1.37542, -3.07404, 1.37759, 0, 0.35279, -0.29279, 2.99218, -0.07019, 3.90478, -0.14039 ]
 						},
 						{
 							"time": 0.3333,
-							"vertices": [ 1.16, 0, 2.1, -0.23, 0, 0, 0, 0, 0, 0, 2.24, -0.24, -0.43, 0.6, -1.55, 0.48 ]
+							"vertices": [ 1.16999, 0, 2.10599, -0.234, 0, 0, 0, 0, 0, 0, 2.24999, -0.24999, -0.4344, 0.60551, -1.55939, 0.48051 ]
 						},
 						{
 							"time": 0.5333,
-							"vertices": [ 1.16, 0, -0.23, -0.93, -2.92, 0.35, 0, 0, 0, 0, 0.49, -0.24, -0.64, -2.07, -0.64, -2.07 ]
+							"vertices": [ 1.16999, 0, -0.234, -0.93599, -2.92499, 0.35099, 0, 0, 0, 0, 0.49999, -0.24999, -0.64078, -2.07914, -0.64078, -2.07914 ]
 						},
 						{
 							"time": 0.7,
-							"vertices": [ 1.86, -0.11, 4.66, -0.09, -1.76, 0.21, 0, 0, -0.56, 0.32, -1.13, -1.15, -2.19, -3.47, -1.29, -3.47, 0, 0, 0, 0, 1.58, -0.04, 2.65, 0.16 ]
+							"vertices": [ 1.8627, -0.11514, 4.66326, -0.09099, -1.76428, 0.21171, 0, 0, -0.56832, 0.32832, -1.13833, -1.1511, -2.19996, -3.47068, -1.29718, -3.47068, 0, 0, 0, 0, 1.58785, -0.04642, 2.65941, 0.16714 ]
 						},
 						{
 							"time": 0.8333,
-							"vertices": [ 2.41, -0.2, 8.58, 0.58, -0.83, 0.1, 0, 0, -1.02, 0.59, -2.44, -1.87, -1.62, 0, 0, 0, 0, 0, 0, 0, 2.85, -0.08, 4.78, 0.3 ]
+							"vertices": [ 2.41687, -0.20725, 8.58108, 0.585, -0.83571, 0.10028, 0, 0, -1.02299, 0.59098, -2.44899, -1.872, -1.62499, 0, 0, 0, 0, 0, 0, 0, 2.85813, -0.08356, 4.78695, 0.30086 ]
 						},
 						{
 							"time": 0.8666,
-							"vertices": [ 2.01, -0.02, 8.98, 0.44, -0.2, 0.08, 0.45, 0, -0.35, 0.47, -1.84, -1.44, -0.79, 1.26, 0.53, 1.23, 0.45, 0, 0.11, -0.09, 3.28, -0.09, 5.13, 0.19 ]
+							"vertices": [ 2.01969, -0.0214, 8.98545, 0.4446, -0.20937, 0.08022, 0.45919, 0, -0.35919, 0.47279, -1.84159, -1.4488, -0.79153, 1.2642, 0.53285, 1.23981, 0.45919, 0, 0.11759, -0.09759, 3.2839, -0.09025, 5.13115, 0.19388 ]
 						},
 						{
 							"time": 1,
-							"vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ]
+							"vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ]
 						}
 					]
 				}

二進制
spine-cocos2dx/example/Resources/common/goblins-mesh.png


+ 116 - 116
spine-cocos2dx/example/Resources/common/raptor.atlas

@@ -1,251 +1,251 @@
 
 raptor.png
-size: 1022,1022
+size: 2048,2048
 format: RGBA8888
 filter: Linear,Linear
 repeat: none
 back_arm
   rotate: false
-  xy: 410, 545
-  size: 46, 29
-  orig: 46, 29
+  xy: 830, 1093
+  size: 91, 57
+  orig: 91, 57
   offset: 0, 0
   index: -1
 back_bracer
-  rotate: false
-  xy: 540, 548
-  size: 39, 28
-  orig: 39, 28
+  rotate: true
+  xy: 217, 113
+  size: 77, 55
+  orig: 77, 55
   offset: 0, 0
   index: -1
 back_hand
   rotate: true
-  xy: 504, 538
-  size: 36, 34
-  orig: 36, 34
+  xy: 275, 501
+  size: 72, 68
+  orig: 72, 68
   offset: 0, 0
   index: -1
 back_knee
   rotate: false
-  xy: 299, 478
-  size: 49, 67
-  orig: 49, 67
+  xy: 583, 955
+  size: 97, 134
+  orig: 97, 134
   offset: 0, 0
   index: -1
 back_thigh
   rotate: true
-  xy: 140, 247
-  size: 39, 24
-  orig: 39, 24
+  xy: 440, 689
+  size: 78, 47
+  orig: 78, 47
   offset: 0, 0
   index: -1
 eyes_open
   rotate: true
-  xy: 2, 2
-  size: 47, 45
-  orig: 47, 45
+  xy: 495, 848
+  size: 93, 89
+  orig: 93, 89
   offset: 0, 0
   index: -1
 front_arm
   rotate: false
-  xy: 360, 544
-  size: 48, 30
-  orig: 48, 30
+  xy: 2, 5
+  size: 96, 60
+  orig: 96, 60
   offset: 0, 0
   index: -1
 front_bracer
-  rotate: false
-  xy: 538, 578
-  size: 41, 29
-  orig: 41, 29
+  rotate: true
+  xy: 217, 192
+  size: 81, 58
+  orig: 81, 58
   offset: 0, 0
   index: -1
 front_hand
   rotate: false
-  xy: 538, 609
-  size: 41, 38
-  orig: 41, 38
+  xy: 586, 878
+  size: 82, 75
+  orig: 82, 75
   offset: 0, 0
   index: -1
 front_open_hand
-  rotate: false
-  xy: 894, 782
-  size: 43, 44
-  orig: 43, 44
+  rotate: true
+  xy: 495, 760
+  size: 86, 87
+  orig: 86, 87
   offset: 0, 0
   index: -1
 front_thigh
   rotate: false
-  xy: 942, 849
-  size: 57, 29
-  orig: 57, 29
+  xy: 714, 1092
+  size: 114, 58
+  orig: 114, 58
   offset: 0, 0
   index: -1
 gun
   rotate: false
-  xy: 785, 774
-  size: 107, 103
-  orig: 107, 103
+  xy: 2, 67
+  size: 213, 206
+  orig: 213, 206
   offset: 0, 0
   index: -1
 gun_nohand
   rotate: false
-  xy: 614, 703
-  size: 105, 102
-  orig: 105, 102
+  xy: 1563, 1547
+  size: 210, 203
+  orig: 210, 203
   offset: 0, 0
   index: -1
 head
   rotate: false
-  xy: 2, 137
-  size: 136, 149
-  orig: 136, 149
+  xy: 2, 275
+  size: 271, 298
+  orig: 271, 298
   offset: 0, 0
   index: -1
 lower_leg
   rotate: true
-  xy: 780, 699
-  size: 73, 98
-  orig: 73, 98
+  xy: 386, 943
+  size: 146, 195
+  orig: 146, 195
   offset: 0, 0
   index: -1
 mouth_smile
-  rotate: true
-  xy: 49, 2
-  size: 47, 30
-  orig: 47, 30
+  rotate: false
+  xy: 100, 6
+  size: 93, 59
+  orig: 93, 59
   offset: 0, 0
   index: -1
 neck
-  rotate: true
-  xy: 1001, 860
-  size: 18, 21
-  orig: 18, 21
+  rotate: false
+  xy: 1012, 1109
+  size: 36, 41
+  orig: 36, 41
   offset: 0, 0
   index: -1
 raptor_arm_back
   rotate: false
-  xy: 940, 936
-  size: 82, 86
-  orig: 82, 86
+  xy: 330, 769
+  size: 163, 172
+  orig: 163, 172
   offset: 0, 0
   index: -1
 raptor_body
   rotate: false
-  xy: 2, 737
-  size: 610, 285
-  orig: 610, 285
+  xy: 2, 1468
+  size: 1219, 570
+  orig: 1219, 570
   offset: 0, 0
   index: -1
 raptor_front_arm
   rotate: true
-  xy: 195, 464
-  size: 81, 102
-  orig: 81, 102
+  xy: 1223, 1445
+  size: 162, 203
+  orig: 162, 203
   offset: 0, 0
   index: -1
 raptor_front_leg
   rotate: false
-  xy: 2, 478
-  size: 191, 257
-  orig: 191, 257
+  xy: 2, 952
+  size: 382, 514
+  orig: 382, 514
   offset: 0, 0
   index: -1
 raptor_hindleg_back
   rotate: false
-  xy: 614, 807
-  size: 169, 215
-  orig: 169, 215
+  xy: 1223, 1609
+  size: 338, 429
+  orig: 338, 429
   offset: 0, 0
   index: -1
 raptor_horn
   rotate: false
-  xy: 360, 655
-  size: 182, 80
-  orig: 182, 80
+  xy: 714, 1307
+  size: 363, 159
+  orig: 363, 159
   offset: 0, 0
   index: -1
 raptor_horn_back
   rotate: false
-  xy: 360, 576
-  size: 176, 77
-  orig: 176, 77
+  xy: 714, 1152
+  size: 351, 153
+  orig: 351, 153
   offset: 0, 0
   index: -1
 raptor_jaw
   rotate: false
-  xy: 785, 879
-  size: 153, 143
-  orig: 153, 143
+  xy: 1563, 1752
+  size: 305, 286
+  orig: 305, 286
   offset: 0, 0
   index: -1
 raptor_saddle_noshadow
   rotate: false
-  xy: 2, 288
-  size: 163, 188
-  orig: 163, 188
+  xy: 2, 575
+  size: 326, 375
+  orig: 326, 375
   offset: 0, 0
   index: -1
 raptor_saddle_strap_front
-  rotate: false
-  xy: 721, 710
-  size: 57, 95
-  orig: 57, 95
+  rotate: true
+  xy: 1558, 1431
+  size: 114, 189
+  orig: 114, 189
   offset: 0, 0
   index: -1
 raptor_saddle_strap_rear
-  rotate: true
-  xy: 940, 880
-  size: 54, 74
-  orig: 54, 74
+  rotate: false
+  xy: 1079, 1318
+  size: 108, 148
+  orig: 108, 148
   offset: 0, 0
   index: -1
 raptor_saddle_w_shadow
   rotate: false
-  xy: 195, 547
-  size: 163, 188
-  orig: 163, 188
+  xy: 386, 1091
+  size: 326, 375
+  orig: 326, 375
   offset: 0, 0
   index: -1
 raptor_tongue
   rotate: true
-  xy: 544, 649
-  size: 86, 64
-  orig: 86, 64
+  xy: 1428, 1436
+  size: 171, 128
+  orig: 171, 128
   offset: 0, 0
   index: -1
 stirrup_back
   rotate: false
-  xy: 458, 539
-  size: 44, 35
-  orig: 44, 35
+  xy: 923, 1081
+  size: 87, 69
+  orig: 87, 69
   offset: 0, 0
   index: -1
 stirrup_front
-  rotate: true
-  xy: 81, 4
-  size: 45, 50
-  orig: 45, 50
+  rotate: false
+  xy: 1775, 1650
+  size: 89, 100
+  orig: 89, 100
   offset: 0, 0
   index: -1
 stirrup_strap
   rotate: true
-  xy: 894, 828
-  size: 49, 46
-  orig: 49, 46
+  xy: 1775, 1551
+  size: 97, 91
+  orig: 97, 91
   offset: 0, 0
   index: -1
 torso
-  rotate: true
-  xy: 610, 647
-  size: 54, 91
-  orig: 54, 91
+  rotate: false
+  xy: 330, 585
+  size: 108, 182
+  orig: 108, 182
   offset: 0, 0
   index: -1
 visor
-  rotate: false
-  xy: 2, 51
-  size: 131, 84
-  orig: 131, 84
+  rotate: true
+  xy: 1870, 1777
+  size: 261, 168
+  orig: 261, 168
   offset: 0, 0
   index: -1

File diff suppressed because it is too large
+ 219 - 130
spine-cocos2dx/example/Resources/common/raptor.json


二進制
spine-cocos2dx/example/Resources/common/raptor.png


+ 195 - 0
spine-cocos2dx/example/Resources/common/spineboy.atlas

@@ -0,0 +1,195 @@
+
+spineboy.png
+size: 1024,1024
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+eye_indifferent
+  rotate: false
+  xy: 550, 694
+  size: 93, 89
+  orig: 93, 89
+  offset: 0, 0
+  index: -1
+eye_surprised
+  rotate: false
+  xy: 834, 856
+  size: 93, 89
+  orig: 93, 89
+  offset: 0, 0
+  index: -1
+front_bracer
+  rotate: false
+  xy: 678, 774
+  size: 58, 80
+  orig: 58, 80
+  offset: 0, 0
+  index: -1
+front_fist_closed
+  rotate: true
+  xy: 466, 593
+  size: 75, 82
+  orig: 75, 82
+  offset: 0, 0
+  index: -1
+front_fist_open
+  rotate: false
+  xy: 550, 605
+  size: 86, 87
+  orig: 86, 87
+  offset: 0, 0
+  index: -1
+front_foot
+  rotate: false
+  xy: 550, 785
+  size: 126, 69
+  orig: 126, 69
+  offset: 0, 0
+  index: -1
+front_foot_bend1
+  rotate: true
+  xy: 375, 492
+  size: 128, 70
+  orig: 128, 70
+  offset: 0, 0
+  index: -1
+front_foot_bend2
+  rotate: true
+  xy: 275, 330
+  size: 108, 93
+  orig: 108, 93
+  offset: 0, 0
+  index: -1
+front_shin
+  rotate: false
+  xy: 466, 670
+  size: 82, 184
+  orig: 82, 184
+  offset: 0, 0
+  index: -1
+front_thigh
+  rotate: false
+  xy: 214, 208
+  size: 48, 112
+  orig: 48, 112
+  offset: 0, 0
+  index: -1
+front_upper_arm
+  rotate: false
+  xy: 214, 109
+  size: 54, 97
+  orig: 54, 97
+  offset: 0, 0
+  index: -1
+goggles
+  rotate: false
+  xy: 466, 856
+  size: 261, 166
+  orig: 261, 166
+  offset: 0, 0
+  index: -1
+gun
+  rotate: false
+  xy: 2, 117
+  size: 210, 203
+  orig: 210, 203
+  offset: 0, 0
+  index: -1
+head
+  rotate: false
+  xy: 2, 322
+  size: 271, 298
+  orig: 271, 298
+  offset: 0, 0
+  index: -1
+mouth_grind
+  rotate: false
+  xy: 929, 896
+  size: 93, 59
+  orig: 93, 59
+  offset: 0, 0
+  index: -1
+mouth_oooo
+  rotate: false
+  xy: 929, 835
+  size: 93, 59
+  orig: 93, 59
+  offset: 0, 0
+  index: -1
+mouth_smile
+  rotate: false
+  xy: 447, 532
+  size: 93, 59
+  orig: 93, 59
+  offset: 0, 0
+  index: -1
+muzzle
+  rotate: false
+  xy: 2, 622
+  size: 462, 400
+  orig: 462, 400
+  offset: 0, 0
+  index: -1
+neck
+  rotate: false
+  xy: 796, 819
+  size: 36, 41
+  orig: 36, 41
+  offset: 0, 0
+  index: -1
+rear_bracer
+  rotate: false
+  xy: 738, 788
+  size: 56, 72
+  orig: 56, 72
+  offset: 0, 0
+  index: -1
+rear_foot
+  rotate: true
+  xy: 2, 2
+  size: 113, 60
+  orig: 113, 60
+  offset: 0, 0
+  index: -1
+rear_foot_bend1
+  rotate: false
+  xy: 64, 49
+  size: 117, 66
+  orig: 117, 66
+  offset: 0, 0
+  index: -1
+rear_foot_bend2
+  rotate: false
+  xy: 729, 862
+  size: 103, 83
+  orig: 103, 83
+  offset: 0, 0
+  index: -1
+rear_shin
+  rotate: true
+  xy: 729, 947
+  size: 75, 178
+  orig: 75, 178
+  offset: 0, 0
+  index: -1
+rear_thigh
+  rotate: true
+  xy: 909, 957
+  size: 65, 104
+  orig: 65, 104
+  offset: 0, 0
+  index: -1
+rear_upper_arm
+  rotate: true
+  xy: 447, 483
+  size: 47, 87
+  orig: 47, 87
+  offset: 0, 0
+  index: -1
+torso
+  rotate: false
+  xy: 275, 440
+  size: 98, 180
+  orig: 98, 180
+  offset: 0, 0
+  index: -1

+ 31 - 31
spine-cocos2dx/example/Resources/common/spineboy.json

@@ -1,39 +1,31 @@
 {
+"skeleton": { "hash": "rPoYyBLFG6F0CGZ5wsUEBKDJU9U", "spine": "3.3.07", "width": 470.71, "height": 731.57, "images": "./images/" },
 "bones": [
 	{ "name": "hip", "y": 247.47 },
-	{ "name": "front_thigh", "parent": "hip", "length": 74.8, "x": -17.45, "y": -11.64, "rotation": -95.51, "color": "00ff04ff" },
-	{ "name": "rear_thigh", "parent": "hip", "length": 85.71, "x": 8.91, "y": -5.62, "rotation": -72.54, "color": "ff000dff" },
-	{ "name": "torso", "parent": "hip", "length": 127.55, "x": -1.61, "y": 4.9, "rotation": 103.82, "color": "e0da19ff" },
-	{
-		"name": "front_shin",
-		"parent": "front_thigh",
-		"length": 128.76,
-		"x": 78.69,
-		"y": 1.6,
-		"rotation": -2.21,
-		"inheritScale": false,
-		"color": "00ff04ff"
-	},
-	{ "name": "front_upper_arm", "parent": "torso", "length": 69.45, "x": 103.75, "y": 19.32, "rotation": 168.37, "color": "00ff04ff" },
-	{ "name": "neck", "parent": "torso", "length": 25.45, "x": 127.49, "y": -0.3, "rotation": -31.53, "color": "e0da19ff" },
-	{ "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "x": 86.1, "y": -1.32, "rotation": -19.83, "color": "ff000dff" },
-	{ "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "x": 92.35, "y": -19.22, "rotation": -169.55, "color": "ff000dff" },
+	{ "name": "torso", "parent": "hip", "length": 127.55, "rotation": 103.82, "x": -1.61, "y": 4.9, "color": "e0da19ff" },
+	{ "name": "front_upper_arm", "parent": "torso", "length": 69.45, "rotation": 168.37, "x": 103.75, "y": 19.32, "color": "00ff04ff" },
 	{
 		"name": "front_bracer",
 		"parent": "front_upper_arm",
 		"length": 40.57,
+		"rotation": 18.29,
 		"x": 68.8,
 		"y": -0.68,
-		"rotation": 18.29,
 		"color": "00ff04ff"
 	},
-	{ "name": "front_foot", "parent": "front_shin", "length": 91.34, "x": 128.75, "y": -0.33, "rotation": 77.9, "color": "00ff04ff" },
-	{ "name": "head", "parent": "neck", "length": 263.57, "x": 27.66, "y": -0.25, "rotation": 23.18, "color": "e0da19ff" },
-	{ "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "x": 51.35, "rotation": 23.15, "color": "ff000dff" },
-	{ "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "x": 121.45, "y": -0.75, "rotation": 69.3, "color": "ff000dff" },
-	{ "name": "front_fist", "parent": "front_bracer", "length": 65.38, "x": 40.56, "y": 0.19, "rotation": 12.43, "color": "00ff04ff" },
-	{ "name": "gun", "parent": "rear_bracer", "length": 43.1, "x": 34.42, "y": -0.45, "rotation": 5.34, "color": "ff000dff" },
-	{ "name": "gunTip", "parent": "gun", "x": 201.04, "y": 52.13, "rotation": 6.83, "color": "ff000dff" }
+	{ "name": "front_fist", "parent": "front_bracer", "length": 65.38, "rotation": 12.43, "x": 40.56, "y": 0.19, "color": "00ff04ff" },
+	{ "name": "front_thigh", "parent": "hip", "length": 74.8, "rotation": -95.51, "x": -17.45, "y": -11.64, "color": "00ff04ff" },
+	{ "name": "front_shin", "parent": "front_thigh", "length": 128.76, "rotation": -2.21, "x": 78.69, "y": 1.6, "color": "00ff04ff" },
+	{ "name": "front_foot", "parent": "front_shin", "length": 91.34, "rotation": 77.9, "x": 128.75, "y": -0.33, "color": "00ff04ff" },
+	{ "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "rotation": -169.55, "x": 92.35, "y": -19.22, "color": "ff000dff" },
+	{ "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "rotation": 23.15, "x": 51.35, "color": "ff000dff" },
+	{ "name": "gun", "parent": "rear_bracer", "length": 43.1, "rotation": 5.34, "x": 34.42, "y": -0.45, "color": "ff000dff" },
+	{ "name": "gunTip", "parent": "gun", "rotation": 6.83, "x": 201.04, "y": 52.13, "color": "ff000dff" },
+	{ "name": "neck", "parent": "torso", "length": 25.45, "rotation": -31.53, "x": 127.49, "y": -0.3, "color": "e0da19ff" },
+	{ "name": "head", "parent": "neck", "length": 263.57, "rotation": 23.18, "x": 27.66, "y": -0.25, "color": "e0da19ff" },
+	{ "name": "rear_thigh", "parent": "hip", "length": 85.71, "rotation": -72.54, "x": 8.91, "y": -5.62, "color": "ff000dff" },
+	{ "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "rotation": -19.83, "x": 86.1, "y": -1.32, "color": "ff000dff" },
+	{ "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "rotation": 69.3, "x": 121.45, "y": -0.75, "color": "ff000dff" }
 ],
 "slots": [
 	{ "name": "rear_upper_arm", "bone": "rear_upper_arm", "attachment": "rear_upper_arm" },
@@ -54,7 +46,8 @@
 	{ "name": "goggles", "bone": "head", "attachment": "goggles" },
 	{ "name": "front_bracer", "bone": "front_bracer", "attachment": "front_bracer" },
 	{ "name": "front_fist", "bone": "front_fist", "attachment": "front_fist_closed" },
-	{ "name": "muzzle", "bone": "gunTip", "additive": true }
+	{ "name": "muzzle", "bone": "gunTip", "blend": "additive" },
+	{ "name": "head-bb", "bone": "head" }
 ],
 "skins": {
 	"default": {
@@ -92,6 +85,13 @@
 		"head": {
 			"head": { "x": 128.95, "y": 0.29, "rotation": -70.63, "width": 271, "height": 298 }
 		},
+		"head-bb": {
+			"head": {
+				"type": "boundingbox",
+				"vertexCount": 6,
+				"vertices": [ -19.14, -70.3, 40.8, -118.07, 257.77, -115.61, 285.16, 57.18, 120.77, 164.95, -5.06, 76.94 ]
+			}
+		},
 		"mouth": {
 			"mouth_grind": { "x": 23.68, "y": -32.23, "rotation": -70.63, "width": 93, "height": 59 },
 			"mouth_oooo": { "x": 23.68, "y": -32.23, "rotation": -70.63, "width": 93, "height": 59 },
@@ -1825,10 +1825,6 @@
 				]
 			},
 			"muzzle": {
-				"attachment": [
-					{ "time": 0.1333, "name": "muzzle" },
-					{ "time": 0.2666, "name": null }
-				],
 				"color": [
 					{
 						"time": 0.1333,
@@ -1841,6 +1837,10 @@
 						"curve": [ 0.821, 0, 0.909, 0.89 ]
 					},
 					{ "time": 0.2666, "color": "ffffff00" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "muzzle" },
+					{ "time": 0.2666, "name": null }
 				]
 			}
 		},
@@ -2008,7 +2008,7 @@
 				]
 			}
 		},
-		"draworder": [
+		"drawOrder": [
 			{
 				"time": 0.6666,
 				"offsets": [

二進制
spine-cocos2dx/example/Resources/common/spineboy.png


+ 125 - 0
spine-cocos2dx/example/Resources/common/tank.atlas

@@ -0,0 +1,125 @@
+
+tank.png
+size: 2048,2048
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+images/antenna
+  rotate: true
+  xy: 1295, 1730
+  size: 22, 303
+  orig: 22, 303
+  offset: 0, 0
+  index: -1
+images/cannon
+  rotate: true
+  xy: 504, 769
+  size: 931, 58
+  orig: 931, 58
+  offset: 0, 0
+  index: -1
+images/cannonConnector
+  rotate: false
+  xy: 564, 1239
+  size: 112, 135
+  orig: 112, 135
+  offset: 0, 0
+  index: -1
+images/guntower
+  rotate: false
+  xy: 1295, 1754
+  size: 730, 289
+  orig: 730, 289
+  offset: 0, 0
+  index: -1
+images/machinegun
+  rotate: true
+  xy: 504, 436
+  size: 331, 57
+  orig: 331, 57
+  offset: 0, 0
+  index: -1
+images/machinegun-mount
+  rotate: false
+  xy: 2, 2
+  size: 72, 96
+  orig: 72, 96
+  offset: 0, 0
+  index: -1
+images/rock
+  rotate: false
+  xy: 226, 358
+  size: 252, 55
+  orig: 252, 55
+  offset: 0, 0
+  index: -1
+images/tankBottom
+  rotate: true
+  xy: 226, 415
+  size: 1285, 276
+  orig: 1285, 276
+  offset: 0, 0
+  index: -1
+images/tankBottom-shadow
+  rotate: false
+  xy: 2, 1702
+  size: 1291, 341
+  orig: 1291, 341
+  offset: 0, 0
+  index: -1
+images/tankTop
+  rotate: true
+  xy: 2, 293
+  size: 1407, 222
+  orig: 1407, 222
+  offset: 0, 0
+  index: -1
+images/tread
+  rotate: false
+  xy: 226, 326
+  size: 96, 30
+  orig: 96, 30
+  offset: 0, 0
+  index: -1
+images/tread-inside
+  rotate: false
+  xy: 195, 263
+  size: 25, 28
+  orig: 25, 28
+  offset: 0, 0
+  index: -1
+images/wheel-big
+  rotate: false
+  xy: 2, 100
+  size: 191, 191
+  orig: 191, 191
+  offset: 0, 0
+  index: -1
+images/wheel-big-overlay
+  rotate: false
+  xy: 564, 1514
+  size: 186, 186
+  orig: 186, 186
+  offset: 0, 0
+  index: -1
+images/wheel-mid
+  rotate: false
+  xy: 564, 1376
+  size: 136, 136
+  orig: 136, 136
+  offset: 0, 0
+  index: -1
+images/wheel-mid-overlay
+  rotate: false
+  xy: 752, 1564
+  size: 136, 136
+  orig: 136, 136
+  offset: 0, 0
+  index: -1
+images/wheel-small
+  rotate: false
+  xy: 890, 1629
+  size: 71, 71
+  orig: 71, 71
+  offset: 0, 0
+  index: -1

+ 1899 - 0
spine-cocos2dx/example/Resources/common/tank.json

@@ -0,0 +1,1899 @@
+{
+"skeleton": { "hash": "kgtyty1lpfv5JU2lygtFi2u3oQQ", "spine": "3.3.07", "width": 1914.53, "height": 964.05, "images": "" },
+"bones": [
+	{ "name": "root" },
+	{ "name": "tankRoot", "parent": "root", "y": 200 },
+	{ "name": "tankTreads", "parent": "tankRoot" },
+	{ "name": "tankBody", "parent": "tankTreads", "y": 10 },
+	{ "name": "guntower", "parent": "tankBody", "x": -21.72, "y": 245.47 },
+	{ "name": "antennaRoot", "parent": "guntower", "x": 164.6, "y": 202.52 },
+	{ "name": "antenna1", "parent": "antennaRoot", "length": 40, "rotation": 90, "y": 39.99, "color": "ffee00ff" },
+	{ "name": "antenna2", "parent": "antenna1", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna3", "parent": "antenna2", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna4", "parent": "antenna3", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna5", "parent": "antenna4", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna6", "parent": "antenna5", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "cannonConnector", "parent": "guntower", "x": -235.04, "y": 96.07 },
+	{ "name": "cannonTarget", "parent": "tankRoot", "x": -1486.66, "y": 351.82, "color": "ff3f00ff" },
+	{ "name": "cannon", "parent": "cannonConnector", "length": 946.68, "rotation": 180, "color": "ff4000ff" },
+	{ "name": "cannonTip", "parent": "cannon", "x": 946.68, "color": "ff4000ff" },
+	{ "name": "machineGunTarget", "parent": "tankRoot", "x": -1474, "y": 559.42, "color": "ff3f00ff" },
+	{
+		"name": "machinegun-mount",
+		"parent": "guntower",
+		"length": 90.97,
+		"rotation": 90,
+		"x": -123.72,
+		"y": 218.32,
+		"color": "15ff00ff"
+	},
+	{
+		"name": "machinegun",
+		"parent": "machinegun-mount",
+		"length": 208.94,
+		"rotation": 90,
+		"x": 91.52,
+		"y": -1.03,
+		"color": "15ff00ff"
+	},
+	{ "name": "machinegun-tip", "parent": "machinegun", "x": 210.42, "y": -12.2 },
+	{ "name": "rock", "parent": "root", "x": -656.45 },
+	{
+		"name": "tread",
+		"parent": "tankRoot",
+		"length": 82,
+		"rotation": 180,
+		"x": -22.89,
+		"y": 213.85,
+		"scaleX": 0.993,
+		"color": "e64344ff"
+	},
+	{ "name": "tread2", "parent": "tread", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread3", "parent": "tread2", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread4", "parent": "tread3", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread5", "parent": "tread4", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread6", "parent": "tread5", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread7", "parent": "tread6", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread8", "parent": "tread7", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread9", "parent": "tread8", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread10", "parent": "tread9", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread11", "parent": "tread10", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread12", "parent": "tread11", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread13", "parent": "tread12", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread14", "parent": "tread13", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread15", "parent": "tread14", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread16", "parent": "tread15", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread17", "parent": "tread16", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread18", "parent": "tread17", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread19", "parent": "tread18", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread20", "parent": "tread19", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread21", "parent": "tread20", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread22", "parent": "tread21", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread23", "parent": "tread22", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread24", "parent": "tread23", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread25", "parent": "tread24", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread26", "parent": "tread25", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread27", "parent": "tread26", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread28", "parent": "tread27", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread29", "parent": "tread28", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread30", "parent": "tread29", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread31", "parent": "tread30", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread32", "parent": "tread31", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread33", "parent": "tread32", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread34", "parent": "tread33", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread35", "parent": "tread34", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread36", "parent": "tread35", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "wheel-midCenter", "parent": "tankRoot", "y": -114.56 },
+	{ "name": "treadCollider1", "parent": "wheel-midCenter", "x": -329.57, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider2", "parent": "wheel-midCenter", "x": -165.95, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider3", "parent": "wheel-midCenter", "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider4", "parent": "wheel-midCenter", "x": 163.56, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider5", "parent": "wheel-midCenter", "x": 329.12, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadGravity1", "parent": "tankRoot", "rotation": 180, "x": -175.35, "y": 109.99, "color": "ff00fbff" },
+	{ "name": "treadGravity2", "parent": "tankRoot", "rotation": 180, "x": 177.88, "y": 105.45, "color": "ff00fbff" },
+	{ "name": "wheel-bigRoot1", "parent": "tankTreads", "x": -549.59, "y": 14.39, "color": "abe323ff" },
+	{ "name": "wheel-big1", "parent": "wheel-bigRoot1", "x": -0.02, "color": "abe323ff" },
+	{ "name": "wheel-bigRoot2", "parent": "tankTreads", "x": 547.33, "y": 14.39 },
+	{ "name": "wheel-big2", "parent": "wheel-bigRoot2" },
+	{ "name": "wheel-midRoot1", "parent": "wheel-midCenter", "x": -410.57, "color": "abe323ff" },
+	{ "name": "wheel-mid1", "parent": "wheel-midRoot1", "color": "abe323ff" },
+	{ "name": "wheel-midRoot2", "parent": "wheel-midCenter", "x": -246.95 },
+	{ "name": "wheel-mid2", "parent": "wheel-midRoot2" },
+	{ "name": "wheel-midRoot3", "parent": "wheel-midCenter", "x": -82.72 },
+	{ "name": "wheel-mid3", "parent": "wheel-midRoot3" },
+	{ "name": "wheel-midRoot4", "parent": "wheel-midCenter", "x": 80.89 },
+	{ "name": "wheel-mid4", "parent": "wheel-midRoot4" },
+	{ "name": "wheel-midRoot5", "parent": "wheel-midCenter", "x": 244.51 },
+	{ "name": "wheel-mid5", "parent": "wheel-midRoot5" },
+	{ "name": "wheel-midRoot6", "parent": "wheel-midCenter", "x": 408.73 },
+	{ "name": "wheel-mid6", "parent": "wheel-midRoot6" },
+	{ "name": "wheel-smallRoot1", "parent": "tankTreads", "x": -337.38, "y": 109.43 },
+	{ "name": "wheel-small1", "parent": "wheel-smallRoot1", "color": "abe323ff" },
+	{ "name": "wheel-smallRoot2", "parent": "tankTreads", "x": 0.08, "y": 109.43 },
+	{ "name": "wheel-small2", "parent": "wheel-smallRoot2" },
+	{ "name": "wheel-smallRoot3", "parent": "tankTreads", "x": 334.68, "y": 109.43 },
+	{ "name": "wheel-small3", "parent": "wheel-smallRoot3" }
+],
+"slots": [
+	{ "name": "tankBody-shadow", "bone": "tankBody", "color": "ffffffb9", "attachment": "images/tankBottom-shadow" },
+	{ "name": "bottom", "bone": "tankBody", "attachment": "images/tankBottom" },
+	{ "name": "tread-inside1", "bone": "tread", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside53", "bone": "tread27", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside27", "bone": "tread14", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside3", "bone": "tread2", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside55", "bone": "tread28", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside29", "bone": "tread15", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside5", "bone": "tread3", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside57", "bone": "tread29", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside31", "bone": "tread16", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside7", "bone": "tread4", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside59", "bone": "tread30", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside33", "bone": "tread17", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside9", "bone": "tread5", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside61", "bone": "tread31", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside35", "bone": "tread18", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside11", "bone": "tread6", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside63", "bone": "tread32", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside37", "bone": "tread19", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside13", "bone": "tread7", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside65", "bone": "tread33", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside39", "bone": "tread20", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside15", "bone": "tread8", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside67", "bone": "tread34", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside69", "bone": "tread35", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside71", "bone": "tread36", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside41", "bone": "tread21", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside17", "bone": "tread9", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside43", "bone": "tread22", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside19", "bone": "tread10", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside45", "bone": "tread23", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside21", "bone": "tread11", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside47", "bone": "tread24", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside23", "bone": "tread12", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside49", "bone": "tread25", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside25", "bone": "tread13", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside51", "bone": "tread26", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside2", "bone": "tread", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside54", "bone": "tread27", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside28", "bone": "tread14", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside4", "bone": "tread2", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside56", "bone": "tread28", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside30", "bone": "tread15", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside6", "bone": "tread3", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside58", "bone": "tread29", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside32", "bone": "tread16", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside8", "bone": "tread4", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside60", "bone": "tread30", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside34", "bone": "tread17", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside10", "bone": "tread5", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside62", "bone": "tread31", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside36", "bone": "tread18", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside12", "bone": "tread6", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside64", "bone": "tread32", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside38", "bone": "tread19", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside14", "bone": "tread7", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside66", "bone": "tread33", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside40", "bone": "tread20", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside16", "bone": "tread8", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside68", "bone": "tread34", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside70", "bone": "tread35", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside72", "bone": "tread36", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside42", "bone": "tread21", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside18", "bone": "tread9", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside44", "bone": "tread22", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside20", "bone": "tread10", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside46", "bone": "tread23", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside22", "bone": "tread11", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside48", "bone": "tread24", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside24", "bone": "tread12", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside50", "bone": "tread25", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside26", "bone": "tread13", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside52", "bone": "tread26", "attachment": "images/tread-inside" },
+	{ "name": "wheel-big", "bone": "wheel-big1", "color": "dbdbdbff", "attachment": "images/wheel-big" },
+	{ "name": "wheel-big2", "bone": "wheel-big2", "color": "dbdbdbff", "attachment": "images/wheel-big" },
+	{ "name": "wheel-mid", "bone": "wheel-mid1", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid2", "bone": "wheel-mid2", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid3", "bone": "wheel-mid3", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid4", "bone": "wheel-mid4", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid5", "bone": "wheel-mid5", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid6", "bone": "wheel-mid6", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-small", "bone": "wheel-small1", "attachment": "images/wheel-small" },
+	{ "name": "wheel-small2", "bone": "wheel-small2", "attachment": "images/wheel-small" },
+	{ "name": "wheel-small3", "bone": "wheel-small3", "attachment": "images/wheel-small" },
+	{
+		"name": "wheel-mid-overlay",
+		"bone": "wheel-midRoot1",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay2",
+		"bone": "wheel-midRoot2",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay3",
+		"bone": "wheel-midRoot3",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay4",
+		"bone": "wheel-midRoot4",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay5",
+		"bone": "wheel-midRoot5",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay6",
+		"bone": "wheel-midRoot6",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-big-overlay1",
+		"bone": "wheel-bigRoot1",
+		"color": "ffffffe9",
+		"attachment": "images/wheel-big-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-big-overlay2",
+		"bone": "wheel-bigRoot2",
+		"color": "ffffffe9",
+		"attachment": "images/wheel-big-overlay",
+		"blend": "multiply"
+	},
+	{ "name": "treads", "bone": "tankRoot", "attachment": "treads" },
+	{ "name": "tread", "bone": "tread", "color": "c0974fff", "attachment": "images/tread" },
+	{ "name": "tread27", "bone": "tread27", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread14", "bone": "tread14", "attachment": "images/tread" },
+	{ "name": "tread2", "bone": "tread2", "attachment": "images/tread" },
+	{ "name": "tread28", "bone": "tread28", "attachment": "images/tread" },
+	{ "name": "tread15", "bone": "tread15", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread3", "bone": "tread3", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread29", "bone": "tread29", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread16", "bone": "tread16", "attachment": "images/tread" },
+	{ "name": "tread4", "bone": "tread4", "attachment": "images/tread" },
+	{ "name": "tread30", "bone": "tread30", "attachment": "images/tread" },
+	{ "name": "tread17", "bone": "tread17", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread5", "bone": "tread5", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread31", "bone": "tread31", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread18", "bone": "tread18", "attachment": "images/tread" },
+	{ "name": "tread6", "bone": "tread6", "attachment": "images/tread" },
+	{ "name": "tread32", "bone": "tread32", "attachment": "images/tread" },
+	{ "name": "tread19", "bone": "tread19", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread7", "bone": "tread7", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread33", "bone": "tread33", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread20", "bone": "tread20", "attachment": "images/tread" },
+	{ "name": "tread8", "bone": "tread8", "attachment": "images/tread" },
+	{ "name": "tread34", "bone": "tread34", "attachment": "images/tread" },
+	{ "name": "tread35", "bone": "tread35", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread36", "bone": "tread36", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread21", "bone": "tread21", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread9", "bone": "tread9", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread22", "bone": "tread22", "attachment": "images/tread" },
+	{ "name": "tread10", "bone": "tread10", "attachment": "images/tread" },
+	{ "name": "tread23", "bone": "tread23", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread11", "bone": "tread11", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread24", "bone": "tread24", "attachment": "images/tread" },
+	{ "name": "tread12", "bone": "tread12", "attachment": "images/tread" },
+	{ "name": "tread25", "bone": "tread25", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread13", "bone": "tread13", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread26", "bone": "tread26", "attachment": "images/tread" },
+	{ "name": "rock", "bone": "rock", "attachment": "images/rock" },
+	{ "name": "machinegun", "bone": "machinegun", "attachment": "images/machinegun" },
+	{ "name": "machinegun-mount", "bone": "machinegun-mount", "attachment": "images/machinegun-mount" },
+	{ "name": "tankTop", "bone": "tankBody", "attachment": "images/tankTop" },
+	{ "name": "guntower", "bone": "guntower", "attachment": "images/guntower" },
+	{ "name": "cannon", "bone": "cannon", "attachment": "images/cannon" },
+	{ "name": "cannonConnector", "bone": "cannonConnector", "attachment": "images/cannonConnector" },
+	{ "name": "antenna", "bone": "antennaRoot", "attachment": "images/antenna" }
+],
+"ik": [
+	{
+		"name": "cannonTarget",
+		"bones": [ "cannon" ],
+		"target": "cannonTarget"
+	},
+	{
+		"name": "machineGunTarget",
+		"bones": [ "machinegun" ],
+		"target": "machineGunTarget",
+		"mix": 0
+	}
+],
+"transform": [
+	{
+		"name": "wheel-big",
+		"bones": [ "wheel-big2" ],
+		"target": "wheel-big1",
+		"rotation": 65.6,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid1",
+		"bones": [ "wheel-mid2", "wheel-mid4" ],
+		"target": "wheel-mid1",
+		"rotation": 93,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid2",
+		"bones": [ "wheel-mid3", "wheel-mid5" ],
+		"target": "wheel-mid1",
+		"rotation": -89,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid3",
+		"bones": [ "wheel-mid6" ],
+		"target": "wheel-mid1",
+		"rotation": -152.6,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-small1",
+		"bones": [ "wheel-small2" ],
+		"target": "wheel-small1",
+		"rotation": 87,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-small2",
+		"bones": [ "wheel-small3" ],
+		"target": "wheel-small1",
+		"rotation": 54.9,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	}
+],
+"path": [
+	{
+		"name": "treads",
+		"bones": [
+			"tread",
+			"tread2",
+			"tread3",
+			"tread4",
+			"tread5",
+			"tread6",
+			"tread7",
+			"tread8",
+			"tread9",
+			"tread10",
+			"tread11",
+			"tread12",
+			"tread13",
+			"tread14",
+			"tread15",
+			"tread16",
+			"tread17",
+			"tread18",
+			"tread19",
+			"tread20",
+			"tread21",
+			"tread22",
+			"tread23",
+			"tread24",
+			"tread25",
+			"tread26",
+			"tread27",
+			"tread28",
+			"tread29",
+			"tread30",
+			"tread31",
+			"tread32",
+			"tread33",
+			"tread34",
+			"tread35",
+			"tread36"
+		],
+		"target": "treads",
+		"rotateMode": "chain"
+	}
+],
+"skins": {
+	"default": {
+		"antenna": {
+			"images/antenna": {
+				"type": "mesh",
+				"uvs": [ 0.64286, 0.07875, 0.65354, 0.15349, 0.66324, 0.22137, 0.67367, 0.29433, 0.68383, 0.36543, 0.69359, 0.43374, 0.7031, 0.50029, 0.71311, 0.5703, 0.72327, 0.64138, 0.73406, 0.71688, 0.7444, 0.78929, 0.75614, 0.8714, 0.76905, 0.9431, 1, 0.9431, 1, 1, 0, 1, 0, 0.9431, 0.20105, 0.9431, 0.20105, 0.87093, 0.21461, 0.78846, 0.22651, 0.71606, 0.23885, 0.64098, 0.25035, 0.57104, 0.26206, 0.49983, 0.27306, 0.4329, 0.2843, 0.36453, 0.29592, 0.29381, 0.308, 0.22037, 0.319, 0.15345, 0.33141, 0.07795, 0.34423, 0, 0.6316, 0 ],
+				"triangles": [ 30, 31, 0, 29, 30, 0, 29, 0, 1, 28, 29, 1, 28, 1, 2, 27, 28, 2, 27, 2, 3, 26, 3, 4, 25, 26, 4, 25, 4, 5, 26, 27, 3, 24, 5, 6, 23, 24, 6, 7, 23, 6, 24, 25, 5, 22, 7, 8, 21, 22, 8, 21, 8, 9, 7, 22, 23, 20, 9, 10, 19, 20, 10, 20, 21, 9, 19, 10, 11, 18, 19, 11, 17, 18, 11, 17, 11, 12, 15, 16, 17, 12, 13, 14, 15, 17, 12, 14, 15, 12 ],
+				"vertices": [ 2, 10, 65.37999, -3.14, 0.3125, 11, 23.38, -3.14, 0.6875, 3, 9, 84.73, -3.37, 0.0625, 10, 42.73, -3.37, 0.625, 11, 0.73, -3.37, 0.3125, 3, 9, 64.16, -3.59, 0.3125, 10, 22.16, -3.59, 0.625, 11, -19.83, -3.59, 0.0625, 3, 8, 84.06, -3.82, 0.0625, 9, 42.06, -3.82, 0.625, 10, 0.06, -3.82, 0.3125, 3, 8, 62.51, -4.04, 0.3125, 9, 20.51, -4.04, 0.625, 10, -21.48, -4.04, 0.0625, 3, 7, 83.81, -4.25, 0.0625, 8, 41.81, -4.25, 0.625, 9, -0.18, -4.25, 0.3125, 3, 7, 63.65, -4.46, 0.3125, 8, 21.65, -4.46, 0.625, 9, -20.34, -4.46, 0.0625, 3, 6, 84.43, -4.67999, 0.0625, 7, 42.43, -4.67999, 0.625, 8, 0.43, -4.67999, 0.3125, 3, 6, 62.9, -4.91, 0.3125, 7, 20.9, -4.91, 0.625, 8, -21.09, -4.91, 0.0625, 3, 5, 5.14, 80.01999, 0.0625, 6, 40.02, -5.14, 0.625, 7, -1.97, -5.14, 0.3125, 3, 5, 5.37, 58.08, 0.375, 6, 18.08, -5.37, 0.5625, 7, -23.91, -5.37, 0.0625, 1, 5, 5.63, 33.2, 1, 1, 5, 5.91, 11.48, 1, 1, 5, 11, 11.48, 1, 1, 5, 10.99, -5.75, 1, 1, 5, -11, -5.75, 1, 1, 5, -10.99, 11.48, 1, 1, 5, -6.57, 11.48, 1, 1, 5, -6.57, 33.34, 1, 3, 5, -6.27, 58.33, 0.375, 6, 18.33, 6.27, 0.5625, 7, -23.66, 6.27, 0.0625, 3, 5, -6.01, 80.26999, 0.0625, 6, 40.27, 6.01, 0.625, 7, -1.72, 6.01, 0.3125, 3, 6, 63.02, 5.74, 0.3125, 7, 21.02, 5.74, 0.625, 8, -20.96999, 5.74, 0.0625, 3, 6, 84.21, 5.49, 0.0625, 7, 42.21, 5.49, 0.625, 8, 0.21, 5.49, 0.3125, 3, 7, 63.79, 5.23, 0.3125, 8, 21.79, 5.23, 0.625, 9, -20.2, 5.23, 0.0625, 3, 7, 84.07, 4.98999, 0.0625, 8, 42.07, 4.98999, 0.625, 9, 0.07, 4.98999, 0.3125, 3, 8, 62.78, 4.73999, 0.3125, 9, 20.78, 4.73999, 0.625, 10, -21.21, 4.73999, 0.0625, 3, 8, 84.21, 4.48, 0.0625, 9, 42.21, 4.48, 0.625, 10, 0.21, 4.48, 0.3125, 3, 9, 64.46, 4.21999, 0.3125, 10, 22.46, 4.21999, 0.625, 11, -19.53, 4.21999, 0.0625, 3, 9, 84.74, 3.98, 0.0625, 10, 42.74, 3.98, 0.625, 11, 0.74, 3.98, 0.3125, 2, 10, 65.62, 3.7, 0.3125, 11, 23.62, 3.7, 0.6875, 1, 11, 47.24, 3.42, 1, 1, 11, 47.24, -2.89, 1 ],
+				"hull": 32,
+				"edges": [ 28, 30, 28, 26, 30, 32, 26, 24, 24, 22, 32, 34, 34, 24, 34, 36, 36, 22, 60, 62, 38, 36, 20, 22, 38, 20, 40, 38, 18, 20, 40, 18, 42, 40, 16, 18, 42, 16, 44, 42, 14, 16, 44, 14, 46, 44, 12, 14, 46, 12, 48, 46, 10, 12, 48, 10, 50, 48, 8, 10, 50, 8, 52, 50, 6, 8, 52, 6, 54, 52, 4, 6, 54, 4, 56, 54, 2, 4, 56, 2, 60, 58, 58, 56, 62, 0, 0, 2, 58, 0 ],
+				"width": 22,
+				"height": 303
+			}
+		},
+		"bottom": {
+			"images/tankBottom": { "x": -16.66, "y": 9.89, "width": 1285, "height": 276 }
+		},
+		"cannon": {
+			"images/cannon": { "x": 481.95, "y": -0.02, "rotation": 179.99, "width": 931, "height": 58 }
+		},
+		"cannonConnector": {
+			"images/cannonConnector": {
+				"type": "mesh",
+				"uvs": [ 1, 0.03236, 1, 0.10602, 0.90987, 0.32859, 0.81975, 0.55116, 0.72962, 0.77372, 0.6395, 0.99629, 0.42157, 0.99629, 0.20364, 0.99629, 0, 0.85433, 0, 0.69901, 0.02267, 0.52884, 0, 0.31444, 0.21601, 0.12998, 0.43367, 0, 0.63546, 0.0037, 0.48407, 0.77059, 0.31496, 0.52496, 0.64132, 0.19648, 0.21516, 0.76765, 0.58345, 0.5647, 0.68444, 0.40146, 0.46758, 0.36649, 0.28934, 0.34603 ],
+				"triangles": [ 21, 22, 12, 11, 12, 22, 17, 21, 13, 17, 13, 14, 21, 12, 13, 21, 17, 20, 16, 22, 21, 10, 11, 22, 10, 22, 16, 19, 21, 20, 16, 21, 19, 18, 10, 16, 9, 10, 18, 15, 16, 19, 18, 16, 15, 8, 9, 18, 7, 8, 18, 6, 18, 15, 7, 18, 6, 14, 0, 1, 17, 14, 1, 2, 17, 1, 20, 17, 2, 3, 20, 2, 19, 20, 3, 4, 19, 3, 15, 19, 4, 5, 15, 4, 6, 15, 5 ],
+				"vertices": [ 1, 12, 35.91, 69.08, 1, 1, 12, 35.91, 59.13, 1, 1, 12, 25.81, 29.09, 1, 1, 12, 15.72, -0.95, 1, 1, 12, 5.63, -31, 1, 1, 12, -4.46, -61.04, 1, 2, 12, -28.87, -61.04, 0.33333, 14, 28.87, 61.03, 0.66666, 1, 14, 53.27, 61.01, 1, 1, 14, 76.08, 41.83, 1, 1, 14, 71.17, 21.62, 1, 1, 14, 72.83, -1.62, 1, 1, 14, 70.37, -29.12, 1, 1, 14, 50.66, -56.13, 1, 2, 12, -28.43, 74.37, 0.41, 14, 28.43, -74.39, 0.58999, 2, 12, -4.91, 72.94999, 0.52, 14, 4.91, -72.94999, 0.48, 2, 12, -21.87, -30.57, 0.49, 14, 21.87, 30.56, 0.51, 1, 14, 40.81, -2.59999, 1, 2, 12, -4.25, 46.92, 0.49, 14, 4.25, -46.92, 0.51, 1, 14, 51.98, 30.15, 1, 2, 12, -10.74, -2.78, 0.49, 14, 10.74, 2.77, 0.51, 2, 12, 0.56, 19.25, 0.49, 14, -0.56, -19.25, 0.51, 1, 14, 23.71, -23.98, 1, 1, 14, 43.68, -26.76, 1 ],
+				"hull": 15,
+				"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, 0 ],
+				"width": 112,
+				"height": 135
+			}
+		},
+		"guntower": {
+			"images/guntower": { "x": 77.22, "y": 122.58, "width": 730, "height": 289 }
+		},
+		"machinegun": {
+			"images/machinegun": { "x": 44.85, "y": -5.72, "rotation": -180, "width": 331, "height": 57 }
+		},
+		"machinegun-mount": {
+			"images/machinegun-mount": { "x": 47.42, "y": -1.53, "rotation": -90, "width": 72, "height": 96 }
+		},
+		"rock": {
+			"images/rock": { "color": "404040ff", "x": 25.23, "y": 27.35, "width": 252, "height": 55 }
+		},
+		"tankBody-shadow": {
+			"images/tankBottom-shadow": { "x": -11.43, "y": -42.88, "width": 1291, "height": 341 }
+		},
+		"tankTop": {
+			"images/tankTop": { "x": 6.8, "y": 168.71, "width": 1407, "height": 222 }
+		},
+		"tread": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread-inside1": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside10": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside11": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside12": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside13": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside14": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside15": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside16": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside17": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside18": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside19": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside2": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside20": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside21": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside22": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside23": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside24": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside25": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside26": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside27": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside28": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside29": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside3": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside30": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside31": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside32": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside33": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside34": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside35": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside36": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside37": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside38": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside39": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside4": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside40": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside41": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside42": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside43": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside44": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside45": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside46": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside47": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside48": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside49": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside5": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside50": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside51": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside52": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside53": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside54": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside55": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside56": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside57": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside58": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside59": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside6": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside60": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside61": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside62": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside63": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside64": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside65": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside66": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside67": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside68": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside69": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside7": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside70": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside71": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside72": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside8": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside9": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread10": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread11": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread12": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread13": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread14": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread15": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread16": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread17": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread18": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread19": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread2": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread20": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread21": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread22": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread23": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread24": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread25": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread26": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread27": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread28": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread29": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread3": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread30": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread31": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread32": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread33": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread34": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread35": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread36": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread4": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread5": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread6": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread7": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread8": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread9": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"treads": {
+			"treads": {
+				"type": "path",
+				"closed": true,
+				"lengths": [ 182.41, 349, 472.77, 602.99, 780.46, 1052.96, 1133.44, 1218.43, 1298.34, 1382.7, 1465.57, 1546.11, 1628.02, 1707.73, 1794.36, 1876.75, 2158.69, 2321.34, 2438.56, 2579.42, 2745.35, 2919.23 ],
+				"vertexCount": 66,
+				"vertices": [ 1, 83, 11.23, 41.86, 1, 1, 83, 0.78, 41.93999, 1, 1, 83, -34.72, 42.23, 1, 1, 63, -104.21, 0.41, 1, 1, 63, 0.07, 0.55, 1, 1, 63, 68.8, 0.64, 1, 1, 81, 20.5, 43.47, 1, 1, 81, 1.13, 40.81, 1, 1, 81, -27.38, 36.84, 1, 1, 65, 147.06, 105, 1, 1, 65, 96.21, 96.63, 1, 1, 65, 43.87, 87.71, 1, 1, 65, 16.18, 103.34, 1, 1, 65, -33.66999, 94.2, 1, 1, 65, -99.35, 81.25, 1, 1, 65, -122.04, -1.69, 1, 1, 65, -83.58, -47.92, 1, 1, 65, -33.53, -109.36, 1, 1, 69, -83.56, -66.08999, 1, 1, 69, -2.16, -67.89, 1, 2, 69, 56.68, -41.48, 0.67999, 58, -24.31, -41.49, 0.32, 1, 58, -26.58, 16.69, 1, 1, 58, -2.69, 16.69, 1, 1, 58, 13.51, 16.69, 1, 2, 71, -52.41, -46.51, 0.74399, 58, 30.2, -46.51, 0.256, 1, 71, -0.32, -68.92, 1, 2, 71, 52.09, -44.72, 0.712, 59, -28.9, -44.73, 0.28799, 1, 59, -22.8, 16.24, 1, 1, 59, -1.42, 16.24, 1, 1, 59, 20.46999, 16.24, 1, 2, 73, -47.21, -47.45, 0.744, 59, 36.00999, -47.46, 0.25599, 1, 73, -0.28, -69.65, 1, 2, 73, 45.23, -47.26, 0.736, 60, -37.48, -47.26, 0.26399, 1, 60, -23.76, 15.27, 1, 1, 60, -0.13, 15.27, 1, 1, 60, 24.45, 15.27, 1, 2, 75, -47.36, -48.7, 0.74399, 60, 33.52, -48.7, 0.256, 1, 75, -0.49, -70.39, 1, 2, 75, 49.09, -48.33, 0.744, 61, -33.57, -48.34, 0.25599, 1, 61, -20.89, 15.83, 1, 1, 61, -1.25, 15.83, 1, 1, 61, 15.78, 15.83, 1, 2, 77, -52.49, -48.21, 0.75999, 61, 28.45, -48.21, 0.24, 1, 77, -2.5, -68.92, 1, 2, 77, 55.72, -47.82, 0.752, 62, -28.88, -47.82, 0.248, 1, 62, -21.64, 16.69, 1, 1, 62, -0.48, 16.69, 1, 1, 62, 20.73, 16.69, 1, 2, 79, -53.65, -48.89, 0.76, 62, 25.96, -48.89, 0.23999, 1, 79, 2.27, -69.65, 1, 1, 79, 44.94, -69.74, 1, 1, 65, 1172.98, -85.6, 1, 1, 65, 1190.53, -42.24, 1, 1, 65, 1215.63, 19.75, 1, 1, 65, 1175.55, 76.62, 1, 1, 65, 1134.22, 95.07, 1, 1, 65, 1128.4, 97.66, 1, 1, 65, 1081.79, 87.47, 1, 1, 65, 1017.16, 92.52, 1, 1, 65, 977.9, 95.58, 1, 1, 85, 47.07, 42.29, 1, 1, 85, 0.24, 42.74, 1, 1, 85, -29.63, 43.28, 1, 1, 64, -86.64, 1.35, 1, 1, 64, 0.49, 0.25, 1, 1, 64, 92.42, -0.89, 1 ]
+			}
+		},
+		"wheel-big": {
+			"images/wheel-big": { "width": 191, "height": 191 }
+		},
+		"wheel-big-overlay1": {
+			"images/wheel-big-overlay": { "width": 186, "height": 186 }
+		},
+		"wheel-big-overlay2": {
+			"images/wheel-big-overlay": { "width": 186, "height": 186 }
+		},
+		"wheel-big2": {
+			"images/wheel-big": { "width": 191, "height": 191 }
+		},
+		"wheel-mid": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay2": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay3": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay4": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay5": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay6": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid2": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid3": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid4": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid5": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid6": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-small": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		},
+		"wheel-small2": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		},
+		"wheel-small3": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		}
+	}
+},
+"animations": {
+	"drive": {
+		"bones": {
+			"tankRoot": {
+				"translate": [
+					{
+						"time": 0,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.549, 0, 0.907, 0.84 ]
+					},
+					{
+						"time": 3.0333,
+						"x": -1426.14,
+						"y": 0,
+						"curve": [ 0.211, 0.23, 0.851, 0.92 ]
+					},
+					{
+						"time": 4.8666,
+						"x": -2806.98,
+						"y": 0,
+						"curve": [ 0.253, 0.27, 0.625, 0.94 ]
+					},
+					{ "time": 5.3333, "x": -2903.34, "y": 0 }
+				]
+			},
+			"wheel-midRoot1": {
+				"translate": [
+					{ "time": 0.7666, "x": 0, "y": 0 },
+					{
+						"time": 1.1666,
+						"x": 0,
+						"y": 50.95,
+						"curve": [ 0.633, 0, 0.907, 0.82 ]
+					},
+					{ "time": 1.5666, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider1": {
+				"rotate": [
+					{ "time": 1.1, "angle": 0 },
+					{ "time": 1.2333, "angle": -19.78 },
+					{ "time": 1.4666, "angle": 0 },
+					{ "time": 1.6, "angle": 28.87 },
+					{ "time": 1.8, "angle": 0 }
+				],
+				"translate": [
+					{ "time": 1.1, "x": 0, "y": 0 },
+					{
+						"time": 1.4666,
+						"x": 0,
+						"y": 58.66,
+						"curve": [ 0.352, 0, 0.828, 0.92 ]
+					},
+					{ "time": 1.8, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot2": {
+				"translate": [
+					{ "time": 1.2666, "x": 0, "y": 0 },
+					{
+						"time": 1.6333,
+						"x": 0,
+						"y": 55.07,
+						"curve": [ 0.889, 0.01, 0.843, 0.81 ]
+					},
+					{ "time": 1.9333, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider2": {
+				"rotate": [
+					{ "time": 1.5333, "angle": 0 },
+					{ "time": 1.6333, "angle": -18.67 },
+					{ "time": 1.8, "angle": 0 },
+					{ "time": 1.9, "angle": 29.49 },
+					{ "time": 2.0666, "angle": 0 }
+				],
+				"translate": [
+					{
+						"time": 1.5333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.16, 0.25, 0.813, 0.82 ]
+					},
+					{
+						"time": 1.8,
+						"x": 0,
+						"y": 59.03,
+						"curve": [ 0.376, 0.26, 0.879, 0.79 ]
+					},
+					{ "time": 2.0666, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot3": {
+				"translate": [
+					{ "time": 1.6666, "x": 0, "y": 0 },
+					{
+						"time": 1.9333,
+						"x": 0,
+						"y": 60.17,
+						"curve": [ 0.544, 0, 0.838, 0.77 ]
+					},
+					{ "time": 2.2, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider3": {
+				"rotate": [
+					{ "time": 1.8666, "angle": 0 },
+					{ "time": 1.9333, "angle": -20.16 },
+					{ "time": 2.0666, "angle": 0.57 },
+					{ "time": 2.1666, "angle": 33.66 },
+					{ "time": 2.3333, "angle": 0 }
+				],
+				"translate": [
+					{ "time": 1.8666, "x": 0, "y": 0 },
+					{
+						"time": 2.0666,
+						"x": 0,
+						"y": 61.53,
+						"curve": [ 0.582, 0, 0.836, 0.77 ]
+					},
+					{ "time": 2.3333, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot4": {
+				"translate": [
+					{ "time": 1.9333, "x": 0, "y": 0 },
+					{
+						"time": 2.2,
+						"x": 0,
+						"y": 58.89,
+						"curve": [ 0.48, 0, 0.75, 1 ]
+					},
+					{ "time": 2.4666, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider4": {
+				"rotate": [
+					{ "time": 2.1333, "angle": 0 },
+					{ "time": 2.2, "angle": -20.43 },
+					{ "time": 2.3333, "angle": 4.49 },
+					{ "time": 2.4333, "angle": 35.87 },
+					{ "time": 2.5666, "angle": 0 }
+				],
+				"translate": [
+					{
+						"time": 2.1333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.191, 0.49, 0.75, 1 ]
+					},
+					{ "time": 2.3333, "x": 0, "y": 66.64 },
+					{ "time": 2.5666, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot5": {
+				"translate": [
+					{ "time": 2.2, "x": 0, "y": 0 },
+					{ "time": 2.4333, "x": 0, "y": 60.26 },
+					{ "time": 2.7, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider5": {
+				"rotate": [
+					{ "time": 2.3333, "angle": 0 },
+					{ "time": 2.4333, "angle": -23.6 },
+					{ "time": 2.5666, "angle": 6.49 },
+					{ "time": 2.6666, "angle": 29.93 },
+					{ "time": 2.8, "angle": -0.13 }
+				],
+				"translate": [
+					{ "time": 2.3333, "x": 0, "y": 0 },
+					{ "time": 2.4333, "x": 0, "y": 36.34 },
+					{ "time": 2.5, "x": 0, "y": 56.39 },
+					{ "time": 2.5666, "x": 0, "y": 61.34 },
+					{ "time": 2.8, "x": 0, "y": 2.04 }
+				]
+			},
+			"wheel-midRoot6": {
+				"translate": [
+					{
+						"time": 2.4333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.19, 0.26, 0.804, 0.8 ]
+					},
+					{
+						"time": 2.6333,
+						"x": 0,
+						"y": 51.86,
+						"curve": [ 0.346, 0, 0.852, 0.7 ]
+					},
+					{ "time": 2.8, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-mid1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 21,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 0.8, "angle": 120 },
+					{ "time": 1.2333, "angle": 240 },
+					{ "time": 1.6, "angle": 0 },
+					{ "time": 1.9, "angle": 120 },
+					{ "time": 2.1666, "angle": 240 },
+					{ "time": 2.4, "angle": 0 },
+					{ "time": 2.5666, "angle": 120 },
+					{ "time": 2.7333, "angle": 240 },
+					{ "time": 2.9333, "angle": 0 },
+					{ "time": 3.1, "angle": 120 },
+					{ "time": 3.2666, "angle": 240 },
+					{ "time": 3.4333, "angle": 0 },
+					{ "time": 3.6333, "angle": 120 },
+					{ "time": 3.8, "angle": 240 },
+					{ "time": 3.9666, "angle": 0 },
+					{ "time": 4.1666, "angle": 120 },
+					{ "time": 4.3333, "angle": 240 },
+					{ "time": 4.5, "angle": 0 },
+					{ "time": 4.7, "angle": 120 },
+					{ "time": 4.8666, "angle": 240 },
+					{ "time": 5.2666, "angle": -67.99 }
+				]
+			},
+			"tankTreads": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.145, 0.34, 0.75, 1 ]
+					},
+					{ "time": 1.1, "angle": -3.9 },
+					{ "time": 1.3333, "angle": -2.37 },
+					{ "time": 1.6333, "angle": -3.54 },
+					{ "time": 2.1666, "angle": 0.27 },
+					{
+						"time": 2.4666,
+						"angle": 2.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.7,
+						"angle": 3.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 3, "angle": -3.62 },
+					{ "time": 3.2333, "angle": -1.23, "curve": "stepped" },
+					{
+						"time": 4.8666,
+						"angle": -1.23,
+						"curve": [ 0.188, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 5.2,
+						"angle": 4.47,
+						"curve": [ 0.416, 0.01, 0.75, 1 ]
+					},
+					{
+						"time": 5.5666,
+						"angle": -3.08,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 5.8333, "angle": -1.23 }
+				]
+			},
+			"wheel-big1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 1.1, "angle": 120 },
+					{ "time": 1.5333, "angle": 240 },
+					{ "time": 1.8, "angle": 360 },
+					{ "time": 2.0333, "angle": 120 },
+					{ "time": 2.2666, "angle": 240 },
+					{ "time": 2.4666, "angle": 360 },
+					{ "time": 2.7, "angle": 120 },
+					{ "time": 2.9333, "angle": 240 },
+					{ "time": 3.1333, "angle": 360 },
+					{ "time": 3.3666, "angle": 120 },
+					{ "time": 3.5666, "angle": 240 },
+					{ "time": 3.8, "angle": -24 },
+					{ "time": 4.0333, "angle": 120 },
+					{ "time": 4.2333, "angle": 240 },
+					{ "time": 4.4666, "angle": -24 },
+					{ "time": 4.7, "angle": 120 },
+					{ "time": 4.8666, "angle": -143.99 },
+					{
+						"time": 5.0666,
+						"angle": -131.4,
+						"curve": [ 0.14, 0.25, 0.75, 1 ]
+					},
+					{ "time": 5.6666, "angle": -76.85 },
+					{ "time": 5.8333, "angle": -72.3 }
+				]
+			},
+			"treadGravity1": {
+				"translate": [
+					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
+					{ "time": 1.4666, "x": 0, "y": 0 },
+					{ "time": 1.8, "x": 0, "y": 29.44 },
+					{ "time": 2.3333, "x": 0, "y": -0.52 },
+					{ "time": 2.5666, "x": 0, "y": 5.2 },
+					{ "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" },
+					{ "time": 4.8666, "x": 0, "y": -11.05 },
+					{ "time": 5.0666, "x": 0, "y": -1.91 },
+					{ "time": 5.5333, "x": 0, "y": -6.9 },
+					{ "time": 5.7333, "x": 0, "y": -11.05 }
+				]
+			},
+			"treadGravity2": {
+				"translate": [
+					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
+					{ "time": 1.4666, "x": 0, "y": 0 },
+					{ "time": 1.8, "x": 0, "y": 8.5 },
+					{ "time": 2.3333, "x": 0, "y": 34.74 },
+					{ "time": 2.5666, "x": 0, "y": 5.2 },
+					{ "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" },
+					{ "time": 4.8666, "x": 0, "y": -11.05 },
+					{ "time": 5.0666, "x": 0, "y": 3.9 },
+					{ "time": 5.5333, "x": 0, "y": -6.9 },
+					{ "time": 5.7333, "x": 0, "y": -11.05 }
+				]
+			},
+			"wheel-small1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 0.7, "angle": 120 },
+					{ "time": 1.1, "angle": 240 },
+					{ "time": 1.4666, "angle": 360 },
+					{ "time": 1.7666, "angle": 120 },
+					{ "time": 2.0333, "angle": 240 },
+					{ "time": 2.2666, "angle": 360 },
+					{ "time": 2.4333, "angle": 120 },
+					{ "time": 2.5666, "angle": 240 },
+					{ "time": 2.7, "angle": 360 },
+					{ "time": 2.8333, "angle": 120 },
+					{ "time": 2.9666, "angle": 240 },
+					{ "time": 3.1, "angle": 360 },
+					{ "time": 3.2333, "angle": 120 },
+					{ "time": 3.3666, "angle": 240 },
+					{ "time": 3.5, "angle": 360 },
+					{ "time": 3.6333, "angle": 120 },
+					{ "time": 3.7666, "angle": 240 },
+					{ "time": 3.9, "angle": 360 },
+					{ "time": 4.0333, "angle": 120 },
+					{ "time": 4.1666, "angle": 240 },
+					{ "time": 4.3, "angle": 360 },
+					{ "time": 4.4333, "angle": 120 },
+					{ "time": 4.5666, "angle": 240 },
+					{ "time": 4.7, "angle": 360 },
+					{ "time": 4.8333, "angle": 120 },
+					{ "time": 5, "angle": 240 },
+					{
+						"time": 5.2,
+						"angle": -25.64,
+						"curve": [ 0.181, 0.26, 0.75, 1 ]
+					},
+					{ "time": 5.5666, "angle": 90 }
+				]
+			},
+			"tankBody": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.1666,
+						"angle": -1.41,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.9333,
+						"angle": -0.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3,
+						"angle": 0.84,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -2.33,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.4666,
+						"angle": -0.45,
+						"curve": [ 0.329, 0.32, 0.757, 1 ]
+					},
+					{
+						"time": 4.8666,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3333,
+						"angle": 1.82,
+						"curve": [ 0.324, 0.01, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -1.15,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.0333, "angle": 0 }
+				]
+			},
+			"antenna1": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna2": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna3": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna4": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna5": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna6": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"machinegun": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 2.8333,
+						"angle": 0,
+						"curve": [ 0.183, 0.17, 0.75, 1 ]
+					},
+					{
+						"time": 3,
+						"angle": -4.43,
+						"curve": [ 0.156, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 3.1666,
+						"angle": -2.93,
+						"curve": [ 0.156, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 4.8333,
+						"angle": 0,
+						"curve": [ 0.183, 0.17, 0.75, 1 ]
+					},
+					{
+						"time": 5.1666,
+						"angle": -6.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.4,
+						"angle": 6.15,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 5.6, "angle": -1.26 }
+				]
+			},
+			"cannon": {
+				"rotate": [
+					{ "time": 0, "angle": 0 }
+				]
+			},
+			"cannonTarget": {
+				"translate": [
+					{
+						"time": 5,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.3333, "x": -15.38, "y": 99.99 }
+				]
+			}
+		},
+		"ik": {
+			"cannonTarget": [
+				{ "time": 0, "mix": 0.809, "curve": "stepped" },
+				{ "time": 4.7333, "mix": 0.809 },
+				{ "time": 5.1666, "mix": 0.504 },
+				{ "time": 5.6666 }
+			]
+		},
+		"paths": {
+			"treads": {
+				"position": [
+					{
+						"time": 0,
+						"curve": [ 0.549, 0, 0.907, 0.84 ]
+					},
+					{ "time": 3.0333, "position": 0.51 },
+					{ "time": 4.8666, "position": 0.9794 },
+					{
+						"time": 5.2666,
+						"position": 1,
+						"curve": [ 0.226, 0.15, 0.765, 0.96 ]
+					},
+					{
+						"time": 5.5333,
+						"position": 1.02,
+						"curve": [ 0.279, 0.32, 0.694, 0.99 ]
+					},
+					{ "time": 5.8333, "position": 1.021 }
+				]
+			}
+		}
+	}
+}
+}

二進制
spine-cocos2dx/example/Resources/common/tank.png


+ 1 - 1
spine-cocos2dx/example/proj.ios_mac/ios/AppController.mm

@@ -39,7 +39,7 @@ static AppDelegate s_sharedApplication;
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
 
     cocos2d::Application *app = cocos2d::Application::getInstance();
-    app->initGLContextAttrs();
+    app->initGLContextAttrs();    
     cocos2d::GLViewImpl::convertAttrs();
 
     // Override point for customization after application launch.

+ 200 - 172
spine-cocos2dx/example/proj.ios_mac/spine-cocos2d-x.xcodeproj/project.pbxproj

@@ -51,34 +51,6 @@
 		76AAA3C31D180F7C00C54FCB /* RaptorExample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3BA1D180F7C00C54FCB /* RaptorExample.cpp */; };
 		76AAA3C41D180F7C00C54FCB /* SimpleCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3BC1D180F7C00C54FCB /* SimpleCommand.cpp */; };
 		76AAA3C51D180F7C00C54FCB /* SpineboyExample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3BE1D180F7C00C54FCB /* SpineboyExample.cpp */; };
-		76AAA3E31D180FA800C54FCB /* Animation.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3C61D180FA800C54FCB /* Animation.c */; };
-		76AAA3E41D180FA800C54FCB /* AnimationState.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3C71D180FA800C54FCB /* AnimationState.c */; };
-		76AAA3E51D180FA800C54FCB /* AnimationStateData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3C81D180FA800C54FCB /* AnimationStateData.c */; };
-		76AAA3E61D180FA800C54FCB /* Atlas.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3C91D180FA800C54FCB /* Atlas.c */; };
-		76AAA3E71D180FA800C54FCB /* AtlasAttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CA1D180FA800C54FCB /* AtlasAttachmentLoader.c */; };
-		76AAA3E81D180FA800C54FCB /* Attachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CB1D180FA800C54FCB /* Attachment.c */; };
-		76AAA3E91D180FA800C54FCB /* AttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CC1D180FA800C54FCB /* AttachmentLoader.c */; };
-		76AAA3EA1D180FA800C54FCB /* Bone.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CD1D180FA800C54FCB /* Bone.c */; };
-		76AAA3EB1D180FA800C54FCB /* BoneData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CE1D180FA800C54FCB /* BoneData.c */; };
-		76AAA3EC1D180FA800C54FCB /* BoundingBoxAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CF1D180FA800C54FCB /* BoundingBoxAttachment.c */; };
-		76AAA3ED1D180FA800C54FCB /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D01D180FA800C54FCB /* Event.c */; };
-		76AAA3EE1D180FA800C54FCB /* EventData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D11D180FA800C54FCB /* EventData.c */; };
-		76AAA3EF1D180FA800C54FCB /* extension.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D21D180FA800C54FCB /* extension.c */; };
-		76AAA3F01D180FA800C54FCB /* IkConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D31D180FA800C54FCB /* IkConstraint.c */; };
-		76AAA3F11D180FA800C54FCB /* IkConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D41D180FA800C54FCB /* IkConstraintData.c */; };
-		76AAA3F21D180FA800C54FCB /* Json.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D51D180FA800C54FCB /* Json.c */; };
-		76AAA3F31D180FA800C54FCB /* MeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D71D180FA800C54FCB /* MeshAttachment.c */; };
-		76AAA3F41D180FA800C54FCB /* RegionAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D81D180FA800C54FCB /* RegionAttachment.c */; };
-		76AAA3F51D180FA800C54FCB /* Skeleton.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D91D180FA800C54FCB /* Skeleton.c */; };
-		76AAA3F61D180FA800C54FCB /* SkeletonBounds.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DA1D180FA800C54FCB /* SkeletonBounds.c */; };
-		76AAA3F71D180FA800C54FCB /* SkeletonData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DB1D180FA800C54FCB /* SkeletonData.c */; };
-		76AAA3F81D180FA800C54FCB /* SkeletonJson.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DC1D180FA800C54FCB /* SkeletonJson.c */; };
-		76AAA3F91D180FA800C54FCB /* Skin.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DD1D180FA800C54FCB /* Skin.c */; };
-		76AAA3FA1D180FA800C54FCB /* Slot.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DE1D180FA800C54FCB /* Slot.c */; };
-		76AAA3FB1D180FA800C54FCB /* SlotData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DF1D180FA800C54FCB /* SlotData.c */; };
-		76AAA3FC1D180FA800C54FCB /* TransformConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3E01D180FA800C54FCB /* TransformConstraint.c */; };
-		76AAA3FD1D180FA800C54FCB /* TransformConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3E11D180FA800C54FCB /* TransformConstraintData.c */; };
-		76AAA3FE1D180FA800C54FCB /* WeightedMeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3E21D180FA800C54FCB /* WeightedMeshAttachment.c */; };
 		76AAA40C1D18106000C54FCB /* AttachmentVertices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA4001D18106000C54FCB /* AttachmentVertices.cpp */; };
 		76AAA40D1D18106000C54FCB /* Cocos2dAttachmentLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA4021D18106000C54FCB /* Cocos2dAttachmentLoader.cpp */; };
 		76AAA40E1D18106000C54FCB /* SkeletonAnimation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA4041D18106000C54FCB /* SkeletonAnimation.cpp */; };
@@ -97,35 +69,6 @@
 		76AAA41B1D18119F00C54FCB /* SkeletonRenderer.h in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA4091D18106000C54FCB /* SkeletonRenderer.h */; };
 		76AAA41C1D18119F00C54FCB /* spine-cocos2dx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA40A1D18106000C54FCB /* spine-cocos2dx.cpp */; };
 		76AAA41D1D18119F00C54FCB /* spine-cocos2dx.h in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA40B1D18106000C54FCB /* spine-cocos2dx.h */; };
-		76AAA41E1D1811A700C54FCB /* Animation.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3C61D180FA800C54FCB /* Animation.c */; };
-		76AAA41F1D1811A700C54FCB /* AnimationState.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3C71D180FA800C54FCB /* AnimationState.c */; };
-		76AAA4201D1811A700C54FCB /* AnimationStateData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3C81D180FA800C54FCB /* AnimationStateData.c */; };
-		76AAA4211D1811A700C54FCB /* Atlas.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3C91D180FA800C54FCB /* Atlas.c */; };
-		76AAA4221D1811A700C54FCB /* AtlasAttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CA1D180FA800C54FCB /* AtlasAttachmentLoader.c */; };
-		76AAA4231D1811A700C54FCB /* Attachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CB1D180FA800C54FCB /* Attachment.c */; };
-		76AAA4241D1811A700C54FCB /* AttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CC1D180FA800C54FCB /* AttachmentLoader.c */; };
-		76AAA4251D1811A700C54FCB /* Bone.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CD1D180FA800C54FCB /* Bone.c */; };
-		76AAA4261D1811A700C54FCB /* BoneData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CE1D180FA800C54FCB /* BoneData.c */; };
-		76AAA4271D1811A700C54FCB /* BoundingBoxAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3CF1D180FA800C54FCB /* BoundingBoxAttachment.c */; };
-		76AAA4281D1811A700C54FCB /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D01D180FA800C54FCB /* Event.c */; };
-		76AAA4291D1811A700C54FCB /* EventData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D11D180FA800C54FCB /* EventData.c */; };
-		76AAA42A1D1811A700C54FCB /* extension.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D21D180FA800C54FCB /* extension.c */; };
-		76AAA42B1D1811A700C54FCB /* IkConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D31D180FA800C54FCB /* IkConstraint.c */; };
-		76AAA42C1D1811A700C54FCB /* IkConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D41D180FA800C54FCB /* IkConstraintData.c */; };
-		76AAA42D1D1811A700C54FCB /* Json.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D51D180FA800C54FCB /* Json.c */; };
-		76AAA42E1D1811A700C54FCB /* Json.h in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D61D180FA800C54FCB /* Json.h */; };
-		76AAA42F1D1811A700C54FCB /* MeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D71D180FA800C54FCB /* MeshAttachment.c */; };
-		76AAA4301D1811A700C54FCB /* RegionAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D81D180FA800C54FCB /* RegionAttachment.c */; };
-		76AAA4311D1811A700C54FCB /* Skeleton.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3D91D180FA800C54FCB /* Skeleton.c */; };
-		76AAA4321D1811A700C54FCB /* SkeletonBounds.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DA1D180FA800C54FCB /* SkeletonBounds.c */; };
-		76AAA4331D1811A700C54FCB /* SkeletonData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DB1D180FA800C54FCB /* SkeletonData.c */; };
-		76AAA4341D1811A700C54FCB /* SkeletonJson.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DC1D180FA800C54FCB /* SkeletonJson.c */; };
-		76AAA4351D1811A700C54FCB /* Skin.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DD1D180FA800C54FCB /* Skin.c */; };
-		76AAA4361D1811A700C54FCB /* Slot.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DE1D180FA800C54FCB /* Slot.c */; };
-		76AAA4371D1811A700C54FCB /* SlotData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3DF1D180FA800C54FCB /* SlotData.c */; };
-		76AAA4381D1811A700C54FCB /* TransformConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3E01D180FA800C54FCB /* TransformConstraint.c */; };
-		76AAA4391D1811A700C54FCB /* TransformConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3E11D180FA800C54FCB /* TransformConstraintData.c */; };
-		76AAA43A1D1811A700C54FCB /* WeightedMeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3E21D180FA800C54FCB /* WeightedMeshAttachment.c */; };
 		76AAA43B1D1811B000C54FCB /* AppDelegate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3B31D180F7C00C54FCB /* AppDelegate.cpp */; };
 		76AAA43C1D1811B000C54FCB /* AppDelegate.h in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3B41D180F7C00C54FCB /* AppDelegate.h */; };
 		76AAA43D1D1811B000C54FCB /* AppMacros.h in Sources */ = {isa = PBXBuildFile; fileRef = 76AAA3B51D180F7C00C54FCB /* AppMacros.h */; };
@@ -149,6 +92,72 @@
 		76AAA45E1D18132D00C54FCB /* iphone in Resources */ = {isa = PBXBuildFile; fileRef = 76AAA4551D18132D00C54FCB /* iphone */; };
 		76AAA45F1D18132D00C54FCB /* iphone-retina in Resources */ = {isa = PBXBuildFile; fileRef = 76AAA4561D18132D00C54FCB /* iphone-retina */; };
 		76AAA4601D18132D00C54FCB /* iphone-retina in Resources */ = {isa = PBXBuildFile; fileRef = 76AAA4561D18132D00C54FCB /* iphone-retina */; };
+		76F5BD141D2BB57F005917E5 /* Animation.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF41D2BB57F005917E5 /* Animation.c */; };
+		76F5BD151D2BB57F005917E5 /* AnimationState.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF51D2BB57F005917E5 /* AnimationState.c */; };
+		76F5BD161D2BB57F005917E5 /* AnimationStateData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF61D2BB57F005917E5 /* AnimationStateData.c */; };
+		76F5BD171D2BB57F005917E5 /* Atlas.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF71D2BB57F005917E5 /* Atlas.c */; };
+		76F5BD181D2BB57F005917E5 /* AtlasAttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF81D2BB57F005917E5 /* AtlasAttachmentLoader.c */; };
+		76F5BD191D2BB57F005917E5 /* Attachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF91D2BB57F005917E5 /* Attachment.c */; };
+		76F5BD1A1D2BB57F005917E5 /* AttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFA1D2BB57F005917E5 /* AttachmentLoader.c */; };
+		76F5BD1B1D2BB57F005917E5 /* Bone.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFB1D2BB57F005917E5 /* Bone.c */; };
+		76F5BD1C1D2BB57F005917E5 /* BoneData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFC1D2BB57F005917E5 /* BoneData.c */; };
+		76F5BD1D1D2BB57F005917E5 /* BoundingBoxAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFD1D2BB57F005917E5 /* BoundingBoxAttachment.c */; };
+		76F5BD1E1D2BB57F005917E5 /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFE1D2BB57F005917E5 /* Event.c */; };
+		76F5BD1F1D2BB57F005917E5 /* EventData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFF1D2BB57F005917E5 /* EventData.c */; };
+		76F5BD201D2BB57F005917E5 /* extension.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD001D2BB57F005917E5 /* extension.c */; };
+		76F5BD211D2BB57F005917E5 /* IkConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD011D2BB57F005917E5 /* IkConstraint.c */; };
+		76F5BD221D2BB57F005917E5 /* IkConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD021D2BB57F005917E5 /* IkConstraintData.c */; };
+		76F5BD231D2BB57F005917E5 /* Json.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD031D2BB57F005917E5 /* Json.c */; };
+		76F5BD241D2BB57F005917E5 /* MeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD051D2BB57F005917E5 /* MeshAttachment.c */; };
+		76F5BD251D2BB57F005917E5 /* PathAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD061D2BB57F005917E5 /* PathAttachment.c */; };
+		76F5BD261D2BB57F005917E5 /* PathConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD071D2BB57F005917E5 /* PathConstraint.c */; };
+		76F5BD271D2BB57F005917E5 /* PathConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD081D2BB57F005917E5 /* PathConstraintData.c */; };
+		76F5BD281D2BB57F005917E5 /* RegionAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD091D2BB57F005917E5 /* RegionAttachment.c */; };
+		76F5BD291D2BB57F005917E5 /* Skeleton.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0A1D2BB57F005917E5 /* Skeleton.c */; };
+		76F5BD2A1D2BB57F005917E5 /* SkeletonBounds.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0B1D2BB57F005917E5 /* SkeletonBounds.c */; };
+		76F5BD2B1D2BB57F005917E5 /* SkeletonData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0C1D2BB57F005917E5 /* SkeletonData.c */; };
+		76F5BD2C1D2BB57F005917E5 /* SkeletonJson.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0D1D2BB57F005917E5 /* SkeletonJson.c */; };
+		76F5BD2D1D2BB57F005917E5 /* Skin.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0E1D2BB57F005917E5 /* Skin.c */; };
+		76F5BD2E1D2BB57F005917E5 /* Slot.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0F1D2BB57F005917E5 /* Slot.c */; };
+		76F5BD2F1D2BB57F005917E5 /* SlotData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD101D2BB57F005917E5 /* SlotData.c */; };
+		76F5BD301D2BB57F005917E5 /* TransformConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD111D2BB57F005917E5 /* TransformConstraint.c */; };
+		76F5BD311D2BB57F005917E5 /* TransformConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD121D2BB57F005917E5 /* TransformConstraintData.c */; };
+		76F5BD321D2BB57F005917E5 /* VertexAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD131D2BB57F005917E5 /* VertexAttachment.c */; };
+		76F5BD331D2BD4A9005917E5 /* Animation.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF41D2BB57F005917E5 /* Animation.c */; };
+		76F5BD341D2BD4A9005917E5 /* AnimationState.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF51D2BB57F005917E5 /* AnimationState.c */; };
+		76F5BD351D2BD4A9005917E5 /* AnimationStateData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF61D2BB57F005917E5 /* AnimationStateData.c */; };
+		76F5BD361D2BD4A9005917E5 /* Atlas.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF71D2BB57F005917E5 /* Atlas.c */; };
+		76F5BD371D2BD4A9005917E5 /* AtlasAttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF81D2BB57F005917E5 /* AtlasAttachmentLoader.c */; };
+		76F5BD381D2BD4A9005917E5 /* Attachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCF91D2BB57F005917E5 /* Attachment.c */; };
+		76F5BD391D2BD4A9005917E5 /* AttachmentLoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFA1D2BB57F005917E5 /* AttachmentLoader.c */; };
+		76F5BD3A1D2BD4A9005917E5 /* Bone.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFB1D2BB57F005917E5 /* Bone.c */; };
+		76F5BD3B1D2BD4A9005917E5 /* BoneData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFC1D2BB57F005917E5 /* BoneData.c */; };
+		76F5BD3C1D2BD4A9005917E5 /* BoundingBoxAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFD1D2BB57F005917E5 /* BoundingBoxAttachment.c */; };
+		76F5BD3D1D2BD4A9005917E5 /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFE1D2BB57F005917E5 /* Event.c */; };
+		76F5BD3E1D2BD4A9005917E5 /* EventData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BCFF1D2BB57F005917E5 /* EventData.c */; };
+		76F5BD3F1D2BD4A9005917E5 /* extension.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD001D2BB57F005917E5 /* extension.c */; };
+		76F5BD401D2BD4A9005917E5 /* IkConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD011D2BB57F005917E5 /* IkConstraint.c */; };
+		76F5BD411D2BD4A9005917E5 /* IkConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD021D2BB57F005917E5 /* IkConstraintData.c */; };
+		76F5BD421D2BD4A9005917E5 /* Json.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD031D2BB57F005917E5 /* Json.c */; };
+		76F5BD431D2BD4A9005917E5 /* Json.h in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD041D2BB57F005917E5 /* Json.h */; };
+		76F5BD441D2BD4A9005917E5 /* MeshAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD051D2BB57F005917E5 /* MeshAttachment.c */; };
+		76F5BD451D2BD4A9005917E5 /* PathAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD061D2BB57F005917E5 /* PathAttachment.c */; };
+		76F5BD461D2BD4A9005917E5 /* PathConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD071D2BB57F005917E5 /* PathConstraint.c */; };
+		76F5BD471D2BD4A9005917E5 /* PathConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD081D2BB57F005917E5 /* PathConstraintData.c */; };
+		76F5BD481D2BD4A9005917E5 /* RegionAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD091D2BB57F005917E5 /* RegionAttachment.c */; };
+		76F5BD491D2BD4A9005917E5 /* Skeleton.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0A1D2BB57F005917E5 /* Skeleton.c */; };
+		76F5BD4A1D2BD4A9005917E5 /* SkeletonBounds.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0B1D2BB57F005917E5 /* SkeletonBounds.c */; };
+		76F5BD4B1D2BD4A9005917E5 /* SkeletonData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0C1D2BB57F005917E5 /* SkeletonData.c */; };
+		76F5BD4C1D2BD4A9005917E5 /* SkeletonJson.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0D1D2BB57F005917E5 /* SkeletonJson.c */; };
+		76F5BD4D1D2BD4A9005917E5 /* Skin.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0E1D2BB57F005917E5 /* Skin.c */; };
+		76F5BD4E1D2BD4A9005917E5 /* Slot.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD0F1D2BB57F005917E5 /* Slot.c */; };
+		76F5BD4F1D2BD4A9005917E5 /* SlotData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD101D2BB57F005917E5 /* SlotData.c */; };
+		76F5BD501D2BD4A9005917E5 /* TransformConstraint.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD111D2BB57F005917E5 /* TransformConstraint.c */; };
+		76F5BD511D2BD4A9005917E5 /* TransformConstraintData.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD121D2BB57F005917E5 /* TransformConstraintData.c */; };
+		76F5BD521D2BD4A9005917E5 /* VertexAttachment.c in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD131D2BB57F005917E5 /* VertexAttachment.c */; };
+		76F5BD551D2BD7D3005917E5 /* TankExample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD531D2BD7D3005917E5 /* TankExample.cpp */; };
+		76F5BD561D2BD7EF005917E5 /* TankExample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD531D2BD7D3005917E5 /* TankExample.cpp */; };
+		76F5BD571D2BD7EF005917E5 /* TankExample.h in Sources */ = {isa = PBXBuildFile; fileRef = 76F5BD541D2BD7D3005917E5 /* TankExample.h */; };
 		8262943E1AAF051F00CB7CF7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8262943D1AAF051F00CB7CF7 /* Security.framework */; };
 		BF171245129291EC00B8313A /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF170DB012928DE900B8313A /* OpenGLES.framework */; };
 		BF1712471292920000B8313A /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = BF170DB412928DE900B8313A /* libz.dylib */; };
@@ -254,35 +263,6 @@
 		76AAA3BD1D180F7C00C54FCB /* SimpleCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleCommand.h; sourceTree = "<group>"; };
 		76AAA3BE1D180F7C00C54FCB /* SpineboyExample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpineboyExample.cpp; sourceTree = "<group>"; };
 		76AAA3BF1D180F7C00C54FCB /* SpineboyExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpineboyExample.h; sourceTree = "<group>"; };
-		76AAA3C61D180FA800C54FCB /* Animation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Animation.c; path = "../../../spine-c/src/spine/Animation.c"; sourceTree = "<group>"; };
-		76AAA3C71D180FA800C54FCB /* AnimationState.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AnimationState.c; path = "../../../spine-c/src/spine/AnimationState.c"; sourceTree = "<group>"; };
-		76AAA3C81D180FA800C54FCB /* AnimationStateData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AnimationStateData.c; path = "../../../spine-c/src/spine/AnimationStateData.c"; sourceTree = "<group>"; };
-		76AAA3C91D180FA800C54FCB /* Atlas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Atlas.c; path = "../../../spine-c/src/spine/Atlas.c"; sourceTree = "<group>"; };
-		76AAA3CA1D180FA800C54FCB /* AtlasAttachmentLoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AtlasAttachmentLoader.c; path = "../../../spine-c/src/spine/AtlasAttachmentLoader.c"; sourceTree = "<group>"; };
-		76AAA3CB1D180FA800C54FCB /* Attachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Attachment.c; path = "../../../spine-c/src/spine/Attachment.c"; sourceTree = "<group>"; };
-		76AAA3CC1D180FA800C54FCB /* AttachmentLoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AttachmentLoader.c; path = "../../../spine-c/src/spine/AttachmentLoader.c"; sourceTree = "<group>"; };
-		76AAA3CD1D180FA800C54FCB /* Bone.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Bone.c; path = "../../../spine-c/src/spine/Bone.c"; sourceTree = "<group>"; };
-		76AAA3CE1D180FA800C54FCB /* BoneData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BoneData.c; path = "../../../spine-c/src/spine/BoneData.c"; sourceTree = "<group>"; };
-		76AAA3CF1D180FA800C54FCB /* BoundingBoxAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BoundingBoxAttachment.c; path = "../../../spine-c/src/spine/BoundingBoxAttachment.c"; sourceTree = "<group>"; };
-		76AAA3D01D180FA800C54FCB /* Event.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Event.c; path = "../../../spine-c/src/spine/Event.c"; sourceTree = "<group>"; };
-		76AAA3D11D180FA800C54FCB /* EventData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = EventData.c; path = "../../../spine-c/src/spine/EventData.c"; sourceTree = "<group>"; };
-		76AAA3D21D180FA800C54FCB /* extension.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = extension.c; path = "../../../spine-c/src/spine/extension.c"; sourceTree = "<group>"; };
-		76AAA3D31D180FA800C54FCB /* IkConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IkConstraint.c; path = "../../../spine-c/src/spine/IkConstraint.c"; sourceTree = "<group>"; };
-		76AAA3D41D180FA800C54FCB /* IkConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IkConstraintData.c; path = "../../../spine-c/src/spine/IkConstraintData.c"; sourceTree = "<group>"; };
-		76AAA3D51D180FA800C54FCB /* Json.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Json.c; path = "../../../spine-c/src/spine/Json.c"; sourceTree = "<group>"; };
-		76AAA3D61D180FA800C54FCB /* Json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Json.h; path = "../../../spine-c/src/spine/Json.h"; sourceTree = "<group>"; };
-		76AAA3D71D180FA800C54FCB /* MeshAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = MeshAttachment.c; path = "../../../spine-c/src/spine/MeshAttachment.c"; sourceTree = "<group>"; };
-		76AAA3D81D180FA800C54FCB /* RegionAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = RegionAttachment.c; path = "../../../spine-c/src/spine/RegionAttachment.c"; sourceTree = "<group>"; };
-		76AAA3D91D180FA800C54FCB /* Skeleton.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Skeleton.c; path = "../../../spine-c/src/spine/Skeleton.c"; sourceTree = "<group>"; };
-		76AAA3DA1D180FA800C54FCB /* SkeletonBounds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonBounds.c; path = "../../../spine-c/src/spine/SkeletonBounds.c"; sourceTree = "<group>"; };
-		76AAA3DB1D180FA800C54FCB /* SkeletonData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonData.c; path = "../../../spine-c/src/spine/SkeletonData.c"; sourceTree = "<group>"; };
-		76AAA3DC1D180FA800C54FCB /* SkeletonJson.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonJson.c; path = "../../../spine-c/src/spine/SkeletonJson.c"; sourceTree = "<group>"; };
-		76AAA3DD1D180FA800C54FCB /* Skin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Skin.c; path = "../../../spine-c/src/spine/Skin.c"; sourceTree = "<group>"; };
-		76AAA3DE1D180FA800C54FCB /* Slot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Slot.c; path = "../../../spine-c/src/spine/Slot.c"; sourceTree = "<group>"; };
-		76AAA3DF1D180FA800C54FCB /* SlotData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SlotData.c; path = "../../../spine-c/src/spine/SlotData.c"; sourceTree = "<group>"; };
-		76AAA3E01D180FA800C54FCB /* TransformConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TransformConstraint.c; path = "../../../spine-c/src/spine/TransformConstraint.c"; sourceTree = "<group>"; };
-		76AAA3E11D180FA800C54FCB /* TransformConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TransformConstraintData.c; path = "../../../spine-c/src/spine/TransformConstraintData.c"; sourceTree = "<group>"; };
-		76AAA3E21D180FA800C54FCB /* WeightedMeshAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = WeightedMeshAttachment.c; path = "../../../spine-c/src/spine/WeightedMeshAttachment.c"; sourceTree = "<group>"; };
 		76AAA4001D18106000C54FCB /* AttachmentVertices.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AttachmentVertices.cpp; path = ../../src/spine/AttachmentVertices.cpp; sourceTree = "<group>"; };
 		76AAA4011D18106000C54FCB /* AttachmentVertices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AttachmentVertices.h; path = ../../src/spine/AttachmentVertices.h; sourceTree = "<group>"; };
 		76AAA4021D18106000C54FCB /* Cocos2dAttachmentLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Cocos2dAttachmentLoader.cpp; path = ../../src/spine/Cocos2dAttachmentLoader.cpp; sourceTree = "<group>"; };
@@ -300,6 +280,40 @@
 		76AAA4541D18132D00C54FCB /* ipad-retina */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "ipad-retina"; sourceTree = "<group>"; };
 		76AAA4551D18132D00C54FCB /* iphone */ = {isa = PBXFileReference; lastKnownFileType = folder; path = iphone; sourceTree = "<group>"; };
 		76AAA4561D18132D00C54FCB /* iphone-retina */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "iphone-retina"; sourceTree = "<group>"; };
+		76F5BCF41D2BB57F005917E5 /* Animation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Animation.c; path = "../../../spine-c/src/spine/Animation.c"; sourceTree = "<group>"; };
+		76F5BCF51D2BB57F005917E5 /* AnimationState.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AnimationState.c; path = "../../../spine-c/src/spine/AnimationState.c"; sourceTree = "<group>"; };
+		76F5BCF61D2BB57F005917E5 /* AnimationStateData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AnimationStateData.c; path = "../../../spine-c/src/spine/AnimationStateData.c"; sourceTree = "<group>"; };
+		76F5BCF71D2BB57F005917E5 /* Atlas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Atlas.c; path = "../../../spine-c/src/spine/Atlas.c"; sourceTree = "<group>"; };
+		76F5BCF81D2BB57F005917E5 /* AtlasAttachmentLoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AtlasAttachmentLoader.c; path = "../../../spine-c/src/spine/AtlasAttachmentLoader.c"; sourceTree = "<group>"; };
+		76F5BCF91D2BB57F005917E5 /* Attachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Attachment.c; path = "../../../spine-c/src/spine/Attachment.c"; sourceTree = "<group>"; };
+		76F5BCFA1D2BB57F005917E5 /* AttachmentLoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AttachmentLoader.c; path = "../../../spine-c/src/spine/AttachmentLoader.c"; sourceTree = "<group>"; };
+		76F5BCFB1D2BB57F005917E5 /* Bone.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Bone.c; path = "../../../spine-c/src/spine/Bone.c"; sourceTree = "<group>"; };
+		76F5BCFC1D2BB57F005917E5 /* BoneData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BoneData.c; path = "../../../spine-c/src/spine/BoneData.c"; sourceTree = "<group>"; };
+		76F5BCFD1D2BB57F005917E5 /* BoundingBoxAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BoundingBoxAttachment.c; path = "../../../spine-c/src/spine/BoundingBoxAttachment.c"; sourceTree = "<group>"; };
+		76F5BCFE1D2BB57F005917E5 /* Event.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Event.c; path = "../../../spine-c/src/spine/Event.c"; sourceTree = "<group>"; };
+		76F5BCFF1D2BB57F005917E5 /* EventData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = EventData.c; path = "../../../spine-c/src/spine/EventData.c"; sourceTree = "<group>"; };
+		76F5BD001D2BB57F005917E5 /* extension.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = extension.c; path = "../../../spine-c/src/spine/extension.c"; sourceTree = "<group>"; };
+		76F5BD011D2BB57F005917E5 /* IkConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IkConstraint.c; path = "../../../spine-c/src/spine/IkConstraint.c"; sourceTree = "<group>"; };
+		76F5BD021D2BB57F005917E5 /* IkConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IkConstraintData.c; path = "../../../spine-c/src/spine/IkConstraintData.c"; sourceTree = "<group>"; };
+		76F5BD031D2BB57F005917E5 /* Json.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Json.c; path = "../../../spine-c/src/spine/Json.c"; sourceTree = "<group>"; };
+		76F5BD041D2BB57F005917E5 /* Json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Json.h; path = "../../../spine-c/src/spine/Json.h"; sourceTree = "<group>"; };
+		76F5BD051D2BB57F005917E5 /* MeshAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = MeshAttachment.c; path = "../../../spine-c/src/spine/MeshAttachment.c"; sourceTree = "<group>"; };
+		76F5BD061D2BB57F005917E5 /* PathAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = PathAttachment.c; path = "../../../spine-c/src/spine/PathAttachment.c"; sourceTree = "<group>"; };
+		76F5BD071D2BB57F005917E5 /* PathConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = PathConstraint.c; path = "../../../spine-c/src/spine/PathConstraint.c"; sourceTree = "<group>"; };
+		76F5BD081D2BB57F005917E5 /* PathConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = PathConstraintData.c; path = "../../../spine-c/src/spine/PathConstraintData.c"; sourceTree = "<group>"; };
+		76F5BD091D2BB57F005917E5 /* RegionAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = RegionAttachment.c; path = "../../../spine-c/src/spine/RegionAttachment.c"; sourceTree = "<group>"; };
+		76F5BD0A1D2BB57F005917E5 /* Skeleton.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Skeleton.c; path = "../../../spine-c/src/spine/Skeleton.c"; sourceTree = "<group>"; };
+		76F5BD0B1D2BB57F005917E5 /* SkeletonBounds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonBounds.c; path = "../../../spine-c/src/spine/SkeletonBounds.c"; sourceTree = "<group>"; };
+		76F5BD0C1D2BB57F005917E5 /* SkeletonData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonData.c; path = "../../../spine-c/src/spine/SkeletonData.c"; sourceTree = "<group>"; };
+		76F5BD0D1D2BB57F005917E5 /* SkeletonJson.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkeletonJson.c; path = "../../../spine-c/src/spine/SkeletonJson.c"; sourceTree = "<group>"; };
+		76F5BD0E1D2BB57F005917E5 /* Skin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Skin.c; path = "../../../spine-c/src/spine/Skin.c"; sourceTree = "<group>"; };
+		76F5BD0F1D2BB57F005917E5 /* Slot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Slot.c; path = "../../../spine-c/src/spine/Slot.c"; sourceTree = "<group>"; };
+		76F5BD101D2BB57F005917E5 /* SlotData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SlotData.c; path = "../../../spine-c/src/spine/SlotData.c"; sourceTree = "<group>"; };
+		76F5BD111D2BB57F005917E5 /* TransformConstraint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TransformConstraint.c; path = "../../../spine-c/src/spine/TransformConstraint.c"; sourceTree = "<group>"; };
+		76F5BD121D2BB57F005917E5 /* TransformConstraintData.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TransformConstraintData.c; path = "../../../spine-c/src/spine/TransformConstraintData.c"; sourceTree = "<group>"; };
+		76F5BD131D2BB57F005917E5 /* VertexAttachment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = VertexAttachment.c; path = "../../../spine-c/src/spine/VertexAttachment.c"; sourceTree = "<group>"; };
+		76F5BD531D2BD7D3005917E5 /* TankExample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TankExample.cpp; sourceTree = "<group>"; };
+		76F5BD541D2BD7D3005917E5 /* TankExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TankExample.h; sourceTree = "<group>"; };
 		8262943D1AAF051F00CB7CF7 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
 		BF170DB012928DE900B8313A /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
 		BF170DB412928DE900B8313A /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
@@ -447,6 +461,8 @@
 		46880B8319C43A87006E1F66 /* Classes */ = {
 			isa = PBXGroup;
 			children = (
+				76F5BD531D2BD7D3005917E5 /* TankExample.cpp */,
+				76F5BD541D2BD7D3005917E5 /* TankExample.h */,
 				76AAA3B31D180F7C00C54FCB /* AppDelegate.cpp */,
 				76AAA3B41D180F7C00C54FCB /* AppDelegate.h */,
 				76AAA3B51D180F7C00C54FCB /* AppMacros.h */,
@@ -515,35 +531,38 @@
 		76AAA3B21D180F7300C54FCB /* spine */ = {
 			isa = PBXGroup;
 			children = (
-				76AAA3C61D180FA800C54FCB /* Animation.c */,
-				76AAA3C71D180FA800C54FCB /* AnimationState.c */,
-				76AAA3C81D180FA800C54FCB /* AnimationStateData.c */,
-				76AAA3C91D180FA800C54FCB /* Atlas.c */,
-				76AAA3CA1D180FA800C54FCB /* AtlasAttachmentLoader.c */,
-				76AAA3CB1D180FA800C54FCB /* Attachment.c */,
-				76AAA3CC1D180FA800C54FCB /* AttachmentLoader.c */,
-				76AAA3CD1D180FA800C54FCB /* Bone.c */,
-				76AAA3CE1D180FA800C54FCB /* BoneData.c */,
-				76AAA3CF1D180FA800C54FCB /* BoundingBoxAttachment.c */,
-				76AAA3D01D180FA800C54FCB /* Event.c */,
-				76AAA3D11D180FA800C54FCB /* EventData.c */,
-				76AAA3D21D180FA800C54FCB /* extension.c */,
-				76AAA3D31D180FA800C54FCB /* IkConstraint.c */,
-				76AAA3D41D180FA800C54FCB /* IkConstraintData.c */,
-				76AAA3D51D180FA800C54FCB /* Json.c */,
-				76AAA3D61D180FA800C54FCB /* Json.h */,
-				76AAA3D71D180FA800C54FCB /* MeshAttachment.c */,
-				76AAA3D81D180FA800C54FCB /* RegionAttachment.c */,
-				76AAA3D91D180FA800C54FCB /* Skeleton.c */,
-				76AAA3DA1D180FA800C54FCB /* SkeletonBounds.c */,
-				76AAA3DB1D180FA800C54FCB /* SkeletonData.c */,
-				76AAA3DC1D180FA800C54FCB /* SkeletonJson.c */,
-				76AAA3DD1D180FA800C54FCB /* Skin.c */,
-				76AAA3DE1D180FA800C54FCB /* Slot.c */,
-				76AAA3DF1D180FA800C54FCB /* SlotData.c */,
-				76AAA3E01D180FA800C54FCB /* TransformConstraint.c */,
-				76AAA3E11D180FA800C54FCB /* TransformConstraintData.c */,
-				76AAA3E21D180FA800C54FCB /* WeightedMeshAttachment.c */,
+				76F5BCF41D2BB57F005917E5 /* Animation.c */,
+				76F5BCF51D2BB57F005917E5 /* AnimationState.c */,
+				76F5BCF61D2BB57F005917E5 /* AnimationStateData.c */,
+				76F5BCF71D2BB57F005917E5 /* Atlas.c */,
+				76F5BCF81D2BB57F005917E5 /* AtlasAttachmentLoader.c */,
+				76F5BCF91D2BB57F005917E5 /* Attachment.c */,
+				76F5BCFA1D2BB57F005917E5 /* AttachmentLoader.c */,
+				76F5BCFB1D2BB57F005917E5 /* Bone.c */,
+				76F5BCFC1D2BB57F005917E5 /* BoneData.c */,
+				76F5BCFD1D2BB57F005917E5 /* BoundingBoxAttachment.c */,
+				76F5BCFE1D2BB57F005917E5 /* Event.c */,
+				76F5BCFF1D2BB57F005917E5 /* EventData.c */,
+				76F5BD001D2BB57F005917E5 /* extension.c */,
+				76F5BD011D2BB57F005917E5 /* IkConstraint.c */,
+				76F5BD021D2BB57F005917E5 /* IkConstraintData.c */,
+				76F5BD031D2BB57F005917E5 /* Json.c */,
+				76F5BD041D2BB57F005917E5 /* Json.h */,
+				76F5BD051D2BB57F005917E5 /* MeshAttachment.c */,
+				76F5BD061D2BB57F005917E5 /* PathAttachment.c */,
+				76F5BD071D2BB57F005917E5 /* PathConstraint.c */,
+				76F5BD081D2BB57F005917E5 /* PathConstraintData.c */,
+				76F5BD091D2BB57F005917E5 /* RegionAttachment.c */,
+				76F5BD0A1D2BB57F005917E5 /* Skeleton.c */,
+				76F5BD0B1D2BB57F005917E5 /* SkeletonBounds.c */,
+				76F5BD0C1D2BB57F005917E5 /* SkeletonData.c */,
+				76F5BD0D1D2BB57F005917E5 /* SkeletonJson.c */,
+				76F5BD0E1D2BB57F005917E5 /* Skin.c */,
+				76F5BD0F1D2BB57F005917E5 /* Slot.c */,
+				76F5BD101D2BB57F005917E5 /* SlotData.c */,
+				76F5BD111D2BB57F005917E5 /* TransformConstraint.c */,
+				76F5BD121D2BB57F005917E5 /* TransformConstraintData.c */,
+				76F5BD131D2BB57F005917E5 /* VertexAttachment.c */,
 			);
 			name = spine;
 			sourceTree = "<group>";
@@ -715,49 +734,53 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				76AAA3E61D180FA800C54FCB /* Atlas.c in Sources */,
+				76F5BD221D2BB57F005917E5 /* IkConstraintData.c in Sources */,
+				76F5BD1E1D2BB57F005917E5 /* Event.c in Sources */,
+				76F5BD311D2BB57F005917E5 /* TransformConstraintData.c in Sources */,
+				76F5BD1B1D2BB57F005917E5 /* Bone.c in Sources */,
+				76F5BD171D2BB57F005917E5 /* Atlas.c in Sources */,
 				76AAA40C1D18106000C54FCB /* AttachmentVertices.cpp in Sources */,
-				76AAA3EA1D180FA800C54FCB /* Bone.c in Sources */,
-				76AAA3ED1D180FA800C54FCB /* Event.c in Sources */,
-				76AAA3E31D180FA800C54FCB /* Animation.c in Sources */,
-				76AAA3F81D180FA800C54FCB /* SkeletonJson.c in Sources */,
+				76F5BD551D2BD7D3005917E5 /* TankExample.cpp in Sources */,
+				76F5BD321D2BB57F005917E5 /* VertexAttachment.c in Sources */,
 				76AAA3C51D180F7C00C54FCB /* SpineboyExample.cpp in Sources */,
-				76AAA3F21D180FA800C54FCB /* Json.c in Sources */,
-				76AAA3F71D180FA800C54FCB /* SkeletonData.c in Sources */,
-				76AAA3E91D180FA800C54FCB /* AttachmentLoader.c in Sources */,
-				76AAA3F11D180FA800C54FCB /* IkConstraintData.c in Sources */,
-				76AAA3F51D180FA800C54FCB /* Skeleton.c in Sources */,
-				76AAA3FE1D180FA800C54FCB /* WeightedMeshAttachment.c in Sources */,
-				76AAA3EB1D180FA800C54FCB /* BoneData.c in Sources */,
-				76AAA3F91D180FA800C54FCB /* Skin.c in Sources */,
+				76F5BD2C1D2BB57F005917E5 /* SkeletonJson.c in Sources */,
+				76F5BD2E1D2BB57F005917E5 /* Slot.c in Sources */,
+				76F5BD251D2BB57F005917E5 /* PathAttachment.c in Sources */,
+				76F5BD1D1D2BB57F005917E5 /* BoundingBoxAttachment.c in Sources */,
+				76F5BD161D2BB57F005917E5 /* AnimationStateData.c in Sources */,
 				76AAA3C11D180F7C00C54FCB /* BatchingExample.cpp in Sources */,
+				76F5BD2D1D2BB57F005917E5 /* Skin.c in Sources */,
 				76AAA40D1D18106000C54FCB /* Cocos2dAttachmentLoader.cpp in Sources */,
-				76AAA3E41D180FA800C54FCB /* AnimationState.c in Sources */,
-				76AAA3EF1D180FA800C54FCB /* extension.c in Sources */,
-				76AAA3FA1D180FA800C54FCB /* Slot.c in Sources */,
-				76AAA3FC1D180FA800C54FCB /* TransformConstraint.c in Sources */,
 				76AAA40F1D18106000C54FCB /* SkeletonBatch.cpp in Sources */,
-				76AAA3F01D180FA800C54FCB /* IkConstraint.c in Sources */,
+				76F5BD211D2BB57F005917E5 /* IkConstraint.c in Sources */,
+				76F5BD1F1D2BB57F005917E5 /* EventData.c in Sources */,
+				76F5BD1A1D2BB57F005917E5 /* AttachmentLoader.c in Sources */,
 				76AAA3C31D180F7C00C54FCB /* RaptorExample.cpp in Sources */,
-				76AAA3F61D180FA800C54FCB /* SkeletonBounds.c in Sources */,
-				76AAA3EC1D180FA800C54FCB /* BoundingBoxAttachment.c in Sources */,
+				76F5BD281D2BB57F005917E5 /* RegionAttachment.c in Sources */,
+				76F5BD2A1D2BB57F005917E5 /* SkeletonBounds.c in Sources */,
+				76F5BD201D2BB57F005917E5 /* extension.c in Sources */,
 				76AAA3C01D180F7C00C54FCB /* AppDelegate.cpp in Sources */,
 				76AAA3C41D180F7C00C54FCB /* SimpleCommand.cpp in Sources */,
+				76F5BD261D2BB57F005917E5 /* PathConstraint.c in Sources */,
 				503AE10017EB989F00D1A890 /* AppController.mm in Sources */,
-				76AAA3E81D180FA800C54FCB /* Attachment.c in Sources */,
-				76AAA3F31D180FA800C54FCB /* MeshAttachment.c in Sources */,
-				76AAA3E71D180FA800C54FCB /* AtlasAttachmentLoader.c in Sources */,
-				76AAA3FB1D180FA800C54FCB /* SlotData.c in Sources */,
-				76AAA3FD1D180FA800C54FCB /* TransformConstraintData.c in Sources */,
-				76AAA3EE1D180FA800C54FCB /* EventData.c in Sources */,
-				76AAA3E51D180FA800C54FCB /* AnimationStateData.c in Sources */,
 				76AAA40E1D18106000C54FCB /* SkeletonAnimation.cpp in Sources */,
 				76AAA4111D18106000C54FCB /* spine-cocos2dx.cpp in Sources */,
+				76F5BD181D2BB57F005917E5 /* AtlasAttachmentLoader.c in Sources */,
+				76F5BD151D2BB57F005917E5 /* AnimationState.c in Sources */,
+				76F5BD2F1D2BB57F005917E5 /* SlotData.c in Sources */,
+				76F5BD271D2BB57F005917E5 /* PathConstraintData.c in Sources */,
+				76F5BD291D2BB57F005917E5 /* Skeleton.c in Sources */,
+				76F5BD241D2BB57F005917E5 /* MeshAttachment.c in Sources */,
+				76F5BD1C1D2BB57F005917E5 /* BoneData.c in Sources */,
 				76AAA3C21D180F7C00C54FCB /* GoblinsExample.cpp in Sources */,
+				76F5BD141D2BB57F005917E5 /* Animation.c in Sources */,
+				76F5BD2B1D2BB57F005917E5 /* SkeletonData.c in Sources */,
 				503AE10217EB989F00D1A890 /* RootViewController.mm in Sources */,
-				76AAA3F41D180FA800C54FCB /* RegionAttachment.c in Sources */,
+				76F5BD191D2BB57F005917E5 /* Attachment.c in Sources */,
+				76F5BD231D2BB57F005917E5 /* Json.c in Sources */,
 				503AE10117EB989F00D1A890 /* main.m in Sources */,
 				76AAA4101D18106000C54FCB /* SkeletonRenderer.cpp in Sources */,
+				76F5BD301D2BB57F005917E5 /* TransformConstraint.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -765,6 +788,40 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				76F5BD561D2BD7EF005917E5 /* TankExample.cpp in Sources */,
+				76F5BD571D2BD7EF005917E5 /* TankExample.h in Sources */,
+				76F5BD331D2BD4A9005917E5 /* Animation.c in Sources */,
+				76F5BD341D2BD4A9005917E5 /* AnimationState.c in Sources */,
+				76F5BD351D2BD4A9005917E5 /* AnimationStateData.c in Sources */,
+				76F5BD361D2BD4A9005917E5 /* Atlas.c in Sources */,
+				76F5BD371D2BD4A9005917E5 /* AtlasAttachmentLoader.c in Sources */,
+				76F5BD381D2BD4A9005917E5 /* Attachment.c in Sources */,
+				76F5BD391D2BD4A9005917E5 /* AttachmentLoader.c in Sources */,
+				76F5BD3A1D2BD4A9005917E5 /* Bone.c in Sources */,
+				76F5BD3B1D2BD4A9005917E5 /* BoneData.c in Sources */,
+				76F5BD3C1D2BD4A9005917E5 /* BoundingBoxAttachment.c in Sources */,
+				76F5BD3D1D2BD4A9005917E5 /* Event.c in Sources */,
+				76F5BD3E1D2BD4A9005917E5 /* EventData.c in Sources */,
+				76F5BD3F1D2BD4A9005917E5 /* extension.c in Sources */,
+				76F5BD401D2BD4A9005917E5 /* IkConstraint.c in Sources */,
+				76F5BD411D2BD4A9005917E5 /* IkConstraintData.c in Sources */,
+				76F5BD421D2BD4A9005917E5 /* Json.c in Sources */,
+				76F5BD431D2BD4A9005917E5 /* Json.h in Sources */,
+				76F5BD441D2BD4A9005917E5 /* MeshAttachment.c in Sources */,
+				76F5BD451D2BD4A9005917E5 /* PathAttachment.c in Sources */,
+				76F5BD461D2BD4A9005917E5 /* PathConstraint.c in Sources */,
+				76F5BD471D2BD4A9005917E5 /* PathConstraintData.c in Sources */,
+				76F5BD481D2BD4A9005917E5 /* RegionAttachment.c in Sources */,
+				76F5BD491D2BD4A9005917E5 /* Skeleton.c in Sources */,
+				76F5BD4A1D2BD4A9005917E5 /* SkeletonBounds.c in Sources */,
+				76F5BD4B1D2BD4A9005917E5 /* SkeletonData.c in Sources */,
+				76F5BD4C1D2BD4A9005917E5 /* SkeletonJson.c in Sources */,
+				76F5BD4D1D2BD4A9005917E5 /* Skin.c in Sources */,
+				76F5BD4E1D2BD4A9005917E5 /* Slot.c in Sources */,
+				76F5BD4F1D2BD4A9005917E5 /* SlotData.c in Sources */,
+				76F5BD501D2BD4A9005917E5 /* TransformConstraint.c in Sources */,
+				76F5BD511D2BD4A9005917E5 /* TransformConstraintData.c in Sources */,
+				76F5BD521D2BD4A9005917E5 /* VertexAttachment.c in Sources */,
 				76AAA43B1D1811B000C54FCB /* AppDelegate.cpp in Sources */,
 				76AAA43C1D1811B000C54FCB /* AppDelegate.h in Sources */,
 				76AAA43D1D1811B000C54FCB /* AppMacros.h in Sources */,
@@ -778,35 +835,6 @@
 				76AAA4451D1811B000C54FCB /* SimpleCommand.h in Sources */,
 				76AAA4461D1811B000C54FCB /* SpineboyExample.cpp in Sources */,
 				76AAA4471D1811B000C54FCB /* SpineboyExample.h in Sources */,
-				76AAA41E1D1811A700C54FCB /* Animation.c in Sources */,
-				76AAA41F1D1811A700C54FCB /* AnimationState.c in Sources */,
-				76AAA4201D1811A700C54FCB /* AnimationStateData.c in Sources */,
-				76AAA4211D1811A700C54FCB /* Atlas.c in Sources */,
-				76AAA4221D1811A700C54FCB /* AtlasAttachmentLoader.c in Sources */,
-				76AAA4231D1811A700C54FCB /* Attachment.c in Sources */,
-				76AAA4241D1811A700C54FCB /* AttachmentLoader.c in Sources */,
-				76AAA4251D1811A700C54FCB /* Bone.c in Sources */,
-				76AAA4261D1811A700C54FCB /* BoneData.c in Sources */,
-				76AAA4271D1811A700C54FCB /* BoundingBoxAttachment.c in Sources */,
-				76AAA4281D1811A700C54FCB /* Event.c in Sources */,
-				76AAA4291D1811A700C54FCB /* EventData.c in Sources */,
-				76AAA42A1D1811A700C54FCB /* extension.c in Sources */,
-				76AAA42B1D1811A700C54FCB /* IkConstraint.c in Sources */,
-				76AAA42C1D1811A700C54FCB /* IkConstraintData.c in Sources */,
-				76AAA42D1D1811A700C54FCB /* Json.c in Sources */,
-				76AAA42E1D1811A700C54FCB /* Json.h in Sources */,
-				76AAA42F1D1811A700C54FCB /* MeshAttachment.c in Sources */,
-				76AAA4301D1811A700C54FCB /* RegionAttachment.c in Sources */,
-				76AAA4311D1811A700C54FCB /* Skeleton.c in Sources */,
-				76AAA4321D1811A700C54FCB /* SkeletonBounds.c in Sources */,
-				76AAA4331D1811A700C54FCB /* SkeletonData.c in Sources */,
-				76AAA4341D1811A700C54FCB /* SkeletonJson.c in Sources */,
-				76AAA4351D1811A700C54FCB /* Skin.c in Sources */,
-				76AAA4361D1811A700C54FCB /* Slot.c in Sources */,
-				76AAA4371D1811A700C54FCB /* SlotData.c in Sources */,
-				76AAA4381D1811A700C54FCB /* TransformConstraint.c in Sources */,
-				76AAA4391D1811A700C54FCB /* TransformConstraintData.c in Sources */,
-				76AAA43A1D1811A700C54FCB /* WeightedMeshAttachment.c in Sources */,
 				76AAA4121D18119F00C54FCB /* AttachmentVertices.cpp in Sources */,
 				76AAA4131D18119F00C54FCB /* AttachmentVertices.h in Sources */,
 				76AAA4141D18119F00C54FCB /* Cocos2dAttachmentLoader.cpp in Sources */,

+ 10 - 2
spine-cocos2dx/example/proj.win32/spine-cocos2d-x.vcxproj

@@ -162,6 +162,9 @@ xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
     <ClCompile Include="..\..\..\spine-c\src\spine\IkConstraintData.c" />
     <ClCompile Include="..\..\..\spine-c\src\spine\Json.c" />
     <ClCompile Include="..\..\..\spine-c\src\spine\MeshAttachment.c" />
+    <ClCompile Include="..\..\..\spine-c\src\spine\PathAttachment.c" />
+    <ClCompile Include="..\..\..\spine-c\src\spine\PathConstraint.c" />
+    <ClCompile Include="..\..\..\spine-c\src\spine\PathConstraintData.c" />
     <ClCompile Include="..\..\..\spine-c\src\spine\RegionAttachment.c" />
     <ClCompile Include="..\..\..\spine-c\src\spine\Skeleton.c" />
     <ClCompile Include="..\..\..\spine-c\src\spine\SkeletonBounds.c" />
@@ -172,7 +175,7 @@ xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
     <ClCompile Include="..\..\..\spine-c\src\spine\SlotData.c" />
     <ClCompile Include="..\..\..\spine-c\src\spine\TransformConstraint.c" />
     <ClCompile Include="..\..\..\spine-c\src\spine\TransformConstraintData.c" />
-    <ClCompile Include="..\..\..\spine-c\src\spine\WeightedMeshAttachment.c" />
+    <ClCompile Include="..\..\..\spine-c\src\spine\VertexAttachment.c" />
     <ClCompile Include="..\..\src\spine\AttachmentVertices.cpp" />
     <ClCompile Include="..\..\src\spine\Cocos2dAttachmentLoader.cpp" />
     <ClCompile Include="..\..\src\spine\SkeletonAnimation.cpp" />
@@ -185,6 +188,7 @@ xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
     <ClCompile Include="..\Classes\RaptorExample.cpp" />
     <ClCompile Include="..\Classes\SimpleCommand.cpp" />
     <ClCompile Include="..\Classes\SpineboyExample.cpp" />
+    <ClCompile Include="..\Classes\TankExample.cpp" />
     <ClCompile Include="main.cpp" />
   </ItemGroup>
   <ItemGroup>
@@ -204,6 +208,9 @@ xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
     <ClInclude Include="..\..\..\spine-c\include\spine\IkConstraint.h" />
     <ClInclude Include="..\..\..\spine-c\include\spine\IkConstraintData.h" />
     <ClInclude Include="..\..\..\spine-c\include\spine\MeshAttachment.h" />
+    <ClInclude Include="..\..\..\spine-c\include\spine\PathAttachment.h" />
+    <ClInclude Include="..\..\..\spine-c\include\spine\PathConstraint.h" />
+    <ClInclude Include="..\..\..\spine-c\include\spine\PathConstraintData.h" />
     <ClInclude Include="..\..\..\spine-c\include\spine\RegionAttachment.h" />
     <ClInclude Include="..\..\..\spine-c\include\spine\Skeleton.h" />
     <ClInclude Include="..\..\..\spine-c\include\spine\SkeletonBounds.h" />
@@ -215,7 +222,7 @@ xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
     <ClInclude Include="..\..\..\spine-c\include\spine\spine.h" />
     <ClInclude Include="..\..\..\spine-c\include\spine\TransformConstraint.h" />
     <ClInclude Include="..\..\..\spine-c\include\spine\TransformConstraintData.h" />
-    <ClInclude Include="..\..\..\spine-c\include\spine\WeightedMeshAttachment.h" />
+    <ClInclude Include="..\..\..\spine-c\include\spine\VertexAttachment.h" />
     <ClInclude Include="..\..\..\spine-c\src\spine\Json.h" />
     <ClInclude Include="..\..\src\spine\AttachmentVertices.h" />
     <ClInclude Include="..\..\src\spine\Cocos2dAttachmentLoader.h" />
@@ -230,6 +237,7 @@ xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
     <ClInclude Include="..\Classes\RaptorExample.h" />
     <ClInclude Include="..\Classes\SimpleCommand.h" />
     <ClInclude Include="..\Classes\SpineboyExample.h" />
+    <ClInclude Include="..\Classes\TankExample.h" />
     <ClInclude Include="main.h" />
   </ItemGroup>
   <ItemGroup>

+ 30 - 6
spine-cocos2dx/example/proj.win32/spine-cocos2d-x.vcxproj.filters

@@ -108,6 +108,15 @@
     <ClCompile Include="..\..\..\spine-c\src\spine\MeshAttachment.c">
       <Filter>spine</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\spine-c\src\spine\PathAttachment.c">
+      <Filter>spine</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\spine-c\src\spine\PathConstraint.c">
+      <Filter>spine</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\spine-c\src\spine\PathConstraintData.c">
+      <Filter>spine</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\..\spine-c\src\spine\RegionAttachment.c">
       <Filter>spine</Filter>
     </ClCompile>
@@ -138,9 +147,12 @@
     <ClCompile Include="..\..\..\spine-c\src\spine\TransformConstraintData.c">
       <Filter>spine</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\spine-c\src\spine\WeightedMeshAttachment.c">
+    <ClCompile Include="..\..\..\spine-c\src\spine\VertexAttachment.c">
       <Filter>spine</Filter>
     </ClCompile>
+    <ClCompile Include="..\Classes\TankExample.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="main.h">
@@ -185,7 +197,7 @@
     <ClInclude Include="..\..\src\spine\spine-cocos2dx.h">
       <Filter>spine-cocos2dx</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\spine-c\src\spine\Json.h">
+    <ClInclude Include="..\..\..\spine-c\include\spine\AttachmentLoader.h">
       <Filter>spine</Filter>
     </ClInclude>
     <ClInclude Include="..\..\..\spine-c\include\spine\Animation.h">
@@ -206,9 +218,6 @@
     <ClInclude Include="..\..\..\spine-c\include\spine\Attachment.h">
       <Filter>spine</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\spine-c\include\spine\AttachmentLoader.h">
-      <Filter>spine</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\..\spine-c\include\spine\Bone.h">
       <Filter>spine</Filter>
     </ClInclude>
@@ -236,6 +245,15 @@
     <ClInclude Include="..\..\..\spine-c\include\spine\MeshAttachment.h">
       <Filter>spine</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\spine-c\include\spine\PathAttachment.h">
+      <Filter>spine</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\spine-c\include\spine\PathConstraint.h">
+      <Filter>spine</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\spine-c\include\spine\PathConstraintData.h">
+      <Filter>spine</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\spine-c\include\spine\RegionAttachment.h">
       <Filter>spine</Filter>
     </ClInclude>
@@ -269,9 +287,15 @@
     <ClInclude Include="..\..\..\spine-c\include\spine\TransformConstraintData.h">
       <Filter>spine</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\spine-c\include\spine\WeightedMeshAttachment.h">
+    <ClInclude Include="..\..\..\spine-c\include\spine\VertexAttachment.h">
+      <Filter>spine</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\spine-c\src\spine\Json.h">
       <Filter>spine</Filter>
     </ClInclude>
+    <ClInclude Include="..\Classes\TankExample.h">
+      <Filter>src</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="game.rc">

+ 2 - 20
spine-cocos2dx/src/spine/Cocos2dAttachmentLoader.cpp

@@ -64,22 +64,9 @@ void _Cocos2dAttachmentLoader_configureAttachment (spAttachmentLoader* loader, s
 		spMeshAttachment* meshAttachment = SUB_CAST(spMeshAttachment, attachment);
 		spAtlasRegion* region = (spAtlasRegion*)meshAttachment->rendererObject;
 		AttachmentVertices* attachmentVertices = new AttachmentVertices((Texture2D*)region->page->rendererObject,
-			meshAttachment->verticesCount >> 1, meshAttachment->triangles, meshAttachment->trianglesCount);
+			meshAttachment->super.worldVerticesLength >> 1, meshAttachment->triangles, meshAttachment->trianglesCount);
 		V3F_C4B_T2F* vertices = attachmentVertices->_triangles->verts;
-		for (int i = 0, ii = 0, nn = meshAttachment->verticesCount; ii < nn; ++i, ii += 2) {
-			vertices[i].texCoords.u = meshAttachment->uvs[ii];
-			vertices[i].texCoords.v = meshAttachment->uvs[ii + 1];
-		}
-		meshAttachment->rendererObject = attachmentVertices;
-		break;
-	}
-	case SP_ATTACHMENT_WEIGHTED_MESH: {
-		spWeightedMeshAttachment* meshAttachment = SUB_CAST(spWeightedMeshAttachment, attachment);
-		spAtlasRegion* region = (spAtlasRegion*)meshAttachment->rendererObject;
-		AttachmentVertices* attachmentVertices = new AttachmentVertices((Texture2D*)region->page->rendererObject,
-			meshAttachment->uvsCount >> 1, meshAttachment->triangles, meshAttachment->trianglesCount);
-		V3F_C4B_T2F* vertices = attachmentVertices->_triangles->verts;
-		for (int i = 0, ii = 0, nn = meshAttachment->uvsCount; ii < nn; ++i, ii += 2) {
+		for (int i = 0, ii = 0, nn = meshAttachment->super.worldVerticesLength; ii < nn; ++i, ii += 2) {
 			vertices[i].texCoords.u = meshAttachment->uvs[ii];
 			vertices[i].texCoords.v = meshAttachment->uvs[ii + 1];
 		}
@@ -102,11 +89,6 @@ void _Cocos2dAttachmentLoader_disposeAttachment (spAttachmentLoader* loader, spA
 		delete (AttachmentVertices*)meshAttachment->rendererObject;
 		break;
 	}
-	case SP_ATTACHMENT_WEIGHTED_MESH: {
-		spWeightedMeshAttachment* meshAttachment = SUB_CAST(spWeightedMeshAttachment, attachment);
-		delete (AttachmentVertices*)meshAttachment->rendererObject;
-		break;
-	}
 	default: ;
 	}
 }

+ 1 - 19
spine-cocos2dx/src/spine/SkeletonRenderer.cpp

@@ -180,16 +180,6 @@ void SkeletonRenderer::draw (Renderer* renderer, const Mat4& transform, uint32_t
 			color.a = attachment->a;
 			break;
 		}
-		case SP_ATTACHMENT_WEIGHTED_MESH: {
-			spWeightedMeshAttachment* attachment = (spWeightedMeshAttachment*)slot->attachment;
-			spWeightedMeshAttachment_computeWorldVertices(attachment, slot, _worldVertices);
-			attachmentVertices = getAttachmentVertices(attachment);
-			color.r = attachment->r;
-			color.g = attachment->g;
-			color.b = attachment->b;
-			color.a = attachment->a;
-			break;
-		}
 		default:
 			continue;
 		}
@@ -292,10 +282,6 @@ AttachmentVertices* SkeletonRenderer::getAttachmentVertices (spMeshAttachment* a
 	return (AttachmentVertices*)attachment->rendererObject;
 }
 
-AttachmentVertices* SkeletonRenderer::getAttachmentVertices (spWeightedMeshAttachment* attachment) const {
-	return (AttachmentVertices*)attachment->rendererObject;
-}
-
 Rect SkeletonRenderer::getBoundingBox () const {
 	float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
 	float scaleX = getScaleX(), scaleY = getScaleY();
@@ -310,11 +296,7 @@ Rect SkeletonRenderer::getBoundingBox () const {
 		} else if (slot->attachment->type == SP_ATTACHMENT_MESH) {
 			spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment;
 			spMeshAttachment_computeWorldVertices(mesh, slot, _worldVertices);
-			verticesCount = mesh->verticesCount;
-		} else if (slot->attachment->type == SP_ATTACHMENT_WEIGHTED_MESH) {
-			spWeightedMeshAttachment* mesh = (spWeightedMeshAttachment*)slot->attachment;
-			spWeightedMeshAttachment_computeWorldVertices(mesh, slot, _worldVertices);
-			verticesCount = mesh->uvsCount;
+			verticesCount = mesh->super.worldVerticesLength;
 		} else
 			continue;
 		for (int ii = 0; ii < verticesCount; ii += 2) {

+ 0 - 1
spine-cocos2dx/src/spine/SkeletonRenderer.h

@@ -117,7 +117,6 @@ protected:
 	void setSkeletonData (spSkeletonData* skeletonData, bool ownsSkeletonData);
 	virtual AttachmentVertices* getAttachmentVertices (spRegionAttachment* attachment) const;
 	virtual AttachmentVertices* getAttachmentVertices (spMeshAttachment* attachment) const;
-	virtual AttachmentVertices* getAttachmentVertices (spWeightedMeshAttachment* attachment) const;
 
 	bool _ownsSkeletonData;
 	spAtlas* _atlas;

+ 125 - 0
spine-libgdx/spine-libgdx-tests/assets/path/tank.atlas

@@ -0,0 +1,125 @@
+
+tank.png
+size: 2048,1024
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+images/antenna
+  rotate: true
+  xy: 1295, 683
+  size: 22, 303
+  orig: 22, 303
+  offset: 0, 0
+  index: -1
+images/cannon
+  rotate: false
+  xy: 2, 93
+  size: 931, 58
+  orig: 931, 58
+  offset: 0, 0
+  index: -1
+images/cannonConnector
+  rotate: true
+  xy: 1676, 455
+  size: 112, 135
+  orig: 112, 135
+  offset: 0, 0
+  index: -1
+images/guntower
+  rotate: false
+  xy: 1295, 707
+  size: 730, 289
+  orig: 730, 289
+  offset: 0, 0
+  index: -1
+images/machinegun
+  rotate: false
+  xy: 2, 34
+  size: 331, 57
+  orig: 331, 57
+  offset: 0, 0
+  index: -1
+images/machinegun-mount
+  rotate: false
+  xy: 1952, 609
+  size: 72, 96
+  orig: 72, 96
+  offset: 0, 0
+  index: -1
+images/rock
+  rotate: false
+  xy: 935, 96
+  size: 252, 55
+  orig: 252, 55
+  offset: 0, 0
+  index: -1
+images/tankBottom
+  rotate: false
+  xy: 2, 377
+  size: 1285, 276
+  orig: 1285, 276
+  offset: 0, 0
+  index: -1
+images/tankBottom-shadow
+  rotate: false
+  xy: 2, 655
+  size: 1291, 341
+  orig: 1291, 341
+  offset: 0, 0
+  index: -1
+images/tankTop
+  rotate: false
+  xy: 2, 153
+  size: 1407, 222
+  orig: 1407, 222
+  offset: 0, 0
+  index: -1
+images/tread
+  rotate: false
+  xy: 2, 2
+  size: 96, 30
+  orig: 96, 30
+  offset: 0, 0
+  index: -1
+images/tread-inside
+  rotate: false
+  xy: 335, 63
+  size: 25, 28
+  orig: 25, 28
+  offset: 0, 0
+  index: -1
+images/wheel-big
+  rotate: false
+  xy: 1295, 490
+  size: 191, 191
+  orig: 191, 191
+  offset: 0, 0
+  index: -1
+images/wheel-big-overlay
+  rotate: false
+  xy: 1488, 495
+  size: 186, 186
+  orig: 186, 186
+  offset: 0, 0
+  index: -1
+images/wheel-mid
+  rotate: false
+  xy: 1676, 569
+  size: 136, 136
+  orig: 136, 136
+  offset: 0, 0
+  index: -1
+images/wheel-mid-overlay
+  rotate: false
+  xy: 1814, 569
+  size: 136, 136
+  orig: 136, 136
+  offset: 0, 0
+  index: -1
+images/wheel-small
+  rotate: false
+  xy: 1813, 496
+  size: 71, 71
+  orig: 71, 71
+  offset: 0, 0
+  index: -1

+ 1899 - 0
spine-libgdx/spine-libgdx-tests/assets/path/tank.json

@@ -0,0 +1,1899 @@
+{
+"skeleton": { "hash": "kgtyty1lpfv5JU2lygtFi2u3oQQ", "spine": "3.3.07", "width": 1914.53, "height": 964.05, "images": "" },
+"bones": [
+	{ "name": "root" },
+	{ "name": "tankRoot", "parent": "root", "y": 200 },
+	{ "name": "tankTreads", "parent": "tankRoot" },
+	{ "name": "tankBody", "parent": "tankTreads", "y": 10 },
+	{ "name": "guntower", "parent": "tankBody", "x": -21.72, "y": 245.47 },
+	{ "name": "antennaRoot", "parent": "guntower", "x": 164.6, "y": 202.52 },
+	{ "name": "antenna1", "parent": "antennaRoot", "length": 40, "rotation": 90, "y": 39.99, "color": "ffee00ff" },
+	{ "name": "antenna2", "parent": "antenna1", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna3", "parent": "antenna2", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna4", "parent": "antenna3", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna5", "parent": "antenna4", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "antenna6", "parent": "antenna5", "length": 42, "x": 42, "color": "ffee00ff" },
+	{ "name": "cannonConnector", "parent": "guntower", "x": -235.04, "y": 96.07 },
+	{ "name": "cannonTarget", "parent": "tankRoot", "x": -1486.66, "y": 351.82, "color": "ff3f00ff" },
+	{ "name": "cannon", "parent": "cannonConnector", "length": 946.68, "rotation": 180, "color": "ff4000ff" },
+	{ "name": "cannonTip", "parent": "cannon", "x": 946.68, "color": "ff4000ff" },
+	{ "name": "machineGunTarget", "parent": "tankRoot", "x": -1474, "y": 559.42, "color": "ff3f00ff" },
+	{
+		"name": "machinegun-mount",
+		"parent": "guntower",
+		"length": 90.97,
+		"rotation": 90,
+		"x": -123.72,
+		"y": 218.32,
+		"color": "15ff00ff"
+	},
+	{
+		"name": "machinegun",
+		"parent": "machinegun-mount",
+		"length": 208.94,
+		"rotation": 90,
+		"x": 91.52,
+		"y": -1.03,
+		"color": "15ff00ff"
+	},
+	{ "name": "machinegun-tip", "parent": "machinegun", "x": 210.42, "y": -12.2 },
+	{ "name": "rock", "parent": "root", "x": -656.45 },
+	{
+		"name": "tread",
+		"parent": "tankRoot",
+		"length": 82,
+		"rotation": 180,
+		"x": -22.89,
+		"y": 213.85,
+		"scaleX": 0.993,
+		"color": "e64344ff"
+	},
+	{ "name": "tread2", "parent": "tread", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread3", "parent": "tread2", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread4", "parent": "tread3", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread5", "parent": "tread4", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread6", "parent": "tread5", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread7", "parent": "tread6", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread8", "parent": "tread7", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread9", "parent": "tread8", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread10", "parent": "tread9", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread11", "parent": "tread10", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread12", "parent": "tread11", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread13", "parent": "tread12", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread14", "parent": "tread13", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread15", "parent": "tread14", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread16", "parent": "tread15", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread17", "parent": "tread16", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread18", "parent": "tread17", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread19", "parent": "tread18", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread20", "parent": "tread19", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread21", "parent": "tread20", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread22", "parent": "tread21", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread23", "parent": "tread22", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread24", "parent": "tread23", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread25", "parent": "tread24", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread26", "parent": "tread25", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread27", "parent": "tread26", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread28", "parent": "tread27", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread29", "parent": "tread28", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread30", "parent": "tread29", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread31", "parent": "tread30", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread32", "parent": "tread31", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread33", "parent": "tread32", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread34", "parent": "tread33", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread35", "parent": "tread34", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "tread36", "parent": "tread35", "length": 82, "x": 82, "color": "e64344ff" },
+	{ "name": "wheel-midCenter", "parent": "tankRoot", "y": -114.56 },
+	{ "name": "treadCollider1", "parent": "wheel-midCenter", "x": -329.57, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider2", "parent": "wheel-midCenter", "x": -165.95, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider3", "parent": "wheel-midCenter", "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider4", "parent": "wheel-midCenter", "x": 163.56, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadCollider5", "parent": "wheel-midCenter", "x": 329.12, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "treadGravity1", "parent": "tankRoot", "rotation": 180, "x": -175.35, "y": 109.99, "color": "ff00fbff" },
+	{ "name": "treadGravity2", "parent": "tankRoot", "rotation": 180, "x": 177.88, "y": 105.45, "color": "ff00fbff" },
+	{ "name": "wheel-bigRoot1", "parent": "tankTreads", "x": -549.59, "y": 14.39, "color": "abe323ff" },
+	{ "name": "wheel-big1", "parent": "wheel-bigRoot1", "x": -0.02, "color": "abe323ff" },
+	{ "name": "wheel-bigRoot2", "parent": "tankTreads", "x": 547.33, "y": 14.39 },
+	{ "name": "wheel-big2", "parent": "wheel-bigRoot2" },
+	{ "name": "wheel-midRoot1", "parent": "wheel-midCenter", "x": -410.57, "color": "abe323ff" },
+	{ "name": "wheel-mid1", "parent": "wheel-midRoot1", "color": "abe323ff" },
+	{ "name": "wheel-midRoot2", "parent": "wheel-midCenter", "x": -246.95 },
+	{ "name": "wheel-mid2", "parent": "wheel-midRoot2" },
+	{ "name": "wheel-midRoot3", "parent": "wheel-midCenter", "x": -82.72 },
+	{ "name": "wheel-mid3", "parent": "wheel-midRoot3" },
+	{ "name": "wheel-midRoot4", "parent": "wheel-midCenter", "x": 80.89 },
+	{ "name": "wheel-mid4", "parent": "wheel-midRoot4" },
+	{ "name": "wheel-midRoot5", "parent": "wheel-midCenter", "x": 244.51 },
+	{ "name": "wheel-mid5", "parent": "wheel-midRoot5" },
+	{ "name": "wheel-midRoot6", "parent": "wheel-midCenter", "x": 408.73 },
+	{ "name": "wheel-mid6", "parent": "wheel-midRoot6" },
+	{ "name": "wheel-smallRoot1", "parent": "tankTreads", "x": -337.38, "y": 109.43 },
+	{ "name": "wheel-small1", "parent": "wheel-smallRoot1", "color": "abe323ff" },
+	{ "name": "wheel-smallRoot2", "parent": "tankTreads", "x": 0.08, "y": 109.43 },
+	{ "name": "wheel-small2", "parent": "wheel-smallRoot2" },
+	{ "name": "wheel-smallRoot3", "parent": "tankTreads", "x": 334.68, "y": 109.43 },
+	{ "name": "wheel-small3", "parent": "wheel-smallRoot3" }
+],
+"slots": [
+	{ "name": "tankBody-shadow", "bone": "tankBody", "color": "ffffffb9", "attachment": "images/tankBottom-shadow" },
+	{ "name": "bottom", "bone": "tankBody", "attachment": "images/tankBottom" },
+	{ "name": "tread-inside1", "bone": "tread", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside53", "bone": "tread27", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside27", "bone": "tread14", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside3", "bone": "tread2", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside55", "bone": "tread28", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside29", "bone": "tread15", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside5", "bone": "tread3", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside57", "bone": "tread29", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside31", "bone": "tread16", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside7", "bone": "tread4", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside59", "bone": "tread30", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside33", "bone": "tread17", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside9", "bone": "tread5", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside61", "bone": "tread31", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside35", "bone": "tread18", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside11", "bone": "tread6", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside63", "bone": "tread32", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside37", "bone": "tread19", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside13", "bone": "tread7", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside65", "bone": "tread33", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside39", "bone": "tread20", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside15", "bone": "tread8", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside67", "bone": "tread34", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside69", "bone": "tread35", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside71", "bone": "tread36", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside41", "bone": "tread21", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside17", "bone": "tread9", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside43", "bone": "tread22", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside19", "bone": "tread10", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside45", "bone": "tread23", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside21", "bone": "tread11", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside47", "bone": "tread24", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside23", "bone": "tread12", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside49", "bone": "tread25", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside25", "bone": "tread13", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside51", "bone": "tread26", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside2", "bone": "tread", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside54", "bone": "tread27", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside28", "bone": "tread14", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside4", "bone": "tread2", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside56", "bone": "tread28", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside30", "bone": "tread15", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside6", "bone": "tread3", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside58", "bone": "tread29", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside32", "bone": "tread16", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside8", "bone": "tread4", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside60", "bone": "tread30", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside34", "bone": "tread17", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside10", "bone": "tread5", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside62", "bone": "tread31", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside36", "bone": "tread18", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside12", "bone": "tread6", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside64", "bone": "tread32", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside38", "bone": "tread19", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside14", "bone": "tread7", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside66", "bone": "tread33", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside40", "bone": "tread20", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside16", "bone": "tread8", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside68", "bone": "tread34", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside70", "bone": "tread35", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside72", "bone": "tread36", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside42", "bone": "tread21", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside18", "bone": "tread9", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside44", "bone": "tread22", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside20", "bone": "tread10", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside46", "bone": "tread23", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside22", "bone": "tread11", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside48", "bone": "tread24", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside24", "bone": "tread12", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside50", "bone": "tread25", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside26", "bone": "tread13", "attachment": "images/tread-inside" },
+	{ "name": "tread-inside52", "bone": "tread26", "attachment": "images/tread-inside" },
+	{ "name": "wheel-big", "bone": "wheel-big1", "color": "dbdbdbff", "attachment": "images/wheel-big" },
+	{ "name": "wheel-big2", "bone": "wheel-big2", "color": "dbdbdbff", "attachment": "images/wheel-big" },
+	{ "name": "wheel-mid", "bone": "wheel-mid1", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid2", "bone": "wheel-mid2", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid3", "bone": "wheel-mid3", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid4", "bone": "wheel-mid4", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid5", "bone": "wheel-mid5", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-mid6", "bone": "wheel-mid6", "attachment": "images/wheel-mid" },
+	{ "name": "wheel-small", "bone": "wheel-small1", "attachment": "images/wheel-small" },
+	{ "name": "wheel-small2", "bone": "wheel-small2", "attachment": "images/wheel-small" },
+	{ "name": "wheel-small3", "bone": "wheel-small3", "attachment": "images/wheel-small" },
+	{
+		"name": "wheel-mid-overlay",
+		"bone": "wheel-midRoot1",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay2",
+		"bone": "wheel-midRoot2",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay3",
+		"bone": "wheel-midRoot3",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay4",
+		"bone": "wheel-midRoot4",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay5",
+		"bone": "wheel-midRoot5",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-mid-overlay6",
+		"bone": "wheel-midRoot6",
+		"color": "ffffffec",
+		"attachment": "images/wheel-mid-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-big-overlay1",
+		"bone": "wheel-bigRoot1",
+		"color": "ffffffe9",
+		"attachment": "images/wheel-big-overlay",
+		"blend": "multiply"
+	},
+	{
+		"name": "wheel-big-overlay2",
+		"bone": "wheel-bigRoot2",
+		"color": "ffffffe9",
+		"attachment": "images/wheel-big-overlay",
+		"blend": "multiply"
+	},
+	{ "name": "treads", "bone": "tankRoot", "attachment": "treads" },
+	{ "name": "tread", "bone": "tread", "color": "c0974fff", "attachment": "images/tread" },
+	{ "name": "tread27", "bone": "tread27", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread14", "bone": "tread14", "attachment": "images/tread" },
+	{ "name": "tread2", "bone": "tread2", "attachment": "images/tread" },
+	{ "name": "tread28", "bone": "tread28", "attachment": "images/tread" },
+	{ "name": "tread15", "bone": "tread15", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread3", "bone": "tread3", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread29", "bone": "tread29", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread16", "bone": "tread16", "attachment": "images/tread" },
+	{ "name": "tread4", "bone": "tread4", "attachment": "images/tread" },
+	{ "name": "tread30", "bone": "tread30", "attachment": "images/tread" },
+	{ "name": "tread17", "bone": "tread17", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread5", "bone": "tread5", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread31", "bone": "tread31", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread18", "bone": "tread18", "attachment": "images/tread" },
+	{ "name": "tread6", "bone": "tread6", "attachment": "images/tread" },
+	{ "name": "tread32", "bone": "tread32", "attachment": "images/tread" },
+	{ "name": "tread19", "bone": "tread19", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread7", "bone": "tread7", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread33", "bone": "tread33", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread20", "bone": "tread20", "attachment": "images/tread" },
+	{ "name": "tread8", "bone": "tread8", "attachment": "images/tread" },
+	{ "name": "tread34", "bone": "tread34", "attachment": "images/tread" },
+	{ "name": "tread35", "bone": "tread35", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread36", "bone": "tread36", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread21", "bone": "tread21", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread9", "bone": "tread9", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread22", "bone": "tread22", "attachment": "images/tread" },
+	{ "name": "tread10", "bone": "tread10", "attachment": "images/tread" },
+	{ "name": "tread23", "bone": "tread23", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread11", "bone": "tread11", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread24", "bone": "tread24", "attachment": "images/tread" },
+	{ "name": "tread12", "bone": "tread12", "attachment": "images/tread" },
+	{ "name": "tread25", "bone": "tread25", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread13", "bone": "tread13", "color": "adc9b8ff", "attachment": "images/tread" },
+	{ "name": "tread26", "bone": "tread26", "attachment": "images/tread" },
+	{ "name": "rock", "bone": "rock", "attachment": "images/rock" },
+	{ "name": "machinegun", "bone": "machinegun", "attachment": "images/machinegun" },
+	{ "name": "machinegun-mount", "bone": "machinegun-mount", "attachment": "images/machinegun-mount" },
+	{ "name": "tankTop", "bone": "tankBody", "attachment": "images/tankTop" },
+	{ "name": "guntower", "bone": "guntower", "attachment": "images/guntower" },
+	{ "name": "cannon", "bone": "cannon", "attachment": "images/cannon" },
+	{ "name": "cannonConnector", "bone": "cannonConnector", "attachment": "images/cannonConnector" },
+	{ "name": "antenna", "bone": "antennaRoot", "attachment": "images/antenna" }
+],
+"ik": [
+	{
+		"name": "cannonTarget",
+		"bones": [ "cannon" ],
+		"target": "cannonTarget"
+	},
+	{
+		"name": "machineGunTarget",
+		"bones": [ "machinegun" ],
+		"target": "machineGunTarget",
+		"mix": 0
+	}
+],
+"transform": [
+	{
+		"name": "wheel-big",
+		"bones": [ "wheel-big2" ],
+		"target": "wheel-big1",
+		"rotation": 65.6,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid1",
+		"bones": [ "wheel-mid2", "wheel-mid4" ],
+		"target": "wheel-mid1",
+		"rotation": 93,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid2",
+		"bones": [ "wheel-mid3", "wheel-mid5" ],
+		"target": "wheel-mid1",
+		"rotation": -89,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-mid3",
+		"bones": [ "wheel-mid6" ],
+		"target": "wheel-mid1",
+		"rotation": -152.6,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-small1",
+		"bones": [ "wheel-small2" ],
+		"target": "wheel-small1",
+		"rotation": 87,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	},
+	{
+		"name": "wheel-small2",
+		"bones": [ "wheel-small3" ],
+		"target": "wheel-small1",
+		"rotation": 54.9,
+		"translateMix": 0,
+		"scaleMix": 0,
+		"shearMix": 0
+	}
+],
+"path": [
+	{
+		"name": "treads",
+		"bones": [
+			"tread",
+			"tread2",
+			"tread3",
+			"tread4",
+			"tread5",
+			"tread6",
+			"tread7",
+			"tread8",
+			"tread9",
+			"tread10",
+			"tread11",
+			"tread12",
+			"tread13",
+			"tread14",
+			"tread15",
+			"tread16",
+			"tread17",
+			"tread18",
+			"tread19",
+			"tread20",
+			"tread21",
+			"tread22",
+			"tread23",
+			"tread24",
+			"tread25",
+			"tread26",
+			"tread27",
+			"tread28",
+			"tread29",
+			"tread30",
+			"tread31",
+			"tread32",
+			"tread33",
+			"tread34",
+			"tread35",
+			"tread36"
+		],
+		"target": "treads",
+		"rotateMode": "chain"
+	}
+],
+"skins": {
+	"default": {
+		"antenna": {
+			"images/antenna": {
+				"type": "mesh",
+				"uvs": [ 0.64286, 0.07875, 0.65354, 0.15349, 0.66324, 0.22137, 0.67367, 0.29433, 0.68383, 0.36543, 0.69359, 0.43374, 0.7031, 0.50029, 0.71311, 0.5703, 0.72327, 0.64138, 0.73406, 0.71688, 0.7444, 0.78929, 0.75614, 0.8714, 0.76905, 0.9431, 1, 0.9431, 1, 1, 0, 1, 0, 0.9431, 0.20105, 0.9431, 0.20105, 0.87093, 0.21461, 0.78846, 0.22651, 0.71606, 0.23885, 0.64098, 0.25035, 0.57104, 0.26206, 0.49983, 0.27306, 0.4329, 0.2843, 0.36453, 0.29592, 0.29381, 0.308, 0.22037, 0.319, 0.15345, 0.33141, 0.07795, 0.34423, 0, 0.6316, 0 ],
+				"triangles": [ 30, 31, 0, 29, 30, 0, 29, 0, 1, 28, 29, 1, 28, 1, 2, 27, 28, 2, 27, 2, 3, 26, 3, 4, 25, 26, 4, 25, 4, 5, 26, 27, 3, 24, 5, 6, 23, 24, 6, 7, 23, 6, 24, 25, 5, 22, 7, 8, 21, 22, 8, 21, 8, 9, 7, 22, 23, 20, 9, 10, 19, 20, 10, 20, 21, 9, 19, 10, 11, 18, 19, 11, 17, 18, 11, 17, 11, 12, 15, 16, 17, 12, 13, 14, 15, 17, 12, 14, 15, 12 ],
+				"vertices": [ 2, 10, 65.37999, -3.14, 0.3125, 11, 23.38, -3.14, 0.6875, 3, 9, 84.73, -3.37, 0.0625, 10, 42.73, -3.37, 0.625, 11, 0.73, -3.37, 0.3125, 3, 9, 64.16, -3.59, 0.3125, 10, 22.16, -3.59, 0.625, 11, -19.83, -3.59, 0.0625, 3, 8, 84.06, -3.82, 0.0625, 9, 42.06, -3.82, 0.625, 10, 0.06, -3.82, 0.3125, 3, 8, 62.51, -4.04, 0.3125, 9, 20.51, -4.04, 0.625, 10, -21.48, -4.04, 0.0625, 3, 7, 83.81, -4.25, 0.0625, 8, 41.81, -4.25, 0.625, 9, -0.18, -4.25, 0.3125, 3, 7, 63.65, -4.46, 0.3125, 8, 21.65, -4.46, 0.625, 9, -20.34, -4.46, 0.0625, 3, 6, 84.43, -4.67999, 0.0625, 7, 42.43, -4.67999, 0.625, 8, 0.43, -4.67999, 0.3125, 3, 6, 62.9, -4.91, 0.3125, 7, 20.9, -4.91, 0.625, 8, -21.09, -4.91, 0.0625, 3, 5, 5.14, 80.01999, 0.0625, 6, 40.02, -5.14, 0.625, 7, -1.97, -5.14, 0.3125, 3, 5, 5.37, 58.08, 0.375, 6, 18.08, -5.37, 0.5625, 7, -23.91, -5.37, 0.0625, 1, 5, 5.63, 33.2, 1, 1, 5, 5.91, 11.48, 1, 1, 5, 11, 11.48, 1, 1, 5, 10.99, -5.75, 1, 1, 5, -11, -5.75, 1, 1, 5, -10.99, 11.48, 1, 1, 5, -6.57, 11.48, 1, 1, 5, -6.57, 33.34, 1, 3, 5, -6.27, 58.33, 0.375, 6, 18.33, 6.27, 0.5625, 7, -23.66, 6.27, 0.0625, 3, 5, -6.01, 80.26999, 0.0625, 6, 40.27, 6.01, 0.625, 7, -1.72, 6.01, 0.3125, 3, 6, 63.02, 5.74, 0.3125, 7, 21.02, 5.74, 0.625, 8, -20.96999, 5.74, 0.0625, 3, 6, 84.21, 5.49, 0.0625, 7, 42.21, 5.49, 0.625, 8, 0.21, 5.49, 0.3125, 3, 7, 63.79, 5.23, 0.3125, 8, 21.79, 5.23, 0.625, 9, -20.2, 5.23, 0.0625, 3, 7, 84.07, 4.98999, 0.0625, 8, 42.07, 4.98999, 0.625, 9, 0.07, 4.98999, 0.3125, 3, 8, 62.78, 4.73999, 0.3125, 9, 20.78, 4.73999, 0.625, 10, -21.21, 4.73999, 0.0625, 3, 8, 84.21, 4.48, 0.0625, 9, 42.21, 4.48, 0.625, 10, 0.21, 4.48, 0.3125, 3, 9, 64.46, 4.21999, 0.3125, 10, 22.46, 4.21999, 0.625, 11, -19.53, 4.21999, 0.0625, 3, 9, 84.74, 3.98, 0.0625, 10, 42.74, 3.98, 0.625, 11, 0.74, 3.98, 0.3125, 2, 10, 65.62, 3.7, 0.3125, 11, 23.62, 3.7, 0.6875, 1, 11, 47.24, 3.42, 1, 1, 11, 47.24, -2.89, 1 ],
+				"hull": 32,
+				"edges": [ 28, 30, 28, 26, 30, 32, 26, 24, 24, 22, 32, 34, 34, 24, 34, 36, 36, 22, 60, 62, 38, 36, 20, 22, 38, 20, 40, 38, 18, 20, 40, 18, 42, 40, 16, 18, 42, 16, 44, 42, 14, 16, 44, 14, 46, 44, 12, 14, 46, 12, 48, 46, 10, 12, 48, 10, 50, 48, 8, 10, 50, 8, 52, 50, 6, 8, 52, 6, 54, 52, 4, 6, 54, 4, 56, 54, 2, 4, 56, 2, 60, 58, 58, 56, 62, 0, 0, 2, 58, 0 ],
+				"width": 22,
+				"height": 303
+			}
+		},
+		"bottom": {
+			"images/tankBottom": { "x": -16.66, "y": 9.89, "width": 1285, "height": 276 }
+		},
+		"cannon": {
+			"images/cannon": { "x": 481.95, "y": -0.02, "rotation": 179.99, "width": 931, "height": 58 }
+		},
+		"cannonConnector": {
+			"images/cannonConnector": {
+				"type": "mesh",
+				"uvs": [ 1, 0.03236, 1, 0.10602, 0.90987, 0.32859, 0.81975, 0.55116, 0.72962, 0.77372, 0.6395, 0.99629, 0.42157, 0.99629, 0.20364, 0.99629, 0, 0.85433, 0, 0.69901, 0.02267, 0.52884, 0, 0.31444, 0.21601, 0.12998, 0.43367, 0, 0.63546, 0.0037, 0.48407, 0.77059, 0.31496, 0.52496, 0.64132, 0.19648, 0.21516, 0.76765, 0.58345, 0.5647, 0.68444, 0.40146, 0.46758, 0.36649, 0.28934, 0.34603 ],
+				"triangles": [ 21, 22, 12, 11, 12, 22, 17, 21, 13, 17, 13, 14, 21, 12, 13, 21, 17, 20, 16, 22, 21, 10, 11, 22, 10, 22, 16, 19, 21, 20, 16, 21, 19, 18, 10, 16, 9, 10, 18, 15, 16, 19, 18, 16, 15, 8, 9, 18, 7, 8, 18, 6, 18, 15, 7, 18, 6, 14, 0, 1, 17, 14, 1, 2, 17, 1, 20, 17, 2, 3, 20, 2, 19, 20, 3, 4, 19, 3, 15, 19, 4, 5, 15, 4, 6, 15, 5 ],
+				"vertices": [ 1, 12, 35.91, 69.08, 1, 1, 12, 35.91, 59.13, 1, 1, 12, 25.81, 29.09, 1, 1, 12, 15.72, -0.95, 1, 1, 12, 5.63, -31, 1, 1, 12, -4.46, -61.04, 1, 2, 12, -28.87, -61.04, 0.33333, 14, 28.87, 61.03, 0.66666, 1, 14, 53.27, 61.01, 1, 1, 14, 76.08, 41.83, 1, 1, 14, 71.17, 21.62, 1, 1, 14, 72.83, -1.62, 1, 1, 14, 70.37, -29.12, 1, 1, 14, 50.66, -56.13, 1, 2, 12, -28.43, 74.37, 0.41, 14, 28.43, -74.39, 0.58999, 2, 12, -4.91, 72.94999, 0.52, 14, 4.91, -72.94999, 0.48, 2, 12, -21.87, -30.57, 0.49, 14, 21.87, 30.56, 0.51, 1, 14, 40.81, -2.59999, 1, 2, 12, -4.25, 46.92, 0.49, 14, 4.25, -46.92, 0.51, 1, 14, 51.98, 30.15, 1, 2, 12, -10.74, -2.78, 0.49, 14, 10.74, 2.77, 0.51, 2, 12, 0.56, 19.25, 0.49, 14, -0.56, -19.25, 0.51, 1, 14, 23.71, -23.98, 1, 1, 14, 43.68, -26.76, 1 ],
+				"hull": 15,
+				"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, 0 ],
+				"width": 112,
+				"height": 135
+			}
+		},
+		"guntower": {
+			"images/guntower": { "x": 77.22, "y": 122.58, "width": 730, "height": 289 }
+		},
+		"machinegun": {
+			"images/machinegun": { "x": 44.85, "y": -5.72, "rotation": -180, "width": 331, "height": 57 }
+		},
+		"machinegun-mount": {
+			"images/machinegun-mount": { "x": 47.42, "y": -1.53, "rotation": -90, "width": 72, "height": 96 }
+		},
+		"rock": {
+			"images/rock": { "color": "404040ff", "x": 25.23, "y": 27.35, "width": 252, "height": 55 }
+		},
+		"tankBody-shadow": {
+			"images/tankBottom-shadow": { "x": -11.43, "y": -42.88, "width": 1291, "height": 341 }
+		},
+		"tankTop": {
+			"images/tankTop": { "x": 6.8, "y": 168.71, "width": 1407, "height": 222 }
+		},
+		"tread": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread-inside1": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside10": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside11": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside12": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside13": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside14": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside15": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside16": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside17": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside18": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside19": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside2": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside20": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside21": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside22": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside23": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside24": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside25": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside26": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside27": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside28": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside29": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside3": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside30": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside31": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside32": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside33": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside34": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside35": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside36": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside37": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside38": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside39": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside4": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside40": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside41": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside42": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside43": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside44": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside45": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside46": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside47": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside48": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside49": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside5": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside50": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside51": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside52": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside53": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside54": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside55": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside56": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside57": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside58": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside59": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside6": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside60": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside61": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside62": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside63": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside64": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside65": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside66": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside67": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside68": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside69": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside7": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside70": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside71": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside72": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside8": {
+			"images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread-inside9": {
+			"images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+		},
+		"tread10": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread11": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread12": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread13": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread14": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread15": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread16": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread17": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread18": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread19": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread2": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread20": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread21": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread22": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread23": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread24": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread25": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread26": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread27": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread28": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread29": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread3": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread30": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread31": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread32": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread33": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread34": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread35": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread36": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread4": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread5": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread6": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread7": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread8": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"tread9": {
+			"images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 }
+		},
+		"treads": {
+			"treads": {
+				"type": "path",
+				"closed": true,
+				"lengths": [ 182.41, 349, 472.77, 602.99, 780.46, 1052.96, 1133.44, 1218.43, 1298.34, 1382.7, 1465.57, 1546.11, 1628.02, 1707.73, 1794.36, 1876.75, 2158.69, 2321.34, 2438.56, 2579.42, 2745.35, 2919.23 ],
+				"vertexCount": 66,
+				"vertices": [ 1, 83, 11.23, 41.86, 1, 1, 83, 0.78, 41.93999, 1, 1, 83, -34.72, 42.23, 1, 1, 63, -104.21, 0.41, 1, 1, 63, 0.07, 0.55, 1, 1, 63, 68.8, 0.64, 1, 1, 81, 20.5, 43.47, 1, 1, 81, 1.13, 40.81, 1, 1, 81, -27.38, 36.84, 1, 1, 65, 147.06, 105, 1, 1, 65, 96.21, 96.63, 1, 1, 65, 43.87, 87.71, 1, 1, 65, 16.18, 103.34, 1, 1, 65, -33.66999, 94.2, 1, 1, 65, -99.35, 81.25, 1, 1, 65, -122.04, -1.69, 1, 1, 65, -83.58, -47.92, 1, 1, 65, -33.53, -109.36, 1, 1, 69, -83.56, -66.08999, 1, 1, 69, -2.16, -67.89, 1, 2, 69, 56.68, -41.48, 0.67999, 58, -24.31, -41.49, 0.32, 1, 58, -26.58, 16.69, 1, 1, 58, -2.69, 16.69, 1, 1, 58, 13.51, 16.69, 1, 2, 71, -52.41, -46.51, 0.74399, 58, 30.2, -46.51, 0.256, 1, 71, -0.32, -68.92, 1, 2, 71, 52.09, -44.72, 0.712, 59, -28.9, -44.73, 0.28799, 1, 59, -22.8, 16.24, 1, 1, 59, -1.42, 16.24, 1, 1, 59, 20.46999, 16.24, 1, 2, 73, -47.21, -47.45, 0.744, 59, 36.00999, -47.46, 0.25599, 1, 73, -0.28, -69.65, 1, 2, 73, 45.23, -47.26, 0.736, 60, -37.48, -47.26, 0.26399, 1, 60, -23.76, 15.27, 1, 1, 60, -0.13, 15.27, 1, 1, 60, 24.45, 15.27, 1, 2, 75, -47.36, -48.7, 0.74399, 60, 33.52, -48.7, 0.256, 1, 75, -0.49, -70.39, 1, 2, 75, 49.09, -48.33, 0.744, 61, -33.57, -48.34, 0.25599, 1, 61, -20.89, 15.83, 1, 1, 61, -1.25, 15.83, 1, 1, 61, 15.78, 15.83, 1, 2, 77, -52.49, -48.21, 0.75999, 61, 28.45, -48.21, 0.24, 1, 77, -2.5, -68.92, 1, 2, 77, 55.72, -47.82, 0.752, 62, -28.88, -47.82, 0.248, 1, 62, -21.64, 16.69, 1, 1, 62, -0.48, 16.69, 1, 1, 62, 20.73, 16.69, 1, 2, 79, -53.65, -48.89, 0.76, 62, 25.96, -48.89, 0.23999, 1, 79, 2.27, -69.65, 1, 1, 79, 44.94, -69.74, 1, 1, 65, 1172.98, -85.6, 1, 1, 65, 1190.53, -42.24, 1, 1, 65, 1215.63, 19.75, 1, 1, 65, 1175.55, 76.62, 1, 1, 65, 1134.22, 95.07, 1, 1, 65, 1128.4, 97.66, 1, 1, 65, 1081.79, 87.47, 1, 1, 65, 1017.16, 92.52, 1, 1, 65, 977.9, 95.58, 1, 1, 85, 47.07, 42.29, 1, 1, 85, 0.24, 42.74, 1, 1, 85, -29.63, 43.28, 1, 1, 64, -86.64, 1.35, 1, 1, 64, 0.49, 0.25, 1, 1, 64, 92.42, -0.89, 1 ]
+			}
+		},
+		"wheel-big": {
+			"images/wheel-big": { "width": 191, "height": 191 }
+		},
+		"wheel-big-overlay1": {
+			"images/wheel-big-overlay": { "width": 186, "height": 186 }
+		},
+		"wheel-big-overlay2": {
+			"images/wheel-big-overlay": { "width": 186, "height": 186 }
+		},
+		"wheel-big2": {
+			"images/wheel-big": { "width": 191, "height": 191 }
+		},
+		"wheel-mid": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay2": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay3": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay4": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay5": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid-overlay6": {
+			"images/wheel-mid-overlay": { "width": 136, "height": 136 }
+		},
+		"wheel-mid2": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid3": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid4": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid5": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-mid6": {
+			"images/wheel-mid": { "width": 136, "height": 136 }
+		},
+		"wheel-small": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		},
+		"wheel-small2": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		},
+		"wheel-small3": {
+			"images/wheel-small": { "width": 71, "height": 71 }
+		}
+	}
+},
+"animations": {
+	"drive": {
+		"bones": {
+			"tankRoot": {
+				"translate": [
+					{
+						"time": 0,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.549, 0, 0.907, 0.84 ]
+					},
+					{
+						"time": 3.0333,
+						"x": -1426.14,
+						"y": 0,
+						"curve": [ 0.211, 0.23, 0.851, 0.92 ]
+					},
+					{
+						"time": 4.8666,
+						"x": -2806.98,
+						"y": 0,
+						"curve": [ 0.253, 0.27, 0.625, 0.94 ]
+					},
+					{ "time": 5.3333, "x": -2903.34, "y": 0 }
+				]
+			},
+			"wheel-midRoot1": {
+				"translate": [
+					{ "time": 0.7666, "x": 0, "y": 0 },
+					{
+						"time": 1.1666,
+						"x": 0,
+						"y": 50.95,
+						"curve": [ 0.633, 0, 0.907, 0.82 ]
+					},
+					{ "time": 1.5666, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider1": {
+				"rotate": [
+					{ "time": 1.1, "angle": 0 },
+					{ "time": 1.2333, "angle": -19.78 },
+					{ "time": 1.4666, "angle": 0 },
+					{ "time": 1.6, "angle": 28.87 },
+					{ "time": 1.8, "angle": 0 }
+				],
+				"translate": [
+					{ "time": 1.1, "x": 0, "y": 0 },
+					{
+						"time": 1.4666,
+						"x": 0,
+						"y": 58.66,
+						"curve": [ 0.352, 0, 0.828, 0.92 ]
+					},
+					{ "time": 1.8, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot2": {
+				"translate": [
+					{ "time": 1.2666, "x": 0, "y": 0 },
+					{
+						"time": 1.6333,
+						"x": 0,
+						"y": 55.07,
+						"curve": [ 0.889, 0.01, 0.843, 0.81 ]
+					},
+					{ "time": 1.9333, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider2": {
+				"rotate": [
+					{ "time": 1.5333, "angle": 0 },
+					{ "time": 1.6333, "angle": -18.67 },
+					{ "time": 1.8, "angle": 0 },
+					{ "time": 1.9, "angle": 29.49 },
+					{ "time": 2.0666, "angle": 0 }
+				],
+				"translate": [
+					{
+						"time": 1.5333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.16, 0.25, 0.813, 0.82 ]
+					},
+					{
+						"time": 1.8,
+						"x": 0,
+						"y": 59.03,
+						"curve": [ 0.376, 0.26, 0.879, 0.79 ]
+					},
+					{ "time": 2.0666, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot3": {
+				"translate": [
+					{ "time": 1.6666, "x": 0, "y": 0 },
+					{
+						"time": 1.9333,
+						"x": 0,
+						"y": 60.17,
+						"curve": [ 0.544, 0, 0.838, 0.77 ]
+					},
+					{ "time": 2.2, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider3": {
+				"rotate": [
+					{ "time": 1.8666, "angle": 0 },
+					{ "time": 1.9333, "angle": -20.16 },
+					{ "time": 2.0666, "angle": 0.57 },
+					{ "time": 2.1666, "angle": 33.66 },
+					{ "time": 2.3333, "angle": 0 }
+				],
+				"translate": [
+					{ "time": 1.8666, "x": 0, "y": 0 },
+					{
+						"time": 2.0666,
+						"x": 0,
+						"y": 61.53,
+						"curve": [ 0.582, 0, 0.836, 0.77 ]
+					},
+					{ "time": 2.3333, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot4": {
+				"translate": [
+					{ "time": 1.9333, "x": 0, "y": 0 },
+					{
+						"time": 2.2,
+						"x": 0,
+						"y": 58.89,
+						"curve": [ 0.48, 0, 0.75, 1 ]
+					},
+					{ "time": 2.4666, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider4": {
+				"rotate": [
+					{ "time": 2.1333, "angle": 0 },
+					{ "time": 2.2, "angle": -20.43 },
+					{ "time": 2.3333, "angle": 4.49 },
+					{ "time": 2.4333, "angle": 35.87 },
+					{ "time": 2.5666, "angle": 0 }
+				],
+				"translate": [
+					{
+						"time": 2.1333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.191, 0.49, 0.75, 1 ]
+					},
+					{ "time": 2.3333, "x": 0, "y": 66.64 },
+					{ "time": 2.5666, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-midRoot5": {
+				"translate": [
+					{ "time": 2.2, "x": 0, "y": 0 },
+					{ "time": 2.4333, "x": 0, "y": 60.26 },
+					{ "time": 2.7, "x": 0, "y": 0 }
+				]
+			},
+			"treadCollider5": {
+				"rotate": [
+					{ "time": 2.3333, "angle": 0 },
+					{ "time": 2.4333, "angle": -23.6 },
+					{ "time": 2.5666, "angle": 6.49 },
+					{ "time": 2.6666, "angle": 29.93 },
+					{ "time": 2.8, "angle": -0.13 }
+				],
+				"translate": [
+					{ "time": 2.3333, "x": 0, "y": 0 },
+					{ "time": 2.4333, "x": 0, "y": 36.34 },
+					{ "time": 2.5, "x": 0, "y": 56.39 },
+					{ "time": 2.5666, "x": 0, "y": 61.34 },
+					{ "time": 2.8, "x": 0, "y": 2.04 }
+				]
+			},
+			"wheel-midRoot6": {
+				"translate": [
+					{
+						"time": 2.4333,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.19, 0.26, 0.804, 0.8 ]
+					},
+					{
+						"time": 2.6333,
+						"x": 0,
+						"y": 51.86,
+						"curve": [ 0.346, 0, 0.852, 0.7 ]
+					},
+					{ "time": 2.8, "x": 0, "y": 0 }
+				]
+			},
+			"wheel-mid1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 21,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 0.8, "angle": 120 },
+					{ "time": 1.2333, "angle": 240 },
+					{ "time": 1.6, "angle": 0 },
+					{ "time": 1.9, "angle": 120 },
+					{ "time": 2.1666, "angle": 240 },
+					{ "time": 2.4, "angle": 0 },
+					{ "time": 2.5666, "angle": 120 },
+					{ "time": 2.7333, "angle": 240 },
+					{ "time": 2.9333, "angle": 0 },
+					{ "time": 3.1, "angle": 120 },
+					{ "time": 3.2666, "angle": 240 },
+					{ "time": 3.4333, "angle": 0 },
+					{ "time": 3.6333, "angle": 120 },
+					{ "time": 3.8, "angle": 240 },
+					{ "time": 3.9666, "angle": 0 },
+					{ "time": 4.1666, "angle": 120 },
+					{ "time": 4.3333, "angle": 240 },
+					{ "time": 4.5, "angle": 0 },
+					{ "time": 4.7, "angle": 120 },
+					{ "time": 4.8666, "angle": 240 },
+					{ "time": 5.2666, "angle": -67.99 }
+				]
+			},
+			"tankTreads": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.145, 0.34, 0.75, 1 ]
+					},
+					{ "time": 1.1, "angle": -3.9 },
+					{ "time": 1.3333, "angle": -2.37 },
+					{ "time": 1.6333, "angle": -3.54 },
+					{ "time": 2.1666, "angle": 0.27 },
+					{
+						"time": 2.4666,
+						"angle": 2.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.7,
+						"angle": 3.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 3, "angle": -3.62 },
+					{ "time": 3.2333, "angle": -1.23, "curve": "stepped" },
+					{
+						"time": 4.8666,
+						"angle": -1.23,
+						"curve": [ 0.188, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 5.2,
+						"angle": 4.47,
+						"curve": [ 0.416, 0.01, 0.75, 1 ]
+					},
+					{
+						"time": 5.5666,
+						"angle": -3.08,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 5.8333, "angle": -1.23 }
+				]
+			},
+			"wheel-big1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 1.1, "angle": 120 },
+					{ "time": 1.5333, "angle": 240 },
+					{ "time": 1.8, "angle": 360 },
+					{ "time": 2.0333, "angle": 120 },
+					{ "time": 2.2666, "angle": 240 },
+					{ "time": 2.4666, "angle": 360 },
+					{ "time": 2.7, "angle": 120 },
+					{ "time": 2.9333, "angle": 240 },
+					{ "time": 3.1333, "angle": 360 },
+					{ "time": 3.3666, "angle": 120 },
+					{ "time": 3.5666, "angle": 240 },
+					{ "time": 3.8, "angle": -24 },
+					{ "time": 4.0333, "angle": 120 },
+					{ "time": 4.2333, "angle": 240 },
+					{ "time": 4.4666, "angle": -24 },
+					{ "time": 4.7, "angle": 120 },
+					{ "time": 4.8666, "angle": -143.99 },
+					{
+						"time": 5.0666,
+						"angle": -131.4,
+						"curve": [ 0.14, 0.25, 0.75, 1 ]
+					},
+					{ "time": 5.6666, "angle": -76.85 },
+					{ "time": 5.8333, "angle": -72.3 }
+				]
+			},
+			"treadGravity1": {
+				"translate": [
+					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
+					{ "time": 1.4666, "x": 0, "y": 0 },
+					{ "time": 1.8, "x": 0, "y": 29.44 },
+					{ "time": 2.3333, "x": 0, "y": -0.52 },
+					{ "time": 2.5666, "x": 0, "y": 5.2 },
+					{ "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" },
+					{ "time": 4.8666, "x": 0, "y": -11.05 },
+					{ "time": 5.0666, "x": 0, "y": -1.91 },
+					{ "time": 5.5333, "x": 0, "y": -6.9 },
+					{ "time": 5.7333, "x": 0, "y": -11.05 }
+				]
+			},
+			"treadGravity2": {
+				"translate": [
+					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
+					{ "time": 1.4666, "x": 0, "y": 0 },
+					{ "time": 1.8, "x": 0, "y": 8.5 },
+					{ "time": 2.3333, "x": 0, "y": 34.74 },
+					{ "time": 2.5666, "x": 0, "y": 5.2 },
+					{ "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" },
+					{ "time": 4.8666, "x": 0, "y": -11.05 },
+					{ "time": 5.0666, "x": 0, "y": 3.9 },
+					{ "time": 5.5333, "x": 0, "y": -6.9 },
+					{ "time": 5.7333, "x": 0, "y": -11.05 }
+				]
+			},
+			"wheel-small1": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.504, 0.11, 0.931, 0.71 ]
+					},
+					{ "time": 0.7, "angle": 120 },
+					{ "time": 1.1, "angle": 240 },
+					{ "time": 1.4666, "angle": 360 },
+					{ "time": 1.7666, "angle": 120 },
+					{ "time": 2.0333, "angle": 240 },
+					{ "time": 2.2666, "angle": 360 },
+					{ "time": 2.4333, "angle": 120 },
+					{ "time": 2.5666, "angle": 240 },
+					{ "time": 2.7, "angle": 360 },
+					{ "time": 2.8333, "angle": 120 },
+					{ "time": 2.9666, "angle": 240 },
+					{ "time": 3.1, "angle": 360 },
+					{ "time": 3.2333, "angle": 120 },
+					{ "time": 3.3666, "angle": 240 },
+					{ "time": 3.5, "angle": 360 },
+					{ "time": 3.6333, "angle": 120 },
+					{ "time": 3.7666, "angle": 240 },
+					{ "time": 3.9, "angle": 360 },
+					{ "time": 4.0333, "angle": 120 },
+					{ "time": 4.1666, "angle": 240 },
+					{ "time": 4.3, "angle": 360 },
+					{ "time": 4.4333, "angle": 120 },
+					{ "time": 4.5666, "angle": 240 },
+					{ "time": 4.7, "angle": 360 },
+					{ "time": 4.8333, "angle": 120 },
+					{ "time": 5, "angle": 240 },
+					{
+						"time": 5.2,
+						"angle": -25.64,
+						"curve": [ 0.181, 0.26, 0.75, 1 ]
+					},
+					{ "time": 5.5666, "angle": 90 }
+				]
+			},
+			"tankBody": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.1666,
+						"angle": -1.41,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.9333,
+						"angle": -0.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3,
+						"angle": 0.84,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -2.33,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.4666,
+						"angle": -0.45,
+						"curve": [ 0.329, 0.32, 0.757, 1 ]
+					},
+					{
+						"time": 4.8666,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3333,
+						"angle": 1.82,
+						"curve": [ 0.324, 0.01, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -1.15,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.0333, "angle": 0 }
+				]
+			},
+			"antenna1": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna2": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna3": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna4": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna5": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"antenna6": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 0.4333,
+						"angle": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 0.7333,
+						"angle": -1.55,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.0666,
+						"angle": -0.68,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 1.4,
+						"angle": 0.61,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 1.6666, "angle": -0.67, "curve": "stepped" },
+					{
+						"time": 2.1333,
+						"angle": -0.67,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.3666,
+						"angle": 0.88,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.5666,
+						"angle": -1.69,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 2.8666,
+						"angle": 1.18,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.0333,
+						"angle": -1.09,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.2333,
+						"angle": 1.03,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 3.5,
+						"angle": -0.44,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 4.6666, "angle": -0.18 },
+					{
+						"time": 5.0333,
+						"angle": -1.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.3666,
+						"angle": 9.17,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.6666,
+						"angle": -3.14,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.9,
+						"angle": 2.96,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 6.1,
+						"angle": -0.29,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.2666, "angle": 0.96 },
+					{ "time": 6.4, "angle": 0 }
+				]
+			},
+			"machinegun": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{
+						"time": 2.8333,
+						"angle": 0,
+						"curve": [ 0.183, 0.17, 0.75, 1 ]
+					},
+					{
+						"time": 3,
+						"angle": -4.43,
+						"curve": [ 0.156, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 3.1666,
+						"angle": -2.93,
+						"curve": [ 0.156, 0.16, 0.75, 1 ]
+					},
+					{
+						"time": 4.8333,
+						"angle": 0,
+						"curve": [ 0.183, 0.17, 0.75, 1 ]
+					},
+					{
+						"time": 5.1666,
+						"angle": -6.05,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{
+						"time": 5.4,
+						"angle": 6.15,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 5.6, "angle": -1.26 }
+				]
+			},
+			"cannon": {
+				"rotate": [
+					{ "time": 0, "angle": 0 }
+				]
+			},
+			"cannonTarget": {
+				"translate": [
+					{
+						"time": 5,
+						"x": 0,
+						"y": 0,
+						"curve": [ 0.25, 0, 0.75, 1 ]
+					},
+					{ "time": 6.3333, "x": -15.38, "y": 99.99 }
+				]
+			}
+		},
+		"ik": {
+			"cannonTarget": [
+				{ "time": 0, "mix": 0.809, "curve": "stepped" },
+				{ "time": 4.7333, "mix": 0.809 },
+				{ "time": 5.1666, "mix": 0.504 },
+				{ "time": 5.6666 }
+			]
+		},
+		"paths": {
+			"treads": {
+				"position": [
+					{
+						"time": 0,
+						"curve": [ 0.549, 0, 0.907, 0.84 ]
+					},
+					{ "time": 3.0333, "position": 0.51 },
+					{ "time": 4.8666, "position": 0.9794 },
+					{
+						"time": 5.2666,
+						"position": 1,
+						"curve": [ 0.226, 0.15, 0.765, 0.96 ]
+					},
+					{
+						"time": 5.5333,
+						"position": 1.02,
+						"curve": [ 0.279, 0.32, 0.694, 0.99 ]
+					},
+					{ "time": 5.8333, "position": 1.021 }
+				]
+			}
+		}
+	}
+}
+}

二進制
spine-libgdx/spine-libgdx-tests/assets/path/tank.png


二進制
spine-libgdx/spine-libgdx-tests/assets/path/tank.skel


+ 13 - 0
spine-libgdx/spine-libgdx-tests/assets/path/test.atlas

@@ -0,0 +1,13 @@
+
+test.png
+size: 512,512
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+badlogic
+  rotate: false
+  xy: 2, 2
+  size: 460, 460
+  orig: 460, 460
+  offset: 0, 0
+  index: -1

+ 48 - 0
spine-libgdx/spine-libgdx-tests/assets/path/test.json

@@ -0,0 +1,48 @@
+{
+"skeleton": { "hash": "XCHjZ6CXxuRTpodKRwdOuXKgOx4", "spine": "3.3.07", "width": 78.98, "height": 78.98, "images": "./images/" },
+"bones": [
+	{ "name": "root" },
+	{ "name": "image", "parent": "root", "length": 100, "x": 91.84 },
+	{ "name": "pathbone", "parent": "root" }
+],
+"slots": [
+	{ "name": "badlogic", "bone": "image", "attachment": "badlogic" },
+	{ "name": "path", "bone": "pathbone", "attachment": "path" }
+],
+"path": [
+	{
+		"name": "pathConstraint",
+		"bones": [ "image" ],
+		"target": "path",
+		"rotateMode": "chain"
+	}
+],
+"skins": {
+	"default": {
+		"badlogic": {
+			"badlogic": { "x": -2.94, "y": 0.53, "scaleX": 0.129, "scaleY": 0.129, "width": 460, "height": 460 }
+		},
+		"path": {
+			"path": {
+				"type": "path",
+				"closed": true,
+				"lengths": [ 172.76, 358.01, 486.73, 700.2 ],
+				"vertexCount": 12,
+				"vertices": [ 2.23, 110.87, 47.15, 79.55, 67.76, 64.62, 172.59, 6.71, 207.52, 47.95, 242.44, 89.19, 231.71, 187.91, 207.52, 225.7, 183.32, 263.49, 122.11, 245.01, 86.65, 236.76, -123.64, 188.65 ]
+			}
+		}
+	}
+},
+"animations": {
+	"test": {
+		"paths": {
+			"pathConstraint": {
+				"position": [
+					{ "time": 0 },
+					{ "time": 3.3333, "position": 1 }
+				]
+			}
+		}
+	}
+}
+}

二進制
spine-libgdx/spine-libgdx-tests/assets/path/test.png


+ 46 - 0
spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/PathTest.java

@@ -0,0 +1,46 @@
+
+package com.esotericsoftware.spine;
+
+import com.badlogic.gdx.ApplicationAdapter;
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
+import com.badlogic.gdx.graphics.g2d.TextureAtlas;
+
+public class PathTest extends ApplicationAdapter {
+	
+	
+	@Override
+	public void create () {
+		TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("path/tank.atlas"));
+		SkeletonJson json = new SkeletonJson(atlas);
+		SkeletonData data = json.readSkeletonData(Gdx.files.internal("path/tank.json"));
+		Skeleton skeleton = new Skeleton(data);
+		skeleton.x = 0;
+		skeleton.y = 0;
+		AnimationStateData animData = new AnimationStateData(data);
+		AnimationState animState = new AnimationState(animData);		
+		animState.setAnimation(0, "drive", true);
+		
+		float d = 3;
+		for (int i = 0; i < 1; i++) {
+			skeleton.update(d);
+			animState.update(d);
+			animState.apply(skeleton);
+			skeleton.updateWorldTransform();
+			for (Bone bone: skeleton.getBones()) {
+				System.out.println(String.format("%s %f %f %f %f %f %f", bone.data.name, bone.a, bone.b, bone.c, bone.d, bone.worldX, bone.worldY));
+			}
+			System.out.println("===========================================");
+			for (int ii = 0; ii < skeleton.slots.size; ii++) {
+				Slot slot = skeleton.drawOrder.get(ii);
+				System.out.println(slot.data.name);
+			}
+			System.out.println("===========================================");
+			d += 0.1f;
+		}
+	}
+
+	public static void main (String[] args) {
+		new LwjglApplication(new PathTest());
+	}
+}

+ 0 - 193
spine-sfml/.cproject

@@ -1,193 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
-	<storageModule moduleId="org.eclipse.cdt.core.settings">
-		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.debug.804921154">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.debug.804921154" moduleId="org.eclipse.cdt.core.settings" name="Debug">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.804921154" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.804921154." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.debug.1440800193" name="MinGW GCC" resourceTypeBasedDiscovery="true" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.debug">
-							<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.debug.797088945" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.debug"/>
-							<builder buildPath="${workspace_loc:/cpp-generic/Debug}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.1296203303" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base">
-								<outputEntries>
-									<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
-									<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Release"/>
-								</outputEntries>
-							</builder>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug.1487845826" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug">
-								<option id="gnu.both.asm.option.include.paths.1112183959" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-sfml/src}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-c/src}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-c/include}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-sfml/SFML/include}&quot;"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.339251819" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.1265146112" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.1111247076" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug">
-								<option id="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level.1284147695" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level.1570084302" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.option.include.paths.934414518" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-sfml/src}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-c/src}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-c/include}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-sfml/SFML/include}&quot;"/>
-								</option>
-								<option id="gnu.cpp.compiler.option.warnings.allwarn.2053349441" name="All warnings (-Wall)" superClass="gnu.cpp.compiler.option.warnings.allwarn" value="true" valueType="boolean"/>
-								<option id="gnu.cpp.compiler.option.preprocessor.def.1463772359" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
-									<listOptionValue builtIn="false" value="SFML_STATIC"/>
-								</option>
-								<option id="gnu.cpp.compiler.option.dialect.std.322230174" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
-								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1445618618" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
-							</tool>
-							<tool command="gcc" id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.344670633" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug">
-								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.exe.debug.option.optimization.level.1455011160" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.debug.option.optimization.level" valueType="enumerated"/>
-								<option id="gnu.c.compiler.mingw.exe.debug.option.debugging.level.242859432" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.include.paths.991681732" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-sfml/src}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-c/src}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-c/include}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-sfml/SFML/include}&quot;"/>
-								</option>
-								<option id="gnu.c.compiler.option.misc.other.20851089" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0" valueType="string"/>
-								<option id="gnu.c.compiler.option.dialect.std.27152499" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.753970334" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug.913061526" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug.1697744244" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug">
-								<option id="gnu.cpp.link.option.paths.1569606245" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-c/Debug}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/spine-sfml/SFML/lib}&quot;"/>
-								</option>
-								<option id="gnu.cpp.link.option.libs.43946887" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
-									<listOptionValue builtIn="false" value="spine-c"/>
-									<listOptionValue builtIn="false" value="sfml-main-d"/>
-									<listOptionValue builtIn="false" value="sfml-graphics-s-d"/>
-									<listOptionValue builtIn="false" value="sfml-window-s-d"/>
-									<listOptionValue builtIn="false" value="sfml-system-s-d"/>
-									<listOptionValue builtIn="false" value="opengl32"/>
-									<listOptionValue builtIn="false" value="jpeg"/>
-									<listOptionValue builtIn="false" value="gdi32"/>
-									<listOptionValue builtIn="false" value="winmm"/>
-								</option>
-								<option id="gnu.cpp.link.option.flags.705669165" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-Wl,-subsystem,windows" valueType="string"/>
-								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.241907813" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-							</tool>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="example"/>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings">
-				<externalSettings containerId="spine-c;" factoryId="org.eclipse.cdt.core.cfg.export.settings.sipplier"/>
-			</storageModule>
-		</cconfiguration>
-		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.release.165980790">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.release.165980790" moduleId="org.eclipse.cdt.core.settings" name="Release">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.release.165980790" name="Release" parent="cdt.managedbuild.config.gnu.mingw.exe.release">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.release.165980790." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.release.1562355563" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.release">
-							<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.release.532329562" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.release"/>
-							<builder buildPath="${workspace_loc:/cpp-generic/Release}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.1379215371" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release.1078317821" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release">
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1307271372" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.687579974" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.1002197508" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release">
-								<option id="gnu.cpp.compiler.mingw.exe.release.option.optimization.level.1999365576" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.mingw.exe.release.option.debugging.level.1315352624" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
-								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.708689179" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1909158038" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release">
-								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.exe.release.option.optimization.level.1039575328" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.release.option.optimization.level" valueType="enumerated"/>
-								<option id="gnu.c.compiler.mingw.exe.release.option.debugging.level.1692329610" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.448919077" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release.1949432007" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release.169613949" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release">
-								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.2036848420" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-							</tool>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-		</cconfiguration>
-	</storageModule>
-	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-		<project id="spine-sfml.cdt.managedbuild.target.gnu.mingw.exe.802690956" name="Executable" projectType="cdt.managedbuild.target.gnu.mingw.exe"/>
-	</storageModule>
-	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
-	<storageModule moduleId="refreshScope" versionNumber="2">
-		<configuration configurationName="Release">
-			<resource resourceType="PROJECT" workspacePath="/cpp-generic"/>
-		</configuration>
-		<configuration configurationName="Debug"/>
-	</storageModule>
-	<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
-	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
-		<buildTargets>
-			<target name="moo" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
-				<buildCommand>make</buildCommand>
-				<buildArguments/>
-				<buildTarget>moo</buildTarget>
-				<stopOnError>true</stopOnError>
-				<useDefaultCommand>true</useDefaultCommand>
-				<runAllBuilders>true</runAllBuilders>
-			</target>
-		</buildTargets>
-	</storageModule>
-	<storageModule moduleId="scannerConfiguration">
-		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
-		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.804921154">
-			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
-		</scannerConfigBuildInfo>
-		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.804921154;cdt.managedbuild.config.gnu.mingw.exe.debug.804921154.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.344670633;cdt.managedbuild.tool.gnu.c.compiler.input.753970334">
-			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
-		</scannerConfigBuildInfo>
-		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.98344941;cdt.managedbuild.config.gnu.mingw.exe.debug.98344941.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.1019543305;cdt.managedbuild.tool.gnu.cpp.compiler.input.169804182">
-			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
-		</scannerConfigBuildInfo>
-		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.1009813244;cdt.managedbuild.config.gnu.mingw.exe.release.1009813244.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.590673427;cdt.managedbuild.tool.gnu.c.compiler.input.802052137">
-			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
-		</scannerConfigBuildInfo>
-		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.1009813244;cdt.managedbuild.config.gnu.mingw.exe.release.1009813244.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.1680995989;cdt.managedbuild.tool.gnu.cpp.compiler.input.672167706">
-			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
-		</scannerConfigBuildInfo>
-		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.98344941;cdt.managedbuild.config.gnu.mingw.exe.debug.98344941.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.155084450;cdt.managedbuild.tool.gnu.c.compiler.input.1081023111">
-			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
-		</scannerConfigBuildInfo>
-		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.804921154;cdt.managedbuild.config.gnu.mingw.exe.debug.804921154.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.1111247076;cdt.managedbuild.tool.gnu.cpp.compiler.input.1445618618">
-			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
-		</scannerConfigBuildInfo>
-	</storageModule>
-</cproject>

+ 0 - 28
spine-sfml/.project

@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>spine-sfml</name>
-	<comment></comment>
-	<projects>
-		<project>spine-c</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
-			<triggers>clean,full,incremental,</triggers>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
-			<triggers>full,incremental,</triggers>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.cdt.core.cnature</nature>
-		<nature>org.eclipse.cdt.core.ccnature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
-	</natures>
-</projectDescription>

+ 0 - 68
spine-sfml/.settings/org.eclipse.cdt.codan.core.prefs

@@ -1,68 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.cdt.codan.checkers.errnoreturn=Warning
-org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false}
-org.eclipse.cdt.codan.checkers.errreturnvalue=Error
-org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.checkers.noreturn=Error
-org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false}
-org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error
-org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error
-org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error
-org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},no_break_comment\=>"no break",last_case_param\=>true,empty_case_param\=>false}
-org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning
-org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},unknown\=>false,exceptions\=>()}
-org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error
-org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning
-org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},skip\=>true}
-org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error
-org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error
-org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error
-org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error
-org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info
-org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},pattern\=>"^[a-z]",macro\=>true,exceptions\=>()}
-org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error
-org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error
-org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>()}
-org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},paramNot\=>false}
-org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},else\=>false,afterelse\=>false}
-org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true}
-org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true}
-org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>("@(\#)","$Id")}
-org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
-useParentScope=false

+ 0 - 163
spine-sfml/.settings/org.eclipse.cdt.core.prefs

@@ -1,163 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.cdt.core.formatter.alignment_for_assignment=16
-org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80
-org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.cdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34
-org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18
-org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0
-org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16
-org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48
-org.eclipse.cdt.core.formatter.alignment_for_expression_list=0
-org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.cdt.core.formatter.alignment_for_member_access=0
-org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16
-org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line
-org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1
-org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true
-org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true
-org.eclipse.cdt.core.formatter.compact_else_if=true
-org.eclipse.cdt.core.formatter.continuation_indentation=2
-org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false
-org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0
-org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true
-org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false
-org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false
-org.eclipse.cdt.core.formatter.indent_empty_lines=false
-org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.cdt.core.formatter.indentation.size=4
-org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert
-org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert
-org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert
-org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert
-org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert
-org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert
-org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.cdt.core.formatter.join_wrapped_lines=true
-org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.cdt.core.formatter.lineSplit=130
-org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.cdt.core.formatter.tabulation.char=tab
-org.eclipse.cdt.core.formatter.tabulation.size=3
-org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false

Some files were not shown because too many files changed in this diff