浏览代码

Merge branch 'master' of https://github.com/EsotericSoftware/spine-runtimes

Conflicts:
	spine-csharp/src/SkeletonJson.cs
Fenrisul 11 年之前
父节点
当前提交
bed13e4a36
共有 100 个文件被更改,包括 1008 次插入12792 次删除
  1. 3 6
      .gitignore
  2. 39 16
      spine-c/include/spine/Animation.h
  3. 1 1
      spine-c/include/spine/AnimationState.h
  4. 11 3
      spine-c/include/spine/Bone.h
  5. 1 1
      spine-c/include/spine/BoundingBoxAttachment.h
  6. 33 27
      spine-c/include/spine/IkConstraint.h
  7. 27 29
      spine-c/include/spine/IkConstraintData.h
  8. 1 1
      spine-c/include/spine/MeshAttachment.h
  9. 1 1
      spine-c/include/spine/RegionAttachment.h
  10. 11 2
      spine-c/include/spine/Skeleton.h
  11. 15 5
      spine-c/include/spine/SkeletonData.h
  12. 1 1
      spine-c/include/spine/SkinnedMeshAttachment.h
  13. 1 4
      spine-c/include/spine/Slot.h
  14. 17 3
      spine-c/include/spine/extension.h
  15. 4 0
      spine-c/spine-c.vcxproj
  16. 12 0
      spine-c/spine-c.vcxproj.filters
  17. 211 152
      spine-c/src/spine/Animation.c
  18. 16 16
      spine-c/src/spine/AnimationState.c
  19. 49 32
      spine-c/src/spine/Bone.c
  20. 2 4
      spine-c/src/spine/BoundingBoxAttachment.c
  21. 133 0
      spine-c/src/spine/IkConstraint.c
  22. 14 16
      spine-c/src/spine/IkConstraintData.c
  23. 56 64
      spine-c/src/spine/Json.c
  24. 1 1
      spine-c/src/spine/Json.h
  25. 2 3
      spine-c/src/spine/MeshAttachment.c
  26. 4 11
      spine-c/src/spine/RegionAttachment.c
  27. 146 27
      spine-c/src/spine/Skeleton.c
  28. 7 7
      spine-c/src/spine/SkeletonBounds.c
  29. 25 14
      spine-c/src/spine/SkeletonData.c
  30. 116 41
      spine-c/src/spine/SkeletonJson.c
  31. 3 3
      spine-c/src/spine/SkinnedMeshAttachment.c
  32. 7 9
      spine-c/src/spine/Slot.c
  33. 12 12
      spine-cocos2d-iphone/2/src/spine/SkeletonRenderer.m
  34. 12 12
      spine-cocos2d-iphone/3.0/src/spine/SkeletonRenderer.m
  35. 2 2
      spine-cocos2dx/2/README.md
  36. 12 12
      spine-cocos2dx/2/src/spine/SkeletonRenderer.cpp
  37. 0 20
      spine-cocos2dx/3.0/README.md
  38. 0 18
      spine-cocos2dx/3.0/example/Classes/AppDelegate.h
  39. 0 61
      spine-cocos2dx/3.0/example/Classes/AppMacros.h
  40. 0 73
      spine-cocos2dx/3.0/example/Classes/GoblinsExample.cpp
  41. 0 105
      spine-cocos2dx/3.0/example/Classes/SpineboyExample.cpp
  42. 二进制
      spine-cocos2dx/3.0/example/Resources/ipad-retina/goblins-ffd.png
  43. 二进制
      spine-cocos2dx/3.0/example/Resources/ipad-retina/spineboy.png
  44. 二进制
      spine-cocos2dx/3.0/example/Resources/ipad/goblins-ffd.png
  45. 二进制
      spine-cocos2dx/3.0/example/Resources/ipad/spineboy.png
  46. 二进制
      spine-cocos2dx/3.0/example/Resources/iphone-retina/goblins-ffd.png
  47. 二进制
      spine-cocos2dx/3.0/example/Resources/iphone-retina/spineboy.png
  48. 二进制
      spine-cocos2dx/3.0/example/Resources/iphone/goblins-ffd.png
  49. 二进制
      spine-cocos2dx/3.0/example/Resources/iphone/spineboy.png
  50. 0 112
      spine-cocos2dx/3.0/src/spine/PolygonBatch.cpp
  51. 0 229
      spine-cocos2dx/3.0/src/spine/SkeletonAnimation.cpp
  52. 0 96
      spine-cocos2dx/3.0/src/spine/SkeletonAnimation.h
  53. 0 366
      spine-cocos2dx/3.0/src/spine/SkeletonRenderer.cpp
  54. 0 113
      spine-cocos2dx/3.0/src/spine/SkeletonRenderer.h
  55. 0 21
      spine-cocos2dx/3.1/README.md
  56. 0 87
      spine-cocos2dx/3.1/example/Classes/AppDelegate.cpp
  57. 0 18
      spine-cocos2dx/3.1/example/Classes/AppDelegate.h
  58. 0 61
      spine-cocos2dx/3.1/example/Classes/AppMacros.h
  59. 0 105
      spine-cocos2dx/3.1/example/Classes/SpineboyExample.cpp
  60. 0 49
      spine-cocos2dx/3.1/example/Classes/SpineboyExample.h
  61. 0 1081
      spine-cocos2dx/3.1/example/Resources/common/goblins-ffd.json
  62. 0 2412
      spine-cocos2dx/3.1/example/Resources/common/spineboy.json
  63. 二进制
      spine-cocos2dx/3.1/example/Resources/common/sprite.png
  64. 0 292
      spine-cocos2dx/3.1/example/Resources/ipad-retina/goblins-ffd.atlas
  65. 二进制
      spine-cocos2dx/3.1/example/Resources/ipad-retina/goblins-ffd.png
  66. 0 194
      spine-cocos2dx/3.1/example/Resources/ipad-retina/spineboy.atlas
  67. 二进制
      spine-cocos2dx/3.1/example/Resources/ipad-retina/spineboy.png
  68. 0 292
      spine-cocos2dx/3.1/example/Resources/ipad/goblins-ffd.atlas
  69. 二进制
      spine-cocos2dx/3.1/example/Resources/ipad/goblins-ffd.png
  70. 0 194
      spine-cocos2dx/3.1/example/Resources/ipad/spineboy.atlas
  71. 二进制
      spine-cocos2dx/3.1/example/Resources/ipad/spineboy.png
  72. 0 292
      spine-cocos2dx/3.1/example/Resources/iphone-retina/goblins-ffd.atlas
  73. 二进制
      spine-cocos2dx/3.1/example/Resources/iphone-retina/goblins-ffd.png
  74. 0 194
      spine-cocos2dx/3.1/example/Resources/iphone-retina/spineboy.atlas
  75. 二进制
      spine-cocos2dx/3.1/example/Resources/iphone-retina/spineboy.png
  76. 0 292
      spine-cocos2dx/3.1/example/Resources/iphone/goblins-ffd.atlas
  77. 二进制
      spine-cocos2dx/3.1/example/Resources/iphone/goblins-ffd.png
  78. 0 194
      spine-cocos2dx/3.1/example/Resources/iphone/spineboy.atlas
  79. 二进制
      spine-cocos2dx/3.1/example/Resources/iphone/spineboy.png
  80. 0 22
      spine-cocos2dx/3.1/example/proj.win32/main.cpp
  81. 0 9
      spine-cocos2dx/3.1/example/proj.win32/main.h
  82. 0 53
      spine-cocos2dx/3.1/example/proj.win32/spine-cocos2dx.sln
  83. 0 171
      spine-cocos2dx/3.1/example/proj.win32/spine-cocos2dx.vcxproj
  84. 0 69
      spine-cocos2dx/3.1/example/proj.win32/spine-cocos2dx.vcxproj.filters
  85. 0 112
      spine-cocos2dx/3.1/src/spine/PolygonBatch.cpp
  86. 0 229
      spine-cocos2dx/3.1/src/spine/SkeletonAnimation.cpp
  87. 0 96
      spine-cocos2dx/3.1/src/spine/SkeletonAnimation.h
  88. 0 369
      spine-cocos2dx/3.1/src/spine/SkeletonRenderer.cpp
  89. 0 113
      spine-cocos2dx/3.1/src/spine/SkeletonRenderer.h
  90. 0 55
      spine-cocos2dx/3.1/src/spine/spine-cocos2dx.cpp
  91. 0 39
      spine-cocos2dx/3.1/src/spine/spine-cocos2dx.h
  92. 0 21
      spine-cocos2dx/3.2/README.md
  93. 0 0
      spine-cocos2dx/3.2/cocos2dx/Place cocos2dx here.txt
  94. 0 91
      spine-cocos2dx/3.2/example/Classes/AppDelegate.cpp
  95. 0 49
      spine-cocos2dx/3.2/example/Classes/SpineboyExample.h
  96. 0 1081
      spine-cocos2dx/3.2/example/Resources/common/goblins-ffd.json
  97. 0 2412
      spine-cocos2dx/3.2/example/Resources/common/spineboy.json
  98. 二进制
      spine-cocos2dx/3.2/example/Resources/common/sprite.png
  99. 0 292
      spine-cocos2dx/3.2/example/Resources/ipad-retina/goblins-ffd.atlas
  100. 二进制
      spine-cocos2dx/3.2/example/Resources/ipad-retina/goblins-ffd.png

+ 3 - 6
.gitignore

@@ -25,12 +25,9 @@ spine-libgdx/libs/*
 spine-cocos2dx/2/cocos2dx/
 !spine-cocos2dx/2/cocos2dx/Place cocos2dx here.txt
 spine-cocos2dx/2/example/proj.win32/Debug
-spine-cocos2dx/3.0/cocos2dx/
-!spine-cocos2dx/3.0/cocos2dx/Place cocos2dx here.txt
-spine-cocos2dx/3.0/example/proj.win32/Debug
-spine-cocos2dx/3.1/cocos2dx/
-!spine-cocos2dx/3.1/cocos2dx/Place cocos2dx here.txt
-spine-cocos2dx/3.1/example/proj.win32/Debug
+spine-cocos2dx/3/cocos2dx/
+!spine-cocos2dx/3/cocos2dx/Place cocos2dx here.txt
+spine-cocos2dx/3/example/proj.win32/Debug
 xcuserdata
 
 spine-cocos2d-iphone/2/cocos2d/*

+ 39 - 16
spine-c/include/spine/Animation.h

@@ -45,25 +45,25 @@ typedef struct {
 	const char* const name;
 	float duration;
 
-	int timelineCount;
+	int timelinesCount;
 	spTimeline** timelines;
 } spAnimation;
 
-spAnimation* spAnimation_create (const char* name, int timelineCount);
+spAnimation* spAnimation_create (const char* name, int timelinesCount);
 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. */
 void spAnimation_apply (const spAnimation* self, struct spSkeleton* skeleton, float lastTime, float time, int loop,
-		spEvent** events, int* eventCount);
+		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 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* eventCount, float alpha);
+		spEvent** events, int* eventsCount, float alpha);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spAnimation Animation;
@@ -83,7 +83,8 @@ typedef enum {
 	SP_TIMELINE_ATTACHMENT,
 	SP_TIMELINE_EVENT,
 	SP_TIMELINE_DRAWORDER,
-	SP_TIMELINE_FFD
+	SP_TIMELINE_FFD,
+	SP_TIMELINE_IKCONSTRAINT
 } spTimelineType;
 
 struct spTimeline {
@@ -94,7 +95,7 @@ struct spTimeline {
 
 void spTimeline_dispose (spTimeline* self);
 void spTimeline_apply (const spTimeline* self, struct spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-		int* eventCount, float alpha);
+		int* eventsCount, float alpha);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spTimeline Timeline;
@@ -113,7 +114,7 @@ typedef spTimeline Timeline;
 
 typedef struct {
 	spTimeline super;
-	float* curves; /* dfx, dfy, ddfx, ddfy, dddfx, dddfy, ... */
+	float* curves; /* type, x, y, ... */
 } spCurveTimeline;
 
 void spCurveTimeline_setLinear (spCurveTimeline* self, int frameIndex);
@@ -142,7 +143,7 @@ typedef struct spBaseTimeline {
 	int boneIndex;
 } spRotateTimeline;
 
-spRotateTimeline* spRotateTimeline_create (int frameCount);
+spRotateTimeline* spRotateTimeline_create (int framesCount);
 
 void spRotateTimeline_setFrame (spRotateTimeline* self, int frameIndex, float time, float angle);
 
@@ -156,7 +157,7 @@ typedef spRotateTimeline RotateTimeline;
 
 typedef struct spBaseTimeline spTranslateTimeline;
 
-spTranslateTimeline* spTranslateTimeline_create (int frameCount);
+spTranslateTimeline* spTranslateTimeline_create (int framesCount);
 
 void spTranslateTimeline_setFrame (spTranslateTimeline* self, int frameIndex, float time, float x, float y);
 
@@ -170,7 +171,7 @@ typedef spTranslateTimeline TranslateTimeline;
 
 typedef struct spBaseTimeline spScaleTimeline;
 
-spScaleTimeline* spScaleTimeline_create (int frameCount);
+spScaleTimeline* spScaleTimeline_create (int framesCount);
 
 void spScaleTimeline_setFrame (spScaleTimeline* self, int frameIndex, float time, float x, float y);
 
@@ -189,7 +190,7 @@ typedef struct {
 	int slotIndex;
 } spColorTimeline;
 
-spColorTimeline* spColorTimeline_create (int frameCount);
+spColorTimeline* spColorTimeline_create (int framesCount);
 
 void spColorTimeline_setFrame (spColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a);
 
@@ -209,7 +210,7 @@ typedef struct {
 	const char** const attachmentNames;
 } spAttachmentTimeline;
 
-spAttachmentTimeline* spAttachmentTimeline_create (int frameCount);
+spAttachmentTimeline* spAttachmentTimeline_create (int framesCount);
 
 /* @param attachmentName May be 0. */
 void spAttachmentTimeline_setFrame (spAttachmentTimeline* self, int frameIndex, float time, const char* attachmentName);
@@ -229,7 +230,7 @@ typedef struct {
 	spEvent** const events;
 } spEventTimeline;
 
-spEventTimeline* spEventTimeline_create (int frameCount);
+spEventTimeline* spEventTimeline_create (int framesCount);
 
 void spEventTimeline_setFrame (spEventTimeline* self, int frameIndex, float time, spEvent* event);
 
@@ -246,10 +247,10 @@ typedef struct {
 	int const framesCount;
 	float* const frames; /* time, ... */
 	const int** const drawOrders;
-	int const slotCount;
+	int const slotsCount;
 } spDrawOrderTimeline;
 
-spDrawOrderTimeline* spDrawOrderTimeline_create (int frameCount, int slotCount);
+spDrawOrderTimeline* spDrawOrderTimeline_create (int framesCount, int slotsCount);
 
 void spDrawOrderTimeline_setFrame (spDrawOrderTimeline* self, int frameIndex, float time, const int* drawOrder);
 
@@ -271,7 +272,7 @@ typedef struct {
 	spAttachment* attachment;
 } spFFDTimeline;
 
-spFFDTimeline* spFFDTimeline_create (int frameCount, int frameVerticesCount);
+spFFDTimeline* spFFDTimeline_create (int framesCount, int frameVerticesCount);
 
 void spFFDTimeline_setFrame (spFFDTimeline* self, int frameIndex, float time, float* vertices);
 
@@ -281,6 +282,28 @@ typedef spFFDTimeline FFDTimeline;
 #define FFDTimeline_setFrame(...) spFFDTimeline_setFrame(__VA_ARGS__)
 #endif
 
+/**/
+
+typedef struct {
+	spCurveTimeline super;
+	int const framesCount;
+	float* const frames; /* time, mix, bendDirection, ... */
+	int ikConstraintIndex;
+} spIkConstraintTimeline;
+
+spIkConstraintTimeline* spIkConstraintTimeline_create (int framesCount);
+
+/* @param attachmentName May be 0. */
+void spIkConstraintTimeline_setFrame (spIkConstraintTimeline* self, int frameIndex, float time, float mix, int bendDirection);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spIkConstraintTimeline IkConstraintTimeline;
+#define IkConstraintTimeline_create(...) spIkConstraintTimeline_create(__VA_ARGS__)
+#define IkConstraintTimeline_setFrame(...) spIkConstraintTimeline_setFrame(__VA_ARGS__)
+#endif
+
+/**/
+
 #ifdef __cplusplus
 }
 #endif

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

@@ -67,7 +67,7 @@ struct spAnimationState {
 	float timeScale;
 	spAnimationStateListener listener;
 
-	int trackCount;
+	int tracksCount;
 	spTrackEntry** tracks;
 
 	void* rendererObject;

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

@@ -37,12 +37,15 @@
 extern "C" {
 #endif
 
+struct spSkeleton;
+
 typedef struct spBone spBone;
 struct spBone {
 	spBoneData* const data;
+	struct spSkeleton* const skeleton;
 	spBone* const parent;
 	float x, y;
-	float rotation;
+	float rotation, rotationIK;
 	float scaleX, scaleY;
 
 	float const m00, m01, worldX; /* a b x */
@@ -54,12 +57,15 @@ struct spBone {
 void spBone_setYDown (int/*bool*/yDown);
 
 /* @param parent May be 0. */
-spBone* spBone_create (spBoneData* data, spBone* parent);
+spBone* spBone_create (spBoneData* data, struct spSkeleton* skeleton, spBone* parent);
 void spBone_dispose (spBone* self);
 
 void spBone_setToSetupPose (spBone* self);
 
-void spBone_updateWorldTransform (spBone* self, int/*bool*/flipX, int/*bool*/flipY);
+void spBone_updateWorldTransform (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);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spBone Bone;
@@ -68,6 +74,8 @@ typedef spBone Bone;
 #define Bone_dispose(...) spBone_dispose(__VA_ARGS__)
 #define Bone_setToSetupPose(...) spBone_setToSetupPose(__VA_ARGS__)
 #define Bone_updateWorldTransform(...) spBone_updateWorldTransform(__VA_ARGS__)
+#define Bone_worldToLocal(...) spBone_worldToLocal(__VA_ARGS__)
+#define Bone_localToWorld(...) spBone_localToWorld(__VA_ARGS__)
 #endif
 
 #ifdef __cplusplus

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

@@ -47,7 +47,7 @@ struct spBoundingBoxAttachment {
 };
 
 spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name);
-void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, float x, float y, spBone* bone, float* vertices);
+void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spBone* bone, float* vertices);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spBoundingBoxAttachment BoundingBoxAttachment;

+ 33 - 27
spine-cocos2dx/3.1/src/spine/PolygonBatch.h → spine-c/include/spine/IkConstraint.h

@@ -28,40 +28,46 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *****************************************************************************/
 
-#ifndef SPINE_POLYGONBATCH_H_
-#define SPINE_POLYGONBATCH_H_
+#ifndef SPINE_IKCONSTRAINT_H_
+#define SPINE_IKCONSTRAINT_H_
 
-#include "cocos2d.h"
+#include <spine/IkConstraintData.h>
+#include <spine/Bone.h>
 
-namespace spine {
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-class PolygonBatch : public cocos2d::Ref {
-public:
-	static PolygonBatch* createWithCapacity (int capacity);
+struct spSkeleton;
 
-	/** @js ctor */
-	PolygonBatch();
+typedef struct spIkConstraint spIkConstraint;
+struct spIkConstraint {
+	spIkConstraintData* const data;
+	
+	int bonesCount;
+	spBone** bones;
+	
+	spBone* target;
+	int bendDirection;
+	float mix;
+};
 
-	/** @js NA
-	  * @lua NA */
-	virtual ~PolygonBatch();
+spIkConstraint* spIkConstraint_create (spIkConstraintData* data, const struct spSkeleton* skeleton);
+void spIkConstraint_dispose (spIkConstraint* self);
 
-	bool initWithCapacity (int capacity);
-	void add (const cocos2d::Texture2D* texture,
-		const float* vertices, const float* uvs, int verticesCount,
-		const int* triangles, int trianglesCount,
-		cocos2d::Color4B* color);
-	void flush ();
+void spIkConstraint_apply (spIkConstraint* self);
 
-private:
-	int capacity;
-	cocos2d::V2F_C4B_T2F* vertices;
-	int verticesCount;
-	GLushort* triangles;
-	int trianglesCount;
-	const cocos2d::Texture2D* texture;
-};
+void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, float alpha);
+void spIkConstraint_apply2 (spBone* parent, spBone* child, float targetX, float targetY, int bendDirection, float alpha);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spIkConstraint IkConstraint;
+#define IkConstraint_create(...) spIkConstraint_create(__VA_ARGS__)
+#define IkConstraint_dispose(...) spIkConstraint_dispose(__VA_ARGS__)
+#endif
 
+#ifdef __cplusplus
 }
+#endif
 
-#endif // SPINE_POLYGONBATCH_H_
+#endif /* SPINE_IKCONSTRAINT_H_ */

+ 27 - 29
spine-cocos2dx/3.0/src/spine/PolygonBatch.h → spine-c/include/spine/IkConstraintData.h

@@ -28,40 +28,38 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *****************************************************************************/
 
-#ifndef SPINE_POLYGONBATCH_H_
-#define SPINE_POLYGONBATCH_H_
+#ifndef SPINE_IKCONSTRAINTDATA_H_
+#define SPINE_IKCONSTRAINTDATA_H_
 
-#include "cocos2d.h"
+#include <spine/BoneData.h>
 
-namespace spine {
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-class PolygonBatch : public cocos2d::Ref {
-public:
-	static PolygonBatch* createWithCapacity (int capacity);
-
-	/** @js ctor */
-	PolygonBatch();
-
-	/** @js NA
-	  * @lua NA */
-	virtual ~PolygonBatch();
+typedef struct spIkConstraintData spIkConstraintData;
+struct spIkConstraintData {
+	const char* const name;
+	
+	int bonesCount;
+	spBoneData** bones;
+	
+	spBoneData* target;
+	int bendDirection;
+	float mix;
+};
 
-	bool initWithCapacity (int capacity);
-	void add (const cocos2d::Texture2D* texture,
-		const float* vertices, const float* uvs, int verticesCount,
-		const int* triangles, int trianglesCount,
-		cocos2d::Color4B* color);
-	void flush ();
+spIkConstraintData* spIkConstraintData_create (const char* name);
+void spIkConstraintData_dispose (spIkConstraintData* self);
 
-private:
-	int capacity;
-	cocos2d::V2F_C4B_T2F* vertices;
-	int verticesCount;
-	GLushort* triangles;
-	int trianglesCount;
-	const cocos2d::Texture2D* texture;
-};
+#ifdef SPINE_SHORT_NAMES
+typedef spIkConstraintData IkConstraintData;
+#define IkConstraintData_create(...) spIkConstraintData_create(__VA_ARGS__)
+#define IkConstraintData_dispose(...) spIkConstraintData_dispose(__VA_ARGS__)
+#endif
 
+#ifdef __cplusplus
 }
+#endif
 
-#endif // SPINE_POLYGONBATCH_H_
+#endif /* SPINE_IKCONSTRAINTDATA_H_ */

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

@@ -71,7 +71,7 @@ struct spMeshAttachment {
 
 spMeshAttachment* spMeshAttachment_create (const char* name);
 void spMeshAttachment_updateUVs (spMeshAttachment* self);
-void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, float x, float y, spSlot* slot, float* worldVertices);
+void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, spSlot* slot, float* worldVertices);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spMeshAttachment MeshAttachment;

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

@@ -62,7 +62,7 @@ struct spRegionAttachment {
 spRegionAttachment* spRegionAttachment_create (const char* name);
 void spRegionAttachment_setUVs (spRegionAttachment* self, float u, float v, float u2, float v2, int/*bool*/rotate);
 void spRegionAttachment_updateOffset (spRegionAttachment* self);
-void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, float x, float y, spBone* bone, float* vertices);
+void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, spBone* bone, float* vertices);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spVertexIndex VertexIndex;

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

@@ -34,6 +34,7 @@
 #include <spine/SkeletonData.h>
 #include <spine/Slot.h>
 #include <spine/Skin.h>
+#include <spine/IkConstraint.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -43,14 +44,17 @@ typedef struct spSkeleton spSkeleton;
 struct spSkeleton {
 	spSkeletonData* const data;
 
-	int boneCount;
+	int bonesCount;
 	spBone** bones;
 	spBone* const root;
 
-	int slotCount;
+	int slotsCount;
 	spSlot** slots;
 	spSlot** drawOrder;
 
+	int ikConstraintsCount;
+	spIkConstraint** ikConstraints;
+
 	spSkin* const skin;
 	float r, g, b, a;
 	float time;
@@ -61,6 +65,8 @@ struct spSkeleton {
 spSkeleton* spSkeleton_create (spSkeletonData* data);
 void spSkeleton_dispose (spSkeleton* self);
 
+/* Caches information about bones and IK constraints. Must be called if bones or IK constraints are added or removed. */
+void spSkeleton_updateCache (const spSkeleton* self);
 void spSkeleton_updateWorldTransform (const spSkeleton* self);
 
 void spSkeleton_setToSetupPose (const spSkeleton* self);
@@ -92,6 +98,9 @@ spAttachment* spSkeleton_getAttachmentForSlotIndex (const spSkeleton* self, int
 /* Returns 0 if the slot or attachment was not found. */
 int spSkeleton_setAttachment (spSkeleton* self, const char* slotName, const char* attachmentName);
 
+/* Returns 0 if the IK constraint was not found. */
+spIkConstraint* spSkeleton_findIkConstraint (const spSkeleton* self, const char* ikConstraintName);
+
 void spSkeleton_update (spSkeleton* self, float deltaTime);
 
 #ifdef SPINE_SHORT_NAMES

+ 15 - 5
spine-c/include/spine/SkeletonData.h

@@ -36,27 +36,35 @@
 #include <spine/Skin.h>
 #include <spine/EventData.h>
 #include <spine/Animation.h>
+#include <spine/IkConstraintData.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 typedef struct {
-	int boneCount;
+	const char* version;
+	const char* hash;
+	float width, height;
+
+	int bonesCount;
 	spBoneData** bones;
 
-	int slotCount;
+	int slotsCount;
 	spSlotData** slots;
 
-	int skinCount;
+	int skinsCount;
 	spSkin** skins;
 	spSkin* defaultSkin;
 
-	int eventCount;
+	int eventsCount;
 	spEventData** events;
 
-	int animationCount;
+	int animationsCount;
 	spAnimation** animations;
+
+	int ikConstraintsCount;
+	spIkConstraintData** ikConstraints;
 } spSkeletonData;
 
 spSkeletonData* spSkeletonData_create ();
@@ -74,6 +82,8 @@ spEventData* spSkeletonData_findEvent (const spSkeletonData* self, const char* e
 
 spAnimation* spSkeletonData_findAnimation (const spSkeletonData* self, const char* animationName);
 
+spIkConstraintData* spSkeletonData_findIkConstraint (const spSkeletonData* self, const char* ikConstraintName);
+
 #ifdef SPINE_SHORT_NAMES
 typedef spSkeletonData SkeletonData;
 #define SkeletonData_create(...) spSkeletonData_create(__VA_ARGS__)

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

@@ -74,7 +74,7 @@ struct spSkinnedMeshAttachment {
 
 spSkinnedMeshAttachment* spSkinnedMeshAttachment_create (const char* name);
 void spSkinnedMeshAttachment_updateUVs (spSkinnedMeshAttachment* self);
-void spSkinnedMeshAttachment_computeWorldVertices (spSkinnedMeshAttachment* self, float x, float y, spSlot* bone, float* worldVertices);
+void spSkinnedMeshAttachment_computeWorldVertices (spSkinnedMeshAttachment* self, spSlot* slot, float* worldVertices);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spSkinnedMeshAttachment SkinnedMeshAttachment;

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

@@ -39,11 +39,8 @@
 extern "C" {
 #endif
 
-struct spSkeleton;
-
 typedef struct spSlot {
 	spSlotData* const data;
-	struct spSkeleton* const skeleton;
 	spBone* const bone;
 	float r, g, b, a;
 	spAttachment* const attachment;
@@ -53,7 +50,7 @@ typedef struct spSlot {
 	float* attachmentVertices;
 } spSlot;
 
-spSlot* spSlot_create (spSlotData* data, struct spSkeleton* skeleton, spBone* bone);
+spSlot* spSlot_create (spSlotData* data, spBone* bone);
 void spSlot_dispose (spSlot* self);
 
 /* @param attachment May be 0 to clear the attachment for the slot. */

+ 17 - 3
spine-c/include/spine/extension.h

@@ -57,10 +57,24 @@
 /* Allocates a new char[], assigns it to TO, and copies FROM to it. Can be used on const types. */
 #define MALLOC_STR(TO,FROM) strcpy(CONST_CAST(char*, TO) = (char*)MALLOC(char, strlen(FROM) + 1), FROM)
 
+#define PI 3.1415926535897932385f
+#define DEG_RAD (PI / 180)
+#define RAD_DEG (180 / PI)
+
 #ifdef __STDC_VERSION__
 #define FMOD(A,B) fmodf(A, B)
+#define ATAN2(A,B) atan2f(A, B)
+#define SIN(A) sinf(A)
+#define COS(A) cosf(A)
+#define SQRT(A) sqrtf(A)
+#define ACOS(A) acosf(A)
 #else
 #define FMOD(A,B) (float)fmod(A, B)
+#define ATAN2(A,B) (float)atan2(A, B)
+#define COS(A) (float)cos(A)
+#define SIN(A) (float)sin(A)
+#define SQRT(A) (float)sqrt(A)
+#define ACOS(A) (float)acos(A)
 #endif
 
 #include <stdlib.h>
@@ -154,7 +168,7 @@ void _spAttachment_deinit (spAttachment* self);
 void _spTimeline_init (spTimeline* self, spTimelineType type, /**/
 void (*dispose) (spTimeline* self), /**/
 		void (*apply) (const spTimeline* self, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-				int* eventCount, float alpha));
+				int* eventsCount, float alpha));
 void _spTimeline_deinit (spTimeline* self);
 
 #ifdef SPINE_SHORT_NAMES
@@ -164,10 +178,10 @@ void _spTimeline_deinit (spTimeline* self);
 
 /**/
 
-void _spCurveTimeline_init (spCurveTimeline* self, spTimelineType type, int frameCount, /**/
+void _spCurveTimeline_init (spCurveTimeline* self, spTimelineType type, int framesCount, /**/
 void (*dispose) (spTimeline* self), /**/
 		void (*apply) (const spTimeline* self, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-				int* eventCount, float alpha));
+				int* eventsCount, float alpha));
 void _spCurveTimeline_deinit (spCurveTimeline* self);
 
 #ifdef SPINE_SHORT_NAMES

+ 4 - 0
spine-c/spine-c.vcxproj

@@ -84,6 +84,8 @@
     <ClInclude Include="include\spine\Event.h" />
     <ClInclude Include="include\spine\EventData.h" />
     <ClInclude Include="include\spine\extension.h" />
+    <ClInclude Include="include\spine\IkConstraint.h" />
+    <ClInclude Include="include\spine\IkConstraintData.h" />
     <ClInclude Include="include\spine\MeshAttachment.h" />
     <ClInclude Include="include\spine\RegionAttachment.h" />
     <ClInclude Include="include\spine\Skeleton.h" />
@@ -111,6 +113,8 @@
     <ClCompile Include="src\spine\Event.c" />
     <ClCompile Include="src\spine\EventData.c" />
     <ClCompile Include="src\spine\extension.c" />
+    <ClCompile Include="src\spine\IkConstraint.c" />
+    <ClCompile Include="src\spine\IkConstraintData.c" />
     <ClCompile Include="src\spine\Json.c" />
     <ClCompile Include="src\spine\MeshAttachment.c" />
     <ClCompile Include="src\spine\RegionAttachment.c" />

+ 12 - 0
spine-c/spine-c.vcxproj.filters

@@ -90,6 +90,12 @@
     <ClInclude Include="include\spine\spine.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="include\spine\IkConstraint.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="include\spine\IkConstraintData.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="src\spine\Atlas.c">
@@ -164,5 +170,11 @@
     <ClCompile Include="src\spine\SkinnedMeshAttachment.c">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="src\spine\IkConstraint.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="src\spine\IkConstraintData.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 211 - 152
spine-c/src/spine/Animation.c

@@ -29,20 +29,21 @@
  *****************************************************************************/
 
 #include <spine/Animation.h>
+#include <spine/IkConstraint.h>
 #include <limits.h>
 #include <spine/extension.h>
 
-spAnimation* spAnimation_create (const char* name, int timelineCount) {
+spAnimation* spAnimation_create (const char* name, int timelinesCount) {
 	spAnimation* self = NEW(spAnimation);
 	MALLOC_STR(self->name, name);
-	self->timelineCount = timelineCount;
-	self->timelines = MALLOC(spTimeline*, timelineCount);
+	self->timelinesCount = timelinesCount;
+	self->timelines = MALLOC(spTimeline*, timelinesCount);
 	return self;
 }
 
 void spAnimation_dispose (spAnimation* self) {
 	int i;
-	for (i = 0; i < self->timelineCount; ++i)
+	for (i = 0; i < self->timelinesCount; ++i)
 		spTimeline_dispose(self->timelines[i]);
 	FREE(self->timelines);
 	FREE(self->name);
@@ -50,8 +51,8 @@ void spAnimation_dispose (spAnimation* self) {
 }
 
 void spAnimation_apply (const spAnimation* self, spSkeleton* skeleton, float lastTime, float time, int loop, spEvent** events,
-		int* eventCount) {
-	int i, n = self->timelineCount;
+		int* eventsCount) {
+	int i, n = self->timelinesCount;
 
 	if (loop && self->duration) {
 		time = FMOD(time, self->duration);
@@ -59,12 +60,12 @@ void spAnimation_apply (const spAnimation* self, spSkeleton* skeleton, float las
 	}
 
 	for (i = 0; i < n; ++i)
-		spTimeline_apply(self->timelines[i], skeleton, lastTime, time, events, eventCount, 1);
+		spTimeline_apply(self->timelines[i], skeleton, lastTime, time, events, eventsCount, 1);
 }
 
 void spAnimation_mix (const spAnimation* self, spSkeleton* skeleton, float lastTime, float time, int loop, spEvent** events,
-		int* eventCount, float alpha) {
-	int i, n = self->timelineCount;
+		int* eventsCount, float alpha) {
+	int i, n = self->timelinesCount;
 
 	if (loop && self->duration) {
 		time = FMOD(time, self->duration);
@@ -72,21 +73,21 @@ void spAnimation_mix (const spAnimation* self, spSkeleton* skeleton, float lastT
 	}
 
 	for (i = 0; i < n; ++i)
-		spTimeline_apply(self->timelines[i], skeleton, lastTime, time, events, eventCount, alpha);
+		spTimeline_apply(self->timelines[i], skeleton, lastTime, time, events, eventsCount, alpha);
 }
 
 /**/
 
 typedef struct _spTimelineVtable {
 	void (*apply) (const spTimeline* self, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-			int* eventCount, float alpha);
+			int* eventsCount, float alpha);
 	void (*dispose) (spTimeline* self);
 } _spTimelineVtable;
 
 void _spTimeline_init (spTimeline* self, spTimelineType type, /**/
 void (*dispose) (spTimeline* self), /**/
 		void (*apply) (const spTimeline* self, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-				int* eventCount, float alpha)) {
+				int* eventsCount, float alpha)) {
 	CONST_CAST(spTimelineType, self->type) = type;
 	CONST_CAST(_spTimelineVtable*, self->vtable) = NEW(_spTimelineVtable);
 	VTABLE(spTimeline, self)->dispose = dispose;
@@ -102,22 +103,21 @@ void spTimeline_dispose (spTimeline* self) {
 }
 
 void spTimeline_apply (const spTimeline* self, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-		int* eventCount, float alpha) {
-	VTABLE(spTimeline, self)->apply(self, skeleton, lastTime, time, firedEvents, eventCount, alpha);
+		int* eventsCount, float alpha) {
+	VTABLE(spTimeline, self)->apply(self, skeleton, lastTime, time, firedEvents, eventsCount, alpha);
 }
 
 /**/
 
-static const float CURVE_LINEAR = 0;
-static const float CURVE_STEPPED = -1;
-static const int CURVE_SEGMENTS = 10;
+static const float CURVE_LINEAR = 0, CURVE_STEPPED = 1, CURVE_BEZIER = 2;
+static const int BEZIER_SEGMENTS = 10, BEZIER_SIZE = 10 * 2 - 1;
 
-void _spCurveTimeline_init (spCurveTimeline* self, spTimelineType type, int frameCount, /**/
+void _spCurveTimeline_init (spCurveTimeline* self, spTimelineType type, int framesCount, /**/
 void (*dispose) (spTimeline* self), /**/
 		void (*apply) (const spTimeline* self, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-				int* eventCount, float alpha)) {
+				int* eventsCount, float alpha)) {
 	_spTimeline_init(SUPER(self), type, dispose, apply);
-	self->curves = CALLOC(float, (frameCount - 1) * 6);
+	self->curves = CALLOC(float, (framesCount - 1) * BEZIER_SIZE);
 }
 
 void _spCurveTimeline_deinit (spCurveTimeline* self) {
@@ -126,61 +126,28 @@ void _spCurveTimeline_deinit (spCurveTimeline* self) {
 }
 
 void spCurveTimeline_setLinear (spCurveTimeline* self, int frameIndex) {
-	self->curves[frameIndex * 6] = CURVE_LINEAR;
+	self->curves[frameIndex * BEZIER_SIZE] = CURVE_LINEAR;
 }
 
 void spCurveTimeline_setStepped (spCurveTimeline* self, int frameIndex) {
-	self->curves[frameIndex * 6] = CURVE_STEPPED;
+	self->curves[frameIndex * BEZIER_SIZE] = CURVE_STEPPED;
 }
 
 void spCurveTimeline_setCurve (spCurveTimeline* self, int frameIndex, float cx1, float cy1, float cx2, float cy2) {
-	float subdiv_step = 1.0f / CURVE_SEGMENTS;
-	float subdiv_step2 = subdiv_step * subdiv_step;
-	float subdiv_step3 = subdiv_step2 * subdiv_step;
-	float pre1 = 3 * subdiv_step;
-	float pre2 = 3 * subdiv_step2;
-	float pre4 = 6 * subdiv_step2;
-	float pre5 = 6 * subdiv_step3;
-	float tmp1x = -cx1 * 2 + cx2;
-	float tmp1y = -cy1 * 2 + cy2;
-	float tmp2x = (cx1 - cx2) * 3 + 1;
-	float tmp2y = (cy1 - cy2) * 3 + 1;
-	int i = frameIndex * 6;
-	self->curves[i] = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3;
-	self->curves[i + 1] = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3;
-	self->curves[i + 2] = tmp1x * pre4 + tmp2x * pre5;
-	self->curves[i + 3] = tmp1y * pre4 + tmp2y * pre5;
-	self->curves[i + 4] = tmp2x * pre5;
-	self->curves[i + 5] = tmp2y * pre5;
-}
-
-float spCurveTimeline_getCurvePercent (const spCurveTimeline* self, int frameIndex, float percent) {
-	float dfy;
-	float ddfx;
-	float ddfy;
-	float dddfx;
-	float dddfy;
-	float x, y;
-	int i;
-	int curveIndex = frameIndex * 6;
-	float dfx = self->curves[curveIndex];
-	if (dfx == CURVE_LINEAR) return percent;
-	if (dfx == CURVE_STEPPED) return 0;
-	dfy = self->curves[curveIndex + 1];
-	ddfx = self->curves[curveIndex + 2];
-	ddfy = self->curves[curveIndex + 3];
-	dddfx = self->curves[curveIndex + 4];
-	dddfy = self->curves[curveIndex + 5];
-	x = dfx, y = dfy;
-	i = CURVE_SEGMENTS - 2;
-	while (1) {
-		if (x >= percent) {
-			float lastX = x - dfx;
-			float lastY = y - dfy;
-			return lastY + (y - lastY) * (percent - lastX) / (x - lastX);
-		}
-		if (i == 0) break;
-		i--;
+	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 x = dfx, y = dfy;
+
+	int i = frameIndex * BEZIER_SIZE, n = i + BEZIER_SIZE - 1;
+	self->curves[i++] = CURVE_BEZIER;
+
+	for (; i < n; i += 2) {
+		self->curves[i] = x;
+		self->curves[i + 1] = y;
 		dfx += ddfx;
 		dfy += ddfy;
 		ddfx += dddfx;
@@ -188,6 +155,31 @@ float spCurveTimeline_getCurvePercent (const spCurveTimeline* self, int frameInd
 		x += dfx;
 		y += dfy;
 	}
+}
+
+float spCurveTimeline_getCurvePercent (const spCurveTimeline* self, int frameIndex, float percent) {
+	float x, y;
+	int i = frameIndex * BEZIER_SIZE, start, n;
+	float type = self->curves[i];
+	if (type == CURVE_LINEAR) return percent;
+	if (type == CURVE_STEPPED) return 0;
+	i++;
+	x = 0;
+	for (start = i, n = i + BEZIER_SIZE - 1; i < n; i += 2) {
+		x = self->curves[i];
+		if (x >= percent) {
+			float prevX, prevY;
+			if (i == start) {
+				prevX = 0;
+				prevY = 0;
+			} else {
+				prevX = self->curves[i - 2];
+				prevY = self->curves[i - 1];
+			}
+			return prevY + (self->curves[i + 1] - prevY) * (percent - prevX) / (x - prevX);
+		}
+	}
+	y = self->curves[i - 1];
 	return y + (1 - y) * (percent - x) / (1 - x); /* Last point is 1,1. */
 }
 
@@ -208,6 +200,23 @@ static int binarySearch (float *values, int valuesLength, float target, int step
 	return 0;
 }
 
+/* @param target After the first and before the last entry. */
+static int binarySearch1 (float *values, int valuesLength, float target) {
+	int low = 0, current;
+	int high = valuesLength - 2;
+	if (high == 0) return 1;
+	current = high >> 1;
+	while (1) {
+		if (values[(current + 1)] <= target)
+			low = current + 1;
+		else
+			high = current;
+		if (low == high) return low + 1;
+		current = (low + high) >> 1;
+	}
+	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) {
@@ -227,13 +236,13 @@ void _spBaseTimeline_dispose (spTimeline* timeline) {
 }
 
 /* Many timelines have structure identical to struct spBaseTimeline and extend spCurveTimeline. **/
-struct spBaseTimeline* _spBaseTimeline_create (int frameCount, spTimelineType type, int frameSize, /**/
+struct spBaseTimeline* _spBaseTimeline_create (int framesCount, spTimelineType type, int frameSize, /**/
 		void (*apply) (const spTimeline* self, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-				int* eventCount, float alpha)) {
+				int* eventsCount, float alpha)) {
 	struct spBaseTimeline* self = NEW(struct spBaseTimeline);
-	_spCurveTimeline_init(SUPER(self), type, frameCount, _spBaseTimeline_dispose, apply);
+	_spCurveTimeline_init(SUPER(self), type, framesCount, _spBaseTimeline_dispose, apply);
 
-	CONST_CAST(int, self->framesCount) = frameCount * frameSize;
+	CONST_CAST(int, self->framesCount) = framesCount * frameSize;
 	CONST_CAST(float*, self->frames) = CALLOC(float, self->framesCount);
 
 	return self;
@@ -241,14 +250,14 @@ struct spBaseTimeline* _spBaseTimeline_create (int frameCount, spTimelineType ty
 
 /**/
 
-static const int ROTATE_LAST_FRAME_TIME = -2;
+static const int ROTATE_PREV_FRAME_TIME = -2;
 static const int ROTATE_FRAME_VALUE = 1;
 
 void _spRotateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-		int* eventCount, float alpha) {
+		int* eventsCount, float alpha) {
 	spBone *bone;
 	int frameIndex;
-	float lastFrameValue, frameTime, percent, amount;
+	float prevFrameValue, frameTime, percent, amount;
 
 	spRotateTimeline* self = SUB_CAST(spRotateTimeline, timeline);
 
@@ -268,17 +277,17 @@ void _spRotateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton,
 
 	/* Interpolate between the previous frame and the current frame. */
 	frameIndex = binarySearch(self->frames, self->framesCount, time, 2);
-	lastFrameValue = self->frames[frameIndex - 1];
+	prevFrameValue = self->frames[frameIndex - 1];
 	frameTime = self->frames[frameIndex];
-	percent = 1 - (time - frameTime) / (self->frames[frameIndex + ROTATE_LAST_FRAME_TIME] - frameTime);
-	percent = spCurveTimeline_getCurvePercent(SUPER(self), frameIndex / 2 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+	percent = 1 - (time - frameTime) / (self->frames[frameIndex + ROTATE_PREV_FRAME_TIME] - frameTime);
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), (frameIndex >> 1) - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
 
-	amount = self->frames[frameIndex + ROTATE_FRAME_VALUE] - lastFrameValue;
+	amount = self->frames[frameIndex + ROTATE_FRAME_VALUE] - prevFrameValue;
 	while (amount > 180)
 		amount -= 360;
 	while (amount < -180)
 		amount += 360;
-	amount = bone->data->rotation + (lastFrameValue + amount * percent) - bone->rotation;
+	amount = bone->data->rotation + (prevFrameValue + amount * percent) - bone->rotation;
 	while (amount > 180)
 		amount -= 360;
 	while (amount < -180)
@@ -286,8 +295,8 @@ void _spRotateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton,
 	bone->rotation += amount * alpha;
 }
 
-spRotateTimeline* spRotateTimeline_create (int frameCount) {
-	return _spBaseTimeline_create(frameCount, SP_TIMELINE_ROTATE, 2, _spRotateTimeline_apply);
+spRotateTimeline* spRotateTimeline_create (int framesCount) {
+	return _spBaseTimeline_create(framesCount, SP_TIMELINE_ROTATE, 2, _spRotateTimeline_apply);
 }
 
 void spRotateTimeline_setFrame (spRotateTimeline* self, int frameIndex, float time, float angle) {
@@ -298,15 +307,15 @@ void spRotateTimeline_setFrame (spRotateTimeline* self, int frameIndex, float ti
 
 /**/
 
-static const int TRANSLATE_LAST_FRAME_TIME = -3;
+static const int TRANSLATE_PREV_FRAME_TIME = -3;
 static const int TRANSLATE_FRAME_X = 1;
 static const int TRANSLATE_FRAME_Y = 2;
 
 void _spTranslateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
-		spEvent** firedEvents, int* eventCount, float alpha) {
+		spEvent** firedEvents, int* eventsCount, float alpha) {
 	spBone *bone;
 	int frameIndex;
-	float lastFrameX, lastFrameY, frameTime, percent;
+	float prevFrameX, prevFrameY, frameTime, percent;
 
 	spTranslateTimeline* self = SUB_CAST(spTranslateTimeline, timeline);
 
@@ -322,20 +331,20 @@ void _spTranslateTimeline_apply (const spTimeline* timeline, spSkeleton* skeleto
 
 	/* Interpolate between the previous frame and the current frame. */
 	frameIndex = binarySearch(self->frames, self->framesCount, time, 3);
-	lastFrameX = self->frames[frameIndex - 2];
-	lastFrameY = self->frames[frameIndex - 1];
+	prevFrameX = self->frames[frameIndex - 2];
+	prevFrameY = self->frames[frameIndex - 1];
 	frameTime = self->frames[frameIndex];
-	percent = 1 - (time - frameTime) / (self->frames[frameIndex + TRANSLATE_LAST_FRAME_TIME] - frameTime);
+	percent = 1 - (time - frameTime) / (self->frames[frameIndex + TRANSLATE_PREV_FRAME_TIME] - frameTime);
 	percent = spCurveTimeline_getCurvePercent(SUPER(self), frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
 
-	bone->x += (bone->data->x + lastFrameX + (self->frames[frameIndex + TRANSLATE_FRAME_X] - lastFrameX) * percent - bone->x)
+	bone->x += (bone->data->x + prevFrameX + (self->frames[frameIndex + TRANSLATE_FRAME_X] - prevFrameX) * percent - bone->x)
 			* alpha;
-	bone->y += (bone->data->y + lastFrameY + (self->frames[frameIndex + TRANSLATE_FRAME_Y] - lastFrameY) * percent - bone->y)
+	bone->y += (bone->data->y + prevFrameY + (self->frames[frameIndex + TRANSLATE_FRAME_Y] - prevFrameY) * percent - bone->y)
 			* alpha;
 }
 
-spTranslateTimeline* spTranslateTimeline_create (int frameCount) {
-	return _spBaseTimeline_create(frameCount, SP_TIMELINE_TRANSLATE, 3, _spTranslateTimeline_apply);
+spTranslateTimeline* spTranslateTimeline_create (int framesCount) {
+	return _spBaseTimeline_create(framesCount, SP_TIMELINE_TRANSLATE, 3, _spTranslateTimeline_apply);
 }
 
 void spTranslateTimeline_setFrame (spTranslateTimeline* self, int frameIndex, float time, float x, float y) {
@@ -348,10 +357,10 @@ void spTranslateTimeline_setFrame (spTranslateTimeline* self, int frameIndex, fl
 /**/
 
 void _spScaleTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-		int* eventCount, float alpha) {
+		int* eventsCount, float alpha) {
 	spBone *bone;
 	int frameIndex;
-	float lastFrameX, lastFrameY, frameTime, percent;
+	float prevFrameX, prevFrameY, frameTime, percent;
 
 	spScaleTimeline* self = SUB_CAST(spScaleTimeline, timeline);
 
@@ -366,20 +375,20 @@ void _spScaleTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 
 	/* Interpolate between the previous frame and the current frame. */
 	frameIndex = binarySearch(self->frames, self->framesCount, time, 3);
-	lastFrameX = self->frames[frameIndex - 2];
-	lastFrameY = self->frames[frameIndex - 1];
+	prevFrameX = self->frames[frameIndex - 2];
+	prevFrameY = self->frames[frameIndex - 1];
 	frameTime = self->frames[frameIndex];
-	percent = 1 - (time - frameTime) / (self->frames[frameIndex + TRANSLATE_LAST_FRAME_TIME] - frameTime);
+	percent = 1 - (time - frameTime) / (self->frames[frameIndex + TRANSLATE_PREV_FRAME_TIME] - frameTime);
 	percent = spCurveTimeline_getCurvePercent(SUPER(self), frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
 
-	bone->scaleX += (bone->data->scaleX - 1 + lastFrameX + (self->frames[frameIndex + TRANSLATE_FRAME_X] - lastFrameX) * percent
+	bone->scaleX += (bone->data->scaleX - 1 + prevFrameX + (self->frames[frameIndex + TRANSLATE_FRAME_X] - prevFrameX) * percent
 			- bone->scaleX) * alpha;
-	bone->scaleY += (bone->data->scaleY - 1 + lastFrameY + (self->frames[frameIndex + TRANSLATE_FRAME_Y] - lastFrameY) * percent
+	bone->scaleY += (bone->data->scaleY - 1 + prevFrameY + (self->frames[frameIndex + TRANSLATE_FRAME_Y] - prevFrameY) * percent
 			- bone->scaleY) * alpha;
 }
 
-spScaleTimeline* spScaleTimeline_create (int frameCount) {
-	return _spBaseTimeline_create(frameCount, SP_TIMELINE_SCALE, 3, _spScaleTimeline_apply);
+spScaleTimeline* spScaleTimeline_create (int framesCount) {
+	return _spBaseTimeline_create(framesCount, SP_TIMELINE_SCALE, 3, _spScaleTimeline_apply);
 }
 
 void spScaleTimeline_setFrame (spScaleTimeline* self, int frameIndex, float time, float x, float y) {
@@ -388,17 +397,17 @@ void spScaleTimeline_setFrame (spScaleTimeline* self, int frameIndex, float time
 
 /**/
 
-static const int COLOR_LAST_FRAME_TIME = -5;
+static const int COLOR_PREV_FRAME_TIME = -5;
 static const int COLOR_FRAME_R = 1;
 static const int COLOR_FRAME_G = 2;
 static const int COLOR_FRAME_B = 3;
 static const int COLOR_FRAME_A = 4;
 
 void _spColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-		int* eventCount, float alpha) {
+		int* eventsCount, float alpha) {
 	spSlot *slot;
 	int frameIndex;
-	float lastFrameR, lastFrameG, lastFrameB, lastFrameA, percent, frameTime;
+	float prevFrameR, prevFrameG, prevFrameB, prevFrameA, percent, frameTime;
 	float r, g, b, a;
 	spColorTimeline* self = (spColorTimeline*)timeline;
 
@@ -414,18 +423,18 @@ void _spColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 	} else {
 		/* Interpolate between the previous frame and the current frame. */
 		frameIndex = binarySearch(self->frames, self->framesCount, time, 5);
-		lastFrameR = self->frames[frameIndex - 4];
-		lastFrameG = self->frames[frameIndex - 3];
-		lastFrameB = self->frames[frameIndex - 2];
-		lastFrameA = self->frames[frameIndex - 1];
+		prevFrameR = self->frames[frameIndex - 4];
+		prevFrameG = self->frames[frameIndex - 3];
+		prevFrameB = self->frames[frameIndex - 2];
+		prevFrameA = self->frames[frameIndex - 1];
 		frameTime = self->frames[frameIndex];
-		percent = 1 - (time - frameTime) / (self->frames[frameIndex + COLOR_LAST_FRAME_TIME] - frameTime);
+		percent = 1 - (time - frameTime) / (self->frames[frameIndex + COLOR_PREV_FRAME_TIME] - frameTime);
 		percent = spCurveTimeline_getCurvePercent(SUPER(self), frameIndex / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
 
-		r = lastFrameR + (self->frames[frameIndex + COLOR_FRAME_R] - lastFrameR) * percent;
-		g = lastFrameG + (self->frames[frameIndex + COLOR_FRAME_G] - lastFrameG) * percent;
-		b = lastFrameB + (self->frames[frameIndex + COLOR_FRAME_B] - lastFrameB) * percent;
-		a = lastFrameA + (self->frames[frameIndex + COLOR_FRAME_A] - lastFrameA) * percent;
+		r = prevFrameR + (self->frames[frameIndex + COLOR_FRAME_R] - prevFrameR) * percent;
+		g = prevFrameG + (self->frames[frameIndex + COLOR_FRAME_G] - prevFrameG) * percent;
+		b = prevFrameB + (self->frames[frameIndex + COLOR_FRAME_B] - prevFrameB) * percent;
+		a = prevFrameA + (self->frames[frameIndex + COLOR_FRAME_A] - prevFrameA) * percent;
 	}
 	slot = skeleton->slots[self->slotIndex];
 	if (alpha < 1) {
@@ -441,8 +450,8 @@ void _spColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 	}
 }
 
-spColorTimeline* spColorTimeline_create (int frameCount) {
-	return (spColorTimeline*)_spBaseTimeline_create(frameCount, SP_TIMELINE_COLOR, 5, _spColorTimeline_apply);
+spColorTimeline* spColorTimeline_create (int framesCount) {
+	return (spColorTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_COLOR, 5, _spColorTimeline_apply);
 }
 
 void spColorTimeline_setFrame (spColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a) {
@@ -457,17 +466,20 @@ void spColorTimeline_setFrame (spColorTimeline* self, int frameIndex, float time
 /**/
 
 void _spAttachmentTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
-		spEvent** firedEvents, int* eventCount, float alpha) {
+		spEvent** firedEvents, int* eventsCount, float alpha) {
 	int frameIndex;
 	const char* attachmentName;
 	spAttachmentTimeline* self = (spAttachmentTimeline*)timeline;
 
-	if (time < self->frames[0]) return; /* Time is before first frame. */
+	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[self->framesCount - 1]) /* Time is after last frame. */
-		frameIndex = self->framesCount - 1;
-	else
-		frameIndex = binarySearch(self->frames, self->framesCount, time, 1) - 1;
+	frameIndex = time >= self->frames[self->framesCount - 1] ?
+		self->framesCount - 1 : binarySearch1(self->frames, self->framesCount, time) - 1;
+	if (self->frames[frameIndex] <= lastTime) return;
 
 	attachmentName = self->attachmentNames[frameIndex];
 	spSlot_setAttachment(skeleton->slots[self->slotIndex],
@@ -487,13 +499,13 @@ void _spAttachmentTimeline_dispose (spTimeline* timeline) {
 	FREE(self);
 }
 
-spAttachmentTimeline* spAttachmentTimeline_create (int frameCount) {
+spAttachmentTimeline* spAttachmentTimeline_create (int framesCount) {
 	spAttachmentTimeline* self = NEW(spAttachmentTimeline);
 	_spTimeline_init(SUPER(self), SP_TIMELINE_ATTACHMENT, _spAttachmentTimeline_dispose, _spAttachmentTimeline_apply);
 
-	CONST_CAST(int, self->framesCount) = frameCount;
-	CONST_CAST(float*, self->frames) = CALLOC(float, frameCount);
-	CONST_CAST(char**, self->attachmentNames) = CALLOC(char*, frameCount);
+	CONST_CAST(int, self->framesCount) = framesCount;
+	CONST_CAST(float*, self->frames) = CALLOC(float, framesCount);
+	CONST_CAST(char**, self->attachmentNames) = CALLOC(char*, framesCount);
 
 	return self;
 }
@@ -512,13 +524,13 @@ void spAttachmentTimeline_setFrame (spAttachmentTimeline* self, int frameIndex,
 
 /** Fires events for frames > lastTime and <= time. */
 void _spEventTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-		int* eventCount, float alpha) {
+		int* eventsCount, float alpha) {
 	spEventTimeline* self = (spEventTimeline*)timeline;
 	int frameIndex;
 	if (!firedEvents) return;
 
 	if (lastTime > time) { /* Fire events after last time for looped animations. */
-		_spEventTimeline_apply(timeline, skeleton, lastTime, (float)INT_MAX, firedEvents, eventCount, alpha);
+		_spEventTimeline_apply(timeline, skeleton, lastTime, (float)INT_MAX, firedEvents, eventsCount, alpha);
 		lastTime = -1;
 	} else if (lastTime >= self->frames[self->framesCount - 1]) /* Last time is after last frame. */
 	return;
@@ -528,7 +540,7 @@ void _spEventTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 		frameIndex = 0;
 	else {
 		float frame;
-		frameIndex = binarySearch(self->frames, self->framesCount, lastTime, 1);
+		frameIndex = binarySearch1(self->frames, self->framesCount, lastTime);
 		frame = self->frames[frameIndex];
 		while (frameIndex > 0) { /* Fire multiple events with the same frame. */
 			if (self->frames[frameIndex - 1] != frame) break;
@@ -536,8 +548,8 @@ void _spEventTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 		}
 	}
 	for (; frameIndex < self->framesCount && time >= self->frames[frameIndex]; ++frameIndex) {
-		firedEvents[*eventCount] = self->events[frameIndex];
-		(*eventCount)++;
+		firedEvents[*eventsCount] = self->events[frameIndex];
+		(*eventsCount)++;
 	}
 }
 
@@ -554,13 +566,13 @@ void _spEventTimeline_dispose (spTimeline* timeline) {
 	FREE(self);
 }
 
-spEventTimeline* spEventTimeline_create (int frameCount) {
+spEventTimeline* spEventTimeline_create (int framesCount) {
 	spEventTimeline* self = NEW(spEventTimeline);
 	_spTimeline_init(SUPER(self), SP_TIMELINE_EVENT, _spEventTimeline_dispose, _spEventTimeline_apply);
 
-	CONST_CAST(int, self->framesCount) = frameCount;
-	CONST_CAST(float*, self->frames) = CALLOC(float, frameCount);
-	CONST_CAST(spEvent**, self->events) = CALLOC(spEvent*, frameCount);
+	CONST_CAST(int, self->framesCount) = framesCount;
+	CONST_CAST(float*, self->frames) = CALLOC(float, framesCount);
+	CONST_CAST(spEvent**, self->events) = CALLOC(spEvent*, framesCount);
 
 	return self;
 }
@@ -575,7 +587,7 @@ void spEventTimeline_setFrame (spEventTimeline* self, int frameIndex, float time
 /**/
 
 void _spDrawOrderTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
-		spEvent** firedEvents, int* eventCount, float alpha) {
+		spEvent** firedEvents, int* eventsCount, float alpha) {
 	int i;
 	int frameIndex;
 	const int* drawOrderToSetupIndex;
@@ -586,13 +598,13 @@ void _spDrawOrderTimeline_apply (const spTimeline* timeline, spSkeleton* skeleto
 	if (time >= self->frames[self->framesCount - 1]) /* Time is after last frame. */
 		frameIndex = self->framesCount - 1;
 	else
-		frameIndex = binarySearch(self->frames, self->framesCount, time, 1) - 1;
+		frameIndex = binarySearch1(self->frames, self->framesCount, time) - 1;
 
 	drawOrderToSetupIndex = self->drawOrders[frameIndex];
 	if (!drawOrderToSetupIndex)
-		memcpy(skeleton->drawOrder, skeleton->slots, self->slotCount * sizeof(int));
+		memcpy(skeleton->drawOrder, skeleton->slots, self->slotsCount * sizeof(int));
 	else {
-		for (i = 0; i < self->slotCount; ++i)
+		for (i = 0; i < self->slotsCount; ++i)
 			skeleton->drawOrder[i] = skeleton->slots[drawOrderToSetupIndex[i]];
 	}
 }
@@ -610,14 +622,14 @@ void _spDrawOrderTimeline_dispose (spTimeline* timeline) {
 	FREE(self);
 }
 
-spDrawOrderTimeline* spDrawOrderTimeline_create (int frameCount, int slotCount) {
+spDrawOrderTimeline* spDrawOrderTimeline_create (int framesCount, int slotsCount) {
 	spDrawOrderTimeline* self = NEW(spDrawOrderTimeline);
 	_spTimeline_init(SUPER(self), SP_TIMELINE_DRAWORDER, _spDrawOrderTimeline_dispose, _spDrawOrderTimeline_apply);
 
-	CONST_CAST(int, self->framesCount) = frameCount;
-	CONST_CAST(float*, self->frames) = CALLOC(float, frameCount);
-	CONST_CAST(int**, self->drawOrders) = CALLOC(int*, frameCount);
-	CONST_CAST(int, self->slotCount) = slotCount;
+	CONST_CAST(int, self->framesCount) = framesCount;
+	CONST_CAST(float*, self->frames) = CALLOC(float, framesCount);
+	CONST_CAST(int**, self->drawOrders) = CALLOC(int*, framesCount);
+	CONST_CAST(int, self->slotsCount) = slotsCount;
 
 	return self;
 }
@@ -629,15 +641,15 @@ void spDrawOrderTimeline_setFrame (spDrawOrderTimeline* self, int frameIndex, fl
 	if (!drawOrder)
 		self->drawOrders[frameIndex] = 0;
 	else {
-		self->drawOrders[frameIndex] = MALLOC(int, self->slotCount);
-		memcpy(CONST_CAST(int*, self->drawOrders[frameIndex]), drawOrder, self->slotCount * sizeof(int));
+		self->drawOrders[frameIndex] = MALLOC(int, self->slotsCount);
+		memcpy(CONST_CAST(int*, self->drawOrders[frameIndex]), drawOrder, self->slotsCount * sizeof(int));
 	}
 }
 
 /**/
 
 void _spFFDTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
-		int* eventCount, float alpha) {
+		int* eventsCount, float alpha) {
 	int frameIndex, i;
 	float percent, frameTime;
 	const float* prevVertices;
@@ -674,7 +686,7 @@ void _spFFDTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, flo
 	}
 
 	/* Interpolate between the previous frame and the current frame. */
-	frameIndex = binarySearch(self->frames, self->framesCount, time, 1);
+	frameIndex = binarySearch1(self->frames, self->framesCount, time);
 	frameTime = self->frames[frameIndex];
 	percent = 1 - (time - frameTime) / (self->frames[frameIndex - 1] - frameTime);
 	percent = spCurveTimeline_getCurvePercent(SUPER(self), frameIndex - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
@@ -708,12 +720,12 @@ void _spFFDTimeline_dispose (spTimeline* timeline) {
 	FREE(self);
 }
 
-spFFDTimeline* spFFDTimeline_create (int frameCount, int frameVerticesCount) {
+spFFDTimeline* spFFDTimeline_create (int framesCount, int frameVerticesCount) {
 	spFFDTimeline* self = NEW(spFFDTimeline);
-	_spCurveTimeline_init(SUPER(self), SP_TIMELINE_FFD, frameCount, _spFFDTimeline_dispose, _spFFDTimeline_apply);
-	CONST_CAST(int, self->framesCount) = frameCount;
+	_spCurveTimeline_init(SUPER(self), SP_TIMELINE_FFD, framesCount, _spFFDTimeline_dispose, _spFFDTimeline_apply);
+	CONST_CAST(int, self->framesCount) = framesCount;
 	CONST_CAST(float*, self->frames) = CALLOC(float, self->framesCount);
-	CONST_CAST(float**, self->frameVertices) = CALLOC(float*, frameCount);
+	CONST_CAST(float**, self->frameVertices) = CALLOC(float*, framesCount);
 	CONST_CAST(int, self->frameVerticesCount) = frameVerticesCount;
 	return self;
 }
@@ -729,3 +741,50 @@ void spFFDTimeline_setFrame (spFFDTimeline* self, int frameIndex, float time, fl
 		memcpy(CONST_CAST(float*, self->frameVertices[frameIndex]), vertices, self->frameVerticesCount * sizeof(float));
 	}
 }
+
+
+/**/
+
+static const int IKCONSTRAINT_PREV_FRAME_TIME = -3;
+static const int IKCONSTRAINT_FRAME_MIX = 1;
+static const int IKCONSTRAINT_FRAME_BEND_DIRECTION = 2;
+
+void _spIkConstraintTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
+		spEvent** firedEvents, int* eventsCount, float alpha) {
+	int frameIndex;
+	float prevFrameMix, frameTime, percent, mix;
+	spIkConstraint* ikConstraint;
+	spIkConstraintTimeline* self = (spIkConstraintTimeline*)timeline;
+
+	if (time < self->frames[0]) return; /* Time is before first frame. */
+
+	ikConstraint = skeleton->ikConstraints[self->ikConstraintIndex];
+
+	if (time >= self->frames[self->framesCount - 3]) { /* Time is after last frame. */
+		ikConstraint->mix += (self->frames[self->framesCount - 2] - ikConstraint->mix) * alpha;
+		ikConstraint->bendDirection = (int)self->frames[self->framesCount - 1];
+		return;
+	}
+
+	/* Interpolate between the previous frame and the current frame. */
+	frameIndex = binarySearch(self->frames, self->framesCount, time, 3);
+	prevFrameMix = self->frames[frameIndex - 2];
+	frameTime = self->frames[frameIndex];
+	percent = 1 - (time - frameTime) / (self->frames[frameIndex + IKCONSTRAINT_PREV_FRAME_TIME] - frameTime);
+	percent = spCurveTimeline_getCurvePercent(SUPER(self), frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
+
+	mix = prevFrameMix + (self->frames[frameIndex + IKCONSTRAINT_FRAME_MIX] - prevFrameMix) * percent;
+	ikConstraint->mix += (mix - ikConstraint->mix) * alpha;
+	ikConstraint->bendDirection = (int)self->frames[frameIndex + IKCONSTRAINT_FRAME_BEND_DIRECTION];
+}
+
+spIkConstraintTimeline* spIkConstraintTimeline_create (int framesCount) {
+	return (spIkConstraintTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_IKCONSTRAINT, 3, _spIkConstraintTimeline_apply);
+}
+
+void spIkConstraintTimeline_setFrame (spIkConstraintTimeline* self, int frameIndex, float time, float mix, int bendDirection) {
+	frameIndex *= 3;
+	self->frames[frameIndex] = time;
+	self->frames[frameIndex + 1] = mix;
+	self->frames[frameIndex + 2] = (float)bendDirection;
+}

+ 16 - 16
spine-c/src/spine/AnimationState.c

@@ -80,7 +80,7 @@ void spAnimationState_dispose (spAnimationState* self) {
 	int i;
 	_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
 	FREE(internal->events);
-	for (i = 0; i < self->trackCount; ++i)
+	for (i = 0; i < self->tracksCount; ++i)
 		_spAnimationState_disposeAllEntries(self, self->tracks[i]);
 	FREE(self->tracks);
 	FREE(self);
@@ -92,7 +92,7 @@ void spAnimationState_update (spAnimationState* self, float delta) {
 	int i;
 	float previousDelta;
 	delta *= self->timeScale;
-	for (i = 0; i < self->trackCount; ++i) {
+	for (i = 0; i < self->tracksCount; ++i) {
 		spTrackEntry* current = self->tracks[i];
 		if (!current) continue;
 
@@ -117,15 +117,15 @@ void spAnimationState_apply (spAnimationState* self, spSkeleton* skeleton) {
 	_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
 
 	int i, ii;
-	int eventCount;
+	int eventsCount;
 	int entryChanged;
 	float time;
 	spTrackEntry* previous;
-	for (i = 0; i < self->trackCount; ++i) {
+	for (i = 0; i < self->tracksCount; ++i) {
 		spTrackEntry* current = self->tracks[i];
 		if (!current) continue;
 
-		eventCount = 0;
+		eventsCount = 0;
 
 		time = current->time;
 		if (!current->loop && time > current->endTime) time = current->endTime;
@@ -134,10 +134,10 @@ void spAnimationState_apply (spAnimationState* self, spSkeleton* skeleton) {
 		if (!previous) {
 			if (current->mix == 1) {
 				spAnimation_apply(current->animation, skeleton, current->lastTime, time,
-					current->loop, internal->events, &eventCount);
+					current->loop, internal->events, &eventsCount);
 			} else {
 				spAnimation_mix(current->animation, skeleton, current->lastTime, time,
-					current->loop, internal->events, &eventCount, current->mix);
+					current->loop, internal->events, &eventsCount, current->mix);
 			}
 		} else {
 			float alpha = current->mixTime / current->mixDuration * current->mix;
@@ -152,11 +152,11 @@ void spAnimationState_apply (spAnimationState* self, spSkeleton* skeleton) {
 				current->previous = 0;
 			}
 			spAnimation_mix(current->animation, skeleton, current->lastTime, time,
-				current->loop, internal->events, &eventCount, alpha);
+				current->loop, internal->events, &eventsCount, alpha);
 		}
 
 		entryChanged = 0;
-		for (ii = 0; ii < eventCount; ++ii) {
+		for (ii = 0; ii < eventsCount; ++ii) {
 			spEvent* event = internal->events[ii];
 			if (current->listener) {
 				current->listener(self, i, SP_ANIMATION_EVENT, event, 0);
@@ -195,14 +195,14 @@ void spAnimationState_apply (spAnimationState* self, spSkeleton* skeleton) {
 
 void spAnimationState_clearTracks (spAnimationState* self) {
 	int i;
-	for (i = 0; i < self->trackCount; ++i)
+	for (i = 0; i < self->tracksCount; ++i)
 		spAnimationState_clearTrack(self, i);
-	self->trackCount = 0;
+	self->tracksCount = 0;
 }
 
 void spAnimationState_clearTrack (spAnimationState* self, int trackIndex) {
 	spTrackEntry* current;
-	if (trackIndex >= self->trackCount) return;
+	if (trackIndex >= self->tracksCount) return;
 	current = self->tracks[trackIndex];
 	if (!current) return;
 
@@ -216,12 +216,12 @@ void spAnimationState_clearTrack (spAnimationState* self, int trackIndex) {
 
 spTrackEntry* _spAnimationState_expandToIndex (spAnimationState* self, int index) {
 	spTrackEntry** newTracks;
-	if (index < self->trackCount) return self->tracks[index];
+	if (index < self->tracksCount) return self->tracks[index];
 	newTracks = CALLOC(spTrackEntry*, index + 1);
-	memcpy(newTracks, self->tracks, self->trackCount * sizeof(spTrackEntry*));
+	memcpy(newTracks, self->tracks, self->tracksCount * sizeof(spTrackEntry*));
 	FREE(self->tracks);
 	self->tracks = newTracks;
-	self->trackCount = index + 1;
+	self->tracksCount = index + 1;
 	return 0;
 }
 
@@ -317,6 +317,6 @@ spTrackEntry* spAnimationState_addAnimation (spAnimationState* self, int trackIn
 }
 
 spTrackEntry* spAnimationState_getCurrent (spAnimationState* self, int trackIndex) {
-	if (trackIndex >= self->trackCount) return 0;
+	if (trackIndex >= self->tracksCount) return 0;
 	return self->tracks[trackIndex];
 }

+ 49 - 32
spine-c/src/spine/Bone.c

@@ -37,9 +37,10 @@ void spBone_setYDown (int value) {
 	yDown = value;
 }
 
-spBone* spBone_create (spBoneData* data, spBone* parent) {
+spBone* spBone_create (spBoneData* data, spSkeleton* skeleton, spBone* parent) {
 	spBone* self = NEW(spBone);
 	CONST_CAST(spBoneData*, self->data) = data;
+	CONST_CAST(spSkeleton*, self->skeleton) = skeleton;
 	CONST_CAST(spBone*, self->parent) = parent;
 	spBone_setToSetupPose(self);
 	return self;
@@ -49,15 +50,7 @@ void spBone_dispose (spBone* self) {
 	FREE(self);
 }
 
-void spBone_setToSetupPose (spBone* self) {
-	self->x = self->data->x;
-	self->y = self->data->y;
-	self->rotation = self->data->rotation;
-	self->scaleX = self->data->scaleX;
-	self->scaleY = self->data->scaleY;
-}
-
-void spBone_updateWorldTransform (spBone* self, int flipX, int flipY) {
+void spBone_updateWorldTransform (spBone* self) {
 	float radians, cosine, sine;
 	if (self->parent) {
 		CONST_CAST(float, self->worldX) = self->x * self->parent->m00 + self->y * self->parent->m01 + self->parent->worldX;
@@ -70,32 +63,56 @@ void spBone_updateWorldTransform (spBone* self, int flipX, int flipY) {
 			CONST_CAST(float, self->worldScaleY) = self->scaleY;
 		}
 		CONST_CAST(float, self->worldRotation) =
-				self->data->inheritRotation ? self->parent->worldRotation + self->rotation : self->rotation;
+				self->data->inheritRotation ? self->parent->worldRotation + self->rotationIK : self->rotationIK;
 	} else {
-		CONST_CAST(float, self->worldX) = flipX ? -self->x : self->x;
-		CONST_CAST(float, self->worldY) = flipY != yDown ? -self->y : self->y;
+		CONST_CAST(float, self->worldX) = self->skeleton->flipX ? -self->x : self->x;
+		CONST_CAST(float, self->worldY) = self->skeleton->flipY != yDown ? -self->y : self->y;
 		CONST_CAST(float, self->worldScaleX) = self->scaleX;
 		CONST_CAST(float, self->worldScaleY) = self->scaleY;
-		CONST_CAST(float, self->worldRotation) = self->rotation;
+		CONST_CAST(float, self->worldRotation) = self->rotationIK;
 	}
-	radians = (float)(self->worldRotation * 3.1415926535897932385 / 180);
-#ifdef __STDC_VERSION__
-	cosine = cosf(radians);
-	sine = sinf(radians);
-#else
-	cosine = (float)cos(radians);
-	sine = (float)sin(radians);
-#endif
-	CONST_CAST(float, self->m00) = cosine * self->worldScaleX;
-	CONST_CAST(float, self->m10) = sine * self->worldScaleX;
-	CONST_CAST(float, self->m01) = -sine * self->worldScaleY;
-	CONST_CAST(float, self->m11) = cosine * self->worldScaleY;
-	if (flipX) {
-		CONST_CAST(float, self->m00) = -self->m00;
-		CONST_CAST(float, self->m01) = -self->m01;
+	radians = self->worldRotation * DEG_RAD;
+	cosine = COS(radians);
+	sine = SIN(radians);
+	if (self->skeleton->flipX) {
+		CONST_CAST(float, self->m00) = -cosine * self->worldScaleX;
+		CONST_CAST(float, self->m01) = sine * self->worldScaleY;
+	} else {
+		CONST_CAST(float, self->m00) = cosine * self->worldScaleX;
+		CONST_CAST(float, self->m01) = -sine * self->worldScaleY;
 	}
-	if (flipY != yDown) {
-		CONST_CAST(float, self->m10) = -self->m10;
-		CONST_CAST(float, self->m11) = -self->m11;
+	if (self->skeleton->flipY != yDown) {
+		CONST_CAST(float, self->m10) = -sine * self->worldScaleX;
+		CONST_CAST(float, self->m11) = -cosine * self->worldScaleY;
+	} else {
+		CONST_CAST(float, self->m10) = sine * self->worldScaleX;
+		CONST_CAST(float, self->m11) = cosine * self->worldScaleY;
 	}
 }
+
+void spBone_setToSetupPose (spBone* self) {
+	self->x = self->data->x;
+	self->y = self->data->y;
+	self->rotation = self->data->rotation;
+	self->rotationIK = self->rotation;
+	self->scaleX = self->data->scaleX;
+	self->scaleY = self->data->scaleY;
+}
+
+void spBone_worldToLocal (spBone* self, float worldX, float worldY, float* localX, float* localY) {
+	float invDet;
+	float dx = worldX - self->worldX, dy = worldY - self->worldY;
+	float m00 = self->m00, m11 = self->m11;
+	if (self->skeleton->flipX != (self->skeleton->flipY != yDown)) {
+		m00 *= -1;
+		m11 *= -1;
+	}
+	invDet = 1 / (m00 * m11 - self->m01 * self->m10);
+	*localX = (dx * m00 * invDet - dy * self->m01 * invDet);
+	*localY = (dy * m11 * invDet - dx * self->m10 * invDet);
+}
+
+void spBone_localToWorld (spBone* self, float localX, float localY, float* worldX, float* worldY) {
+	*worldX = localX * self->m00 + localY * self->m01 + self->worldX;
+	*worldY = localX * self->m10 + localY * self->m11 + self->worldY;
+}

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

@@ -46,13 +46,11 @@ spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name) {
 	return self;
 }
 
-void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, float x, float y, spBone* bone, float* worldVertices) {
+void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spBone* bone, float* worldVertices) {
 	int i;
 	float px, py;
 	float* vertices = self->vertices;
-
-	x += bone->worldX;
-	y += bone->worldY;
+	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];

+ 133 - 0
spine-c/src/spine/IkConstraint.c

@@ -0,0 +1,133 @@
+/******************************************************************************
+ * Spine Runtimes Software License
+ * Version 2.1
+ * 
+ * Copyright (c) 2013, Esoteric Software
+ * All rights reserved.
+ * 
+ * You are granted a perpetual, non-exclusive, non-sublicensable and
+ * non-transferable license to install, execute and perform the Spine Runtimes
+ * Software (the "Software") solely for internal use. Without the written
+ * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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/IkConstraint.h>
+#include <spine/Skeleton.h>
+#include <spine/extension.h>
+
+spIkConstraint* spIkConstraint_create (spIkConstraintData* data, const spSkeleton* skeleton) {
+	int i;
+
+	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);
+
+	return self;
+}
+
+void spIkConstraint_dispose (spIkConstraint* 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;
+	}
+}
+
+void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, float alpha) {
+	float parentRotation = (!bone->data->inheritRotation || !bone->parent) ? 0 : bone->parent->worldRotation;
+	float rotation = bone->rotation;
+	float rotationIK = ATAN2(targetY - bone->worldY, targetX - bone->worldX) * RAD_DEG - parentRotation;
+	bone->rotationIK = rotation + (rotationIK - rotation) * alpha;
+}
+
+void spIkConstraint_apply2 (spBone* parent, spBone* child, float targetX, float targetY, int bendDirection, float alpha) {
+	float positionX, positionY, childX, childY, offset, len1, len2, cosDenom, cos, childAngle, adjacent, opposite, parentAngle, rotation;
+	spBone* parentParent;
+	float childRotation = child->rotation, parentRotation = parent->rotation;
+	if (alpha == 0) {
+		child->rotationIK = childRotation;
+		parent->rotationIK = parentRotation;
+		return;
+	}
+	parentParent = parent->parent;
+	if (parentParent) {
+		spBone_worldToLocal(parentParent, targetX, targetY, &positionX, &positionY);
+		targetX = (positionX - parent->x) * parentParent->worldScaleX;
+		targetY = (positionY - parent->y) * parentParent->worldScaleY;
+	} else {
+		targetX -= parent->x;
+		targetY -= parent->y;
+	}
+	if (child->parent == parent) {
+		positionX = child->x;
+		positionY = child->y;
+	} else {
+		spBone_localToWorld(child->parent, child->x, child->y, &positionX, &positionY);
+		spBone_worldToLocal(parent, positionX, positionY, &positionX, &positionY);
+	}
+	childX = positionX * parent->worldScaleX;
+	childY = positionY * parent->worldScaleY;
+	offset = ATAN2(childY, childX);
+	len1 = SQRT(childX * childX + childY * childY);
+	len2 = child->data->length * child->worldScaleX;
+	/* Based on code by Ryan Juckett with permission: Copyright (c) 2008-2009 Ryan Juckett, http://www.ryanjuckett.com/ */
+	cosDenom = 2 * len1 * len2;
+	if (cosDenom < 0.0001f) {
+		child->rotationIK = childRotation + (ATAN2(targetY, targetX) * RAD_DEG - parentRotation - childRotation) * alpha;
+		return;
+	}
+	cos = (targetX * targetX + targetY * targetY - len1 * len1 - len2 * len2) / cosDenom;
+	if (cos < -1)
+		cos = -1;
+	else if (cos > 1) /**/
+		cos = 1;
+	childAngle = ACOS(cos) * bendDirection;
+	adjacent = len1 + len2 * cos;
+	opposite = len2 * SIN(childAngle);
+	parentAngle = ATAN2(targetY * adjacent - targetX * opposite, targetX * adjacent + targetY * opposite);
+	rotation = (parentAngle - offset) * RAD_DEG - parentRotation;
+	if (rotation > 180)
+		rotation -= 360;
+	else if (rotation < -180) /**/
+		rotation += 360;
+	parent->rotationIK = parentRotation + rotation * alpha;
+	rotation = (childAngle + offset) * RAD_DEG - childRotation;
+	if (rotation > 180)
+		rotation -= 360;
+	else if (rotation < -180) /**/
+		rotation += 360;
+	child->rotationIK = childRotation + (rotation + parent->worldRotation - child->parent->worldRotation) * alpha;
+}

+ 14 - 16
spine-cocos2dx/3.1/example/Classes/GoblinsExample.h → spine-c/src/spine/IkConstraintData.c

@@ -28,21 +28,19 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *****************************************************************************/
 
-#ifndef _GOBLINSEXAMPLE_H_
-#define _GOBLINSEXAMPLE_H_
+#include <spine/IkConstraintData.h>
+#include <spine/extension.h>
 
-#include "cocos2d.h"
-#include <spine/spine-cocos2dx.h>
+spIkConstraintData* spIkConstraintData_create (const char* name) {
+	spIkConstraintData* self = NEW(spIkConstraintData);
+	MALLOC_STR(self->name, name);
+	self->bendDirection = 1;
+	self->mix = 1;
+	return self;
+}
 
-class GoblinsExample : public cocos2d::LayerColor {
-public:
-	static cocos2d::Scene* scene ();
-
-	virtual bool init ();
-
-	CREATE_FUNC (GoblinsExample);
-private:
-	spine::SkeletonAnimation* skeletonNode;
-};
-
-#endif // _GOBLINSEXAMPLE_H_
+void spIkConstraintData_dispose (spIkConstraintData* self) {
+	FREE(self->name);
+	FREE(self->bones);
+	FREE(self);
+}

+ 56 - 64
spine-c/src/spine/Json.c

@@ -1,5 +1,6 @@
 /*
- Copyright (c) 2009 Dave Gamble
+ Copyright (c) 2009, Dave Gamble
+ Copyright (c) 2013, Esoteric Software
 
  Permission is hereby granted, dispose of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
@@ -55,19 +56,19 @@ static int Json_strcasecmp (const char* s1, const char* s2) {
 	/* TODO we may be able to elide these NULL checks if we can prove
 	 * the graph and input (only callsite is Json_getItem) should not have NULLs
 	 */
-	if ( s1 && s2 )
-	{
+	if (s1 && s2) {
 #if defined(_WIN32)
-		return _stricmp( s1, s2 );
+		return _stricmp(s1, s2);
 #else
 		return strcasecmp( s1, s2 );
 #endif
-	}
-	else
-	{
-		if ( s1 < s2 )       return -1; /* s1 is null, s2 is not */
-		else if ( s1 == s2 ) return 0;  /* both are null */
-		else                 return 1;  /* s2 is nul	s1 is not */
+	} else {
+		if (s1 < s2)
+			return -1; /* s1 is null, s2 is not */
+		else if (s1 == s2)
+			return 0; /* both are null */
+		else
+			return 1; /* s2 is nul	s1 is not */
 	}
 }
 
@@ -101,29 +102,24 @@ static const char* parse_number (Json *item, const char* num) {
 	 * We also already know that this starts with [-0-9] from parse_value.
 	 */
 #if __STDC_VERSION__ >= 199901L
-	n = strtof( num, &endptr );
+	n = strtof(num, &endptr);
 #else
 	n = (float)strtod( num, &endptr );
 #endif
 	/* ignore errno's ERANGE, which returns +/-HUGE_VAL */
 	/* n is 0 on any other error */
 
-
-	if ( endptr != num )
-	{
+	if (endptr != num) {
 		/* Parse success, number found. */
 		item->valueFloat = n;
 		item->valueInt = (int)n;
 		item->type = Json_Number;
 		return endptr;
-	}
-	else
-	{
+	} else {
 		/* Parse failure, ep is set. */
 		ep = num;
 		return 0;
 	}
-
 }
 
 /* Parse the input text into an unescaped cstring, and populate item. */
@@ -231,7 +227,7 @@ static const char* parse_object (Json *item, const char* value);
 
 /* Utility to jump whitespace and cr/lf */
 static const char* skip (const char* in) {
-	if ( !in ) return 0; /* must propagate NULL since it's often called in skip(f(...)) form */
+	if (!in) return 0; /* must propagate NULL since it's often called in skip(f(...)) form */
 	while (*in && (unsigned char)*in <= 32)
 		in++;
 	return in;
@@ -262,54 +258,50 @@ static const char* parse_value (Json *item, const char* value) {
 	if (!value) return 0; /* Fail on null. */
 #endif
 
-	switch ( *value )
-	{
-		case 'n':
-		{
-			if (!strncmp(value+1, "ull", 3)) {
-				item->type = Json_NULL;
-				return value + 4;
-			}
-			break;
+	switch (*value) {
+	case 'n': {
+		if (!strncmp(value + 1, "ull", 3)) {
+			item->type = Json_NULL;
+			return value + 4;
 		}
-		case 'f':
-		{
-			if (!strncmp(value+1, "alse", 4)) {
-				item->type = Json_False;
-				/* calloc prevents us needing item->type = Json_False or valueInt = 0 here */
-				return value + 5;
-			}
-			break;
+		break;
+	}
+	case 'f': {
+		if (!strncmp(value + 1, "alse", 4)) {
+			item->type = Json_False;
+			/* calloc prevents us needing item->type = Json_False or valueInt = 0 here */
+			return value + 5;
 		}
-		case 't':
-		{
-			if (!strncmp(value+1, "rue", 3)) {
-				item->type = Json_True;
-				item->valueInt = 1;
-				return value + 4;
-			}
-			break;
+		break;
+	}
+	case 't': {
+		if (!strncmp(value + 1, "rue", 3)) {
+			item->type = Json_True;
+			item->valueInt = 1;
+			return value + 4;
 		}
-		case '\"':
-			return parse_string(item, value);
-		case '[':
-			return parse_array(item, value);
-		case '{':
-			return parse_object(item, value);
-		case '-': /* fallthrough */
-		case '0': /* fallthrough */
-		case '1': /* fallthrough */
-		case '2': /* fallthrough */
-		case '3': /* fallthrough */
-		case '4': /* fallthrough */
-		case '5': /* fallthrough */
-		case '6': /* fallthrough */
-		case '7': /* fallthrough */
-		case '8': /* fallthrough */
-		case '9':
-			return parse_number(item, value);
-		default:
-			break;
+		break;
+	}
+	case '\"':
+		return parse_string(item, value);
+	case '[':
+		return parse_array(item, value);
+	case '{':
+		return parse_object(item, value);
+	case '-': /* fallthrough */
+	case '0': /* fallthrough */
+	case '1': /* fallthrough */
+	case '2': /* fallthrough */
+	case '3': /* fallthrough */
+	case '4': /* fallthrough */
+	case '5': /* fallthrough */
+	case '6': /* fallthrough */
+	case '7': /* fallthrough */
+	case '8': /* fallthrough */
+	case '9':
+		return parse_number(item, value);
+	default:
+		break;
 	}
 
 	ep = value;

+ 1 - 1
spine-c/src/spine/Json.h

@@ -39,7 +39,7 @@ extern "C" {
 #define Json_Object 6
 
 #ifndef SPINE_JSON_HAVE_PREV
-/* Spine doesn't use the "prev" link in the Json sibling lists. */ 
+/* Spine doesn't use the "prev" link in the Json sibling lists. */
 #define SPINE_JSON_HAVE_PREV 0
 #endif
 

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

@@ -71,12 +71,11 @@ void spMeshAttachment_updateUVs (spMeshAttachment* self) {
 	}
 }
 
-void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, float x, float y, spSlot* slot, float* worldVertices) {
+void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, spSlot* slot, float* worldVertices) {
 	int i;
 	float* vertices = self->vertices;
 	const spBone* bone = slot->bone;
-	x += bone->worldX;
-	y += bone->worldY;
+	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];

+ 4 - 11
spine-c/src/spine/RegionAttachment.c

@@ -79,14 +79,8 @@ void spRegionAttachment_updateOffset (spRegionAttachment* self) {
 	float localY = -self->height / 2 * self->scaleY + self->regionOffsetY * regionScaleY;
 	float localX2 = localX + self->regionWidth * regionScaleX;
 	float localY2 = localY + self->regionHeight * regionScaleY;
-	float radians = (float)(self->rotation * 3.1415926535897932385 / 180);
-#ifdef __STDC_VERSION__
-	float cosine = cosf(radians);
-	float sine = sinf(radians);
-#else
-	float cosine = (float)cos(radians);
-	float sine = (float)sin(radians);
-#endif
+	float radians = self->rotation * DEG_RAD;
+	float cosine = COS(radians), sine = SIN(radians);
 	float localXCos = localX * cosine + self->x;
 	float localXSin = localX * sine;
 	float localYCos = localY * cosine + self->y;
@@ -105,10 +99,9 @@ void spRegionAttachment_updateOffset (spRegionAttachment* self) {
 	self->offset[SP_VERTEX_Y4] = localYCos + localX2Sin;
 }
 
-void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, float x, float y, spBone* bone, float* vertices) {
+void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, spBone* bone, float* vertices) {
 	const float* offset = self->offset;
-	x += bone->worldX;
-	y += bone->worldY;
+	float x = bone->skeleton->x + bone->worldX, y = bone->skeleton->y + bone->worldY;
 	vertices[SP_VERTEX_X1] = offset[SP_VERTEX_X1] * bone->m00 + offset[SP_VERTEX_Y1] * bone->m01 + x;
 	vertices[SP_VERTEX_Y1] = offset[SP_VERTEX_X1] * bone->m10 + offset[SP_VERTEX_Y1] * bone->m11 + y;
 	vertices[SP_VERTEX_X2] = offset[SP_VERTEX_X2] * bone->m00 + offset[SP_VERTEX_Y2] * bone->m01 + x;

+ 146 - 27
spine-c/src/spine/Skeleton.c

@@ -32,76 +32,182 @@
 #include <string.h>
 #include <spine/extension.h>
 
+typedef struct {
+	spSkeleton super;
+
+	int boneCacheCount;
+	int* boneCacheCounts;
+	spBone*** boneCache;
+} _spSkeleton;
+
 spSkeleton* spSkeleton_create (spSkeletonData* data) {
 	int i, ii;
 
-	spSkeleton* self = NEW(spSkeleton);
+	_spSkeleton* internal = NEW(_spSkeleton);
+	spSkeleton* self = SUPER(internal);
 	CONST_CAST(spSkeletonData*, self->data) = data;
 
-	self->boneCount = self->data->boneCount;
-	self->bones = MALLOC(spBone*, self->boneCount);
+	self->bonesCount = self->data->bonesCount;
+	self->bones = MALLOC(spBone*, self->bonesCount);
 
-	for (i = 0; i < self->boneCount; ++i) {
+	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->boneCount; ++ii) {
+			for (ii = 0; ii < self->bonesCount; ++ii) {
 				if (data->bones[ii] == boneData->parent) {
 					parent = self->bones[ii];
 					break;
 				}
 			}
 		}
-		self->bones[i] = spBone_create(boneData, parent);
+		self->bones[i] = spBone_create(boneData, self, parent);
 	}
 	CONST_CAST(spBone*, self->root) = self->bones[0];
 
-	self->slotCount = data->slotCount;
-	self->slots = MALLOC(spSlot*, self->slotCount);
-	for (i = 0; i < self->slotCount; ++i) {
+	self->slotsCount = data->slotsCount;
+	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->boneCount; ++ii) {
+		for (ii = 0; ii < self->bonesCount; ++ii) {
 			if (data->bones[ii] == slotData->boneData) {
 				bone = self->bones[ii];
 				break;
 			}
 		}
-		self->slots[i] = spSlot_create(slotData, self, bone);
+		self->slots[i] = spSlot_create(slotData, bone);
 	}
 
-	self->drawOrder = MALLOC(spSlot*, self->slotCount);
-	memcpy(self->drawOrder, self->slots, sizeof(spSlot*) * self->slotCount);
+	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);
+	for (i = 0; i < self->data->ikConstraintsCount; ++i)
+		self->ikConstraints[i] = spIkConstraint_create(self->data->ikConstraints[i], self);
+
+	spSkeleton_updateCache(self);
+
 	return self;
 }
 
 void spSkeleton_dispose (spSkeleton* self) {
 	int i;
-	for (i = 0; i < self->boneCount; ++i)
+	_spSkeleton* internal = SUB_CAST(_spSkeleton, self);
+
+	for (i = 0; i < internal->boneCacheCount; ++i)
+		FREE(internal->boneCache[i]);
+	FREE(internal->boneCache);
+	FREE(internal->boneCacheCounts);
+
+	for (i = 0; i < self->bonesCount; ++i)
 		spBone_dispose(self->bones[i]);
 	FREE(self->bones);
 
-	for (i = 0; i < self->slotCount; ++i)
+	for (i = 0; i < self->slotsCount; ++i)
 		spSlot_dispose(self->slots[i]);
 	FREE(self->slots);
 
+	for (i = 0; i < self->ikConstraintsCount; ++i)
+		spIkConstraint_dispose(self->ikConstraints[i]);
+	FREE(self->ikConstraints);
+
 	FREE(self->drawOrder);
 	FREE(self);
 }
 
+void spSkeleton_updateCache (const spSkeleton* self) {
+	int i, ii;
+	_spSkeleton* internal = SUB_CAST(_spSkeleton, self);
+
+	for (i = 0; i < internal->boneCacheCount; ++i)
+		FREE(internal->boneCache[i]);
+	FREE(internal->boneCache);
+	FREE(internal->boneCacheCounts);
+
+	internal->boneCacheCount = self->ikConstraintsCount + 1;
+	internal->boneCache = MALLOC(spBone**, internal->boneCacheCount);
+	internal->boneCacheCounts = CALLOC(int, internal->boneCacheCount);
+
+	/* Compute array sizes. */
+	for (i = 0; i < self->bonesCount; ++i) {
+		spBone* current = self->bones[i];
+		do {
+			for (ii = 0; ii < self->ikConstraintsCount; ++ii) {
+				spIkConstraint* ikConstraint = self->ikConstraints[ii];
+				spBone* parent = ikConstraint->bones[0];
+				spBone* child = ikConstraint->bones[ikConstraint->bonesCount - 1];
+				while (1) {
+					if (current == child) {
+						internal->boneCacheCounts[ii]++;
+						internal->boneCacheCounts[ii + 1]++;
+						goto outer1;
+					}
+					if (child == parent) break;
+					child = child->parent;
+				}
+			}
+			current = current->parent;
+		} while (current);
+		internal->boneCacheCounts[0]++;
+		outer1: {}
+	}
+
+	for (i = 0; i < internal->boneCacheCount; ++i)
+		internal->boneCache[i] = MALLOC(spBone*, internal->boneCacheCounts[i]);
+	memset(internal->boneCacheCounts, 0, internal->boneCacheCount * sizeof(int));
+
+	/* Populate arrays. */
+	for (i = 0; i < self->bonesCount; ++i) {
+		spBone* bone = self->bones[i];
+		spBone* current = bone;
+		do {
+			for (ii = 0; ii < self->ikConstraintsCount; ++ii) {
+				spIkConstraint* ikConstraint = self->ikConstraints[ii];
+				spBone* parent = ikConstraint->bones[0];
+				spBone* child = ikConstraint->bones[ikConstraint->bonesCount - 1];
+				while (1) {
+					if (current == child) {
+						internal->boneCache[ii][internal->boneCacheCounts[ii]++] = bone;
+						internal->boneCache[ii + 1][internal->boneCacheCounts[ii + 1]++] = bone;
+						goto outer2;
+					}
+					if (child == parent) break;
+					child = child->parent;
+				}
+			}
+			current = current->parent;
+		} while (current);
+		internal->boneCache[0][internal->boneCacheCounts[0]++] = bone;
+		outer2: {}
+	}
+}
+
 void spSkeleton_updateWorldTransform (const spSkeleton* self) {
-	int i;
-	for (i = 0; i < self->boneCount; ++i)
-		spBone_updateWorldTransform(self->bones[i], self->flipX, self->flipY);
+	int i, ii, nn, last;
+	_spSkeleton* internal = SUB_CAST(_spSkeleton, self);
+
+	for (i = 0; i < self->bonesCount; ++i)
+		self->bones[i]->rotationIK = self->bones[i]->rotation;
+
+	i = 0;
+	last = internal->boneCacheCount - 1;
+	while (1) {
+		for (ii = 0, nn = internal->boneCacheCounts[i]; ii < nn; ++ii)
+			spBone_updateWorldTransform(internal->boneCache[i][ii]);
+		if (i == last) break;
+		spIkConstraint_apply(self->ikConstraints[i]);
+		i++;
+	}
 }
 
 void spSkeleton_setToSetupPose (const spSkeleton* self) {
@@ -111,41 +217,47 @@ void spSkeleton_setToSetupPose (const spSkeleton* self) {
 
 void spSkeleton_setBonesToSetupPose (const spSkeleton* self) {
 	int i;
-	for (i = 0; i < self->boneCount; ++i)
+	for (i = 0; i < self->bonesCount; ++i)
 		spBone_setToSetupPose(self->bones[i]);
+
+	for (i = 0; i < self->ikConstraintsCount; ++i) {
+		spIkConstraint* ikConstraint = self->ikConstraints[i];
+		ikConstraint->bendDirection = ikConstraint->data->bendDirection;
+		ikConstraint->mix = ikConstraint->data->mix;
+	}
 }
 
 void spSkeleton_setSlotsToSetupPose (const spSkeleton* self) {
 	int i;
-	memcpy(self->drawOrder, self->slots, self->slotCount * sizeof(spSlot*));
-	for (i = 0; i < self->slotCount; ++i)
+	memcpy(self->drawOrder, self->slots, self->slotsCount * sizeof(spSlot*));
+	for (i = 0; i < self->slotsCount; ++i)
 		spSlot_setToSetupPose(self->slots[i]);
 }
 
 spBone* spSkeleton_findBone (const spSkeleton* self, const char* boneName) {
 	int i;
-	for (i = 0; i < self->boneCount; ++i)
+	for (i = 0; i < self->bonesCount; ++i)
 		if (strcmp(self->data->bones[i]->name, boneName) == 0) return self->bones[i];
 	return 0;
 }
 
 int spSkeleton_findBoneIndex (const spSkeleton* self, const char* boneName) {
 	int i;
-	for (i = 0; i < self->boneCount; ++i)
+	for (i = 0; i < self->bonesCount; ++i)
 		if (strcmp(self->data->bones[i]->name, boneName) == 0) return i;
 	return -1;
 }
 
 spSlot* spSkeleton_findSlot (const spSkeleton* self, const char* slotName) {
 	int i;
-	for (i = 0; i < self->slotCount; ++i)
+	for (i = 0; i < self->slotsCount; ++i)
 		if (strcmp(self->data->slots[i]->name, slotName) == 0) return self->slots[i];
 	return 0;
 }
 
 int spSkeleton_findSlotIndex (const spSkeleton* self, const char* slotName) {
 	int i;
-	for (i = 0; i < self->slotCount; ++i)
+	for (i = 0; i < self->slotsCount; ++i)
 		if (strcmp(self->data->slots[i]->name, slotName) == 0) return i;
 	return -1;
 }
@@ -169,7 +281,7 @@ void spSkeleton_setSkin (spSkeleton* self, spSkin* newSkin) {
 		else {
 			/* No previous skin, attach setup pose attachments. */
 			int i;
-			for (i = 0; i < self->slotCount; ++i) {
+			for (i = 0; i < self->slotsCount; ++i) {
 				spSlot* slot = self->slots[i];
 				if (slot->data->attachmentName) {
 					spAttachment* attachment = spSkin_getAttachment(newSkin, i, slot->data->attachmentName);
@@ -201,7 +313,7 @@ spAttachment* spSkeleton_getAttachmentForSlotIndex (const spSkeleton* self, int
 
 int spSkeleton_setAttachment (spSkeleton* self, const char* slotName, const char* attachmentName) {
 	int i;
-	for (i = 0; i < self->slotCount; ++i) {
+	for (i = 0; i < self->slotsCount; ++i) {
 		spSlot *slot = self->slots[i];
 		if (strcmp(slot->data->name, slotName) == 0) {
 			if (!attachmentName)
@@ -217,6 +329,13 @@ int spSkeleton_setAttachment (spSkeleton* self, const char* slotName, const char
 	return 0;
 }
 
+spIkConstraint* spSkeleton_findIkConstraint (const spSkeleton* self, const char* ikConstraintName) {
+	int i;
+	for (i = 0; i < self->ikConstraintsCount; ++i)
+		if (strcmp(self->ikConstraints[i]->data->name, ikConstraintName) == 0) return self->ikConstraints[i];
+	return 0;
+}
+
 void spSkeleton_update (spSkeleton* self, float deltaTime) {
 	self->time += deltaTime;
 }

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

@@ -105,18 +105,18 @@ void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/
 	int i;
 
 	_spSkeletonBounds* internal = SUB_CAST(_spSkeletonBounds, self);
-	if (internal->capacity < skeleton->slotCount) {
+	if (internal->capacity < skeleton->slotsCount) {
 		spPolygon** newPolygons;
 
 		FREE(self->boundingBoxes);
-		self->boundingBoxes = MALLOC(spBoundingBoxAttachment*, skeleton->slotCount);
+		self->boundingBoxes = MALLOC(spBoundingBoxAttachment*, skeleton->slotsCount);
 
-		newPolygons = CALLOC(spPolygon*, skeleton->slotCount);
+		newPolygons = CALLOC(spPolygon*, skeleton->slotsCount);
 		memcpy(newPolygons, self->polygons, internal->capacity);
 		FREE(self->polygons);
 		self->polygons = newPolygons;
 
-		internal->capacity = skeleton->slotCount;
+		internal->capacity = skeleton->slotsCount;
 	}
 
 	self->minX = (float)INT_MAX;
@@ -125,7 +125,7 @@ void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/
 	self->maxY = (float)INT_MIN;
 
 	self->count = 0;
-	for (i = 0; i < skeleton->slotCount; ++i) {
+	for (i = 0; i < skeleton->slotsCount; ++i) {
 		spPolygon* polygon;
 		spBoundingBoxAttachment* boundingBox;
 
@@ -141,7 +141,7 @@ void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/
 			self->polygons[self->count] = polygon = spPolygon_create(boundingBox->verticesCount);
 		}
 		polygon->count = boundingBox->verticesCount;
-		spBoundingBoxAttachment_computeWorldVertices(boundingBox, skeleton->x, skeleton->y, slot->bone, polygon->vertices);
+		spBoundingBoxAttachment_computeWorldVertices(boundingBox, slot->bone, polygon->vertices);
 
 		if (updateAabb) {
 			int ii = 0;
@@ -155,7 +155,7 @@ void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/
 			}
 		}
 
-		++self->count;
+		self->count++;
 	}
 }
 

+ 25 - 14
spine-c/src/spine/SkeletonData.c

@@ -38,74 +38,85 @@ spSkeletonData* spSkeletonData_create () {
 
 void spSkeletonData_dispose (spSkeletonData* self) {
 	int i;
-	for (i = 0; i < self->boneCount; ++i)
+	for (i = 0; i < self->bonesCount; ++i)
 		spBoneData_dispose(self->bones[i]);
 	FREE(self->bones);
 
-	for (i = 0; i < self->slotCount; ++i)
+	for (i = 0; i < self->slotsCount; ++i)
 		spSlotData_dispose(self->slots[i]);
 	FREE(self->slots);
 
-	for (i = 0; i < self->skinCount; ++i)
+	for (i = 0; i < self->skinsCount; ++i)
 		spSkin_dispose(self->skins[i]);
 	FREE(self->skins);
 
-	for (i = 0; i < self->animationCount; ++i)
+	for (i = 0; i < self->eventsCount; ++i)
+		spEventData_dispose(self->events[i]);
+	FREE(self->events);
+
+	for (i = 0; i < self->animationsCount; ++i)
 		spAnimation_dispose(self->animations[i]);
 	FREE(self->animations);
 
-	for (i = 0; i < self->eventCount; ++i)
-		spEventData_dispose(self->events[i]);
-	FREE(self->events);
+	for (i = 0; i < self->ikConstraintsCount; ++i)
+		spIkConstraintData_dispose(self->ikConstraints[i]);
+	FREE(self->ikConstraints);
 
 	FREE(self);
 }
 
 spBoneData* spSkeletonData_findBone (const spSkeletonData* self, const char* boneName) {
 	int i;
-	for (i = 0; i < self->boneCount; ++i)
+	for (i = 0; i < self->bonesCount; ++i)
 		if (strcmp(self->bones[i]->name, boneName) == 0) return self->bones[i];
 	return 0;
 }
 
 int spSkeletonData_findBoneIndex (const spSkeletonData* self, const char* boneName) {
 	int i;
-	for (i = 0; i < self->boneCount; ++i)
+	for (i = 0; i < self->bonesCount; ++i)
 		if (strcmp(self->bones[i]->name, boneName) == 0) return i;
 	return -1;
 }
 
 spSlotData* spSkeletonData_findSlot (const spSkeletonData* self, const char* slotName) {
 	int i;
-	for (i = 0; i < self->slotCount; ++i)
+	for (i = 0; i < self->slotsCount; ++i)
 		if (strcmp(self->slots[i]->name, slotName) == 0) return self->slots[i];
 	return 0;
 }
 
 int spSkeletonData_findSlotIndex (const spSkeletonData* self, const char* slotName) {
 	int i;
-	for (i = 0; i < self->slotCount; ++i)
+	for (i = 0; i < self->slotsCount; ++i)
 		if (strcmp(self->slots[i]->name, slotName) == 0) return i;
 	return -1;
 }
 
 spSkin* spSkeletonData_findSkin (const spSkeletonData* self, const char* skinName) {
 	int i;
-	for (i = 0; i < self->skinCount; ++i)
+	for (i = 0; i < self->skinsCount; ++i)
 		if (strcmp(self->skins[i]->name, skinName) == 0) return self->skins[i];
 	return 0;
 }
 
 spEventData* spSkeletonData_findEvent (const spSkeletonData* self, const char* eventName) {
 	int i;
-	for (i = 0; i < self->eventCount; ++i)
+	for (i = 0; i < self->eventsCount; ++i)
 		if (strcmp(self->events[i]->name, eventName) == 0) return self->events[i];
 	return 0;
 }
 
 spAnimation* spSkeletonData_findAnimation (const spSkeletonData* self, const char* animationName) {
 	int i;
-	for (i = 0; i < self->animationCount; ++i)
+	for (i = 0; i < self->animationsCount; ++i)
 		if (strcmp(self->animations[i]->name, animationName) == 0) return self->animations[i];
 	return 0;
 }
+
+spIkConstraintData* spSkeletonData_findIkConstraint (const spSkeletonData* self, const char* ikConstraintName) {
+	int i;
+	for (i = 0; i < self->ikConstraintsCount; ++i)
+		if (strcmp(self->ikConstraints[i]->name, ikConstraintName) == 0) return self->ikConstraints[i];
+	return 0;
+}

+ 116 - 41
spine-c/src/spine/SkeletonJson.c

@@ -109,27 +109,29 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 
 	Json* bones = Json_getItem(root, "bones");
 	Json* slots = Json_getItem(root, "slots");
+	Json* ik = Json_getItem(root, "ik");
 	Json* ffd = Json_getItem(root, "ffd");
 	Json* drawOrder = Json_getItem(root, "draworder");
 	Json* events = Json_getItem(root, "events");
-	Json *boneMap, *slotMap, *ffdMap;
+	Json *boneMap, *slotMap, *ikMap, *ffdMap;
 
-	int timelineCount = 0;
+	int timelinesCount = 0;
 	for (boneMap = bones ? bones->child : 0; boneMap; boneMap = boneMap->next)
-		timelineCount += boneMap->size;
+		timelinesCount += boneMap->size;
 	for (slotMap = slots ? slots->child : 0; slotMap; slotMap = slotMap->next)
-		timelineCount += slotMap->size;
+		timelinesCount += slotMap->size;
+	timelinesCount += ik ? ik->size : 0;
 	for (ffdMap = ffd ? ffd->child : 0; ffdMap; ffdMap = ffdMap->next)
 		for (slotMap = ffdMap->child; slotMap; slotMap = slotMap->next)
-			timelineCount += slotMap->size;
-	if (events) ++timelineCount;
-	if (drawOrder) ++timelineCount;
+			timelinesCount += slotMap->size;
+	if (events) ++timelinesCount;
+	if (drawOrder) ++timelinesCount;
 
-	animation = spAnimation_create(root->name, timelineCount);
-	animation->timelineCount = 0;
-	skeletonData->animations[skeletonData->animationCount] = animation;
-	++skeletonData->animationCount;
+	animation = spAnimation_create(root->name, timelinesCount);
+	animation->timelinesCount = 0;
+	skeletonData->animations[skeletonData->animationsCount++] = animation;
 
+	/* Slot timelines. */
 	for (slotMap = slots ? slots->child : 0; slotMap; slotMap = slotMap->next) {
 		Json *timelineArray;
 
@@ -150,7 +152,7 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 							toColor(s, 3));
 					readCurve(SUPER(timeline), i, frame);
 				}
-				animation->timelines[animation->timelineCount++] = SUPER_CAST(spTimeline, timeline);
+				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 				duration = timeline->frames[timelineArray->size * 5 - 5];
 				if (duration > animation->duration) animation->duration = duration;
 
@@ -162,7 +164,7 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 					spAttachmentTimeline_setFrame(timeline, i, Json_getFloat(frame, "time", 0),
 							name->type == Json_NULL ? 0 : name->valueString);
 				}
-				animation->timelines[animation->timelineCount++] = SUPER_CAST(spTimeline, timeline);
+				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 				duration = timeline->frames[timelineArray->size - 1];
 				if (duration > animation->duration) animation->duration = duration;
 
@@ -174,13 +176,14 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 		}
 	}
 
+	/* Bone timelines. */
 	for (boneMap = bones ? bones->child : 0; boneMap; boneMap = boneMap->next) {
 		Json *timelineArray;
 
 		int boneIndex = spSkeletonData_findBoneIndex(skeletonData, boneMap->name);
 		if (boneIndex == -1) {
 			spAnimation_dispose(animation);
-			_spSkeletonJson_setError(self, root, "spBone not found: ", boneMap->name);
+			_spSkeletonJson_setError(self, root, "Bone not found: ", boneMap->name);
 			return 0;
 		}
 
@@ -192,7 +195,7 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 					spRotateTimeline_setFrame(timeline, i, Json_getFloat(frame, "time", 0), Json_getFloat(frame, "angle", 0));
 					readCurve(SUPER(timeline), i, frame);
 				}
-				animation->timelines[animation->timelineCount++] = SUPER_CAST(spTimeline, timeline);
+				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 				duration = timeline->frames[timelineArray->size * 2 - 2];
 				if (duration > animation->duration) animation->duration = duration;
 
@@ -208,7 +211,7 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 								Json_getFloat(frame, "y", 0) * scale);
 						readCurve(SUPER(timeline), i, frame);
 					}
-					animation->timelines[animation->timelineCount++] = SUPER_CAST(spTimeline, timeline);
+					animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 					duration = timeline->frames[timelineArray->size * 3 - 3];
 					if (duration > animation->duration) animation->duration = duration;
 				} else {
@@ -220,6 +223,27 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 		}
 	}
 
+	/* IK timelines. */
+	for (ikMap = ik ? ik->child : 0; ikMap; ikMap = ikMap->next) {
+		spIkConstraintData* ikConstraint = spSkeletonData_findIkConstraint(skeletonData, ikMap->name);
+		spIkConstraintTimeline* timeline = spIkConstraintTimeline_create(ikMap->size);
+		for (i = 0; i < skeletonData->ikConstraintsCount; ++i) {
+			if (ikConstraint == skeletonData->ikConstraints[i]) {
+				timeline->ikConstraintIndex = i;
+				break;
+			}
+		}
+		for (frame = ikMap->child, i = 0; frame; frame = frame->next, ++i) {
+			spIkConstraintTimeline_setFrame(timeline, i, Json_getFloat(frame, "time", 0), Json_getFloat(frame, "mix", 0),
+					Json_getInt(frame, "bendPositive", 1) ? 1 : -1);
+			readCurve(SUPER(timeline), i, frame);
+		}
+		animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
+		duration = timeline->frames[ikMap->size * 3 - 3];
+		if (duration > animation->duration) animation->duration = duration;
+	}
+
+	/* FFD timelines. */
 	for (ffdMap = ffd ? ffd->child : 0; ffdMap; ffdMap = ffdMap->next) {
 		spSkin* skin = spSkeletonData_findSkin(skeletonData, ffdMap->name);
 		for (slotMap = ffdMap->child; slotMap; slotMap = slotMap->next) {
@@ -281,26 +305,27 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 				}
 				FREE(tempVertices);
 
-				animation->timelines[animation->timelineCount++] = SUPER_CAST(spTimeline, timeline);
+				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 				duration = timeline->frames[timelineArray->size - 1];
 				if (duration > animation->duration) animation->duration = duration;
 			}
 		}
 	}
 
+	/* Draw order timeline. */
 	if (drawOrder) {
-		spDrawOrderTimeline* timeline = spDrawOrderTimeline_create(drawOrder->size, skeletonData->slotCount);
+		spDrawOrderTimeline* timeline = spDrawOrderTimeline_create(drawOrder->size, skeletonData->slotsCount);
 		for (frame = drawOrder->child, i = 0; frame; frame = frame->next, ++i) {
 			int ii;
 			int* drawOrder = 0;
 			Json* offsets = Json_getItem(frame, "offsets");
 			if (offsets) {
 				Json* offsetMap;
-				int* unchanged = MALLOC(int, skeletonData->slotCount - offsets->size);
+				int* unchanged = MALLOC(int, skeletonData->slotsCount - offsets->size);
 				int originalIndex = 0, unchangedIndex = 0;
 
-				drawOrder = MALLOC(int, skeletonData->slotCount);
-				for (ii = skeletonData->slotCount - 1; ii >= 0; --ii)
+				drawOrder = MALLOC(int, skeletonData->slotsCount);
+				for (ii = skeletonData->slotsCount - 1; ii >= 0; --ii)
 					drawOrder[ii] = -1;
 
 				for (offsetMap = offsets->child; offsetMap; offsetMap = offsetMap->next) {
@@ -315,24 +340,25 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 						unchanged[unchangedIndex++] = originalIndex++;
 					/* Set changed items. */
 					drawOrder[originalIndex + Json_getInt(offsetMap, "offset", 0)] = originalIndex;
-					++originalIndex;
+					originalIndex++;
 				}
 				/* Collect remaining unchanged items. */
-				while (originalIndex < skeletonData->slotCount)
+				while (originalIndex < skeletonData->slotsCount)
 					unchanged[unchangedIndex++] = originalIndex++;
 				/* Fill in unchanged items. */
-				for (ii = skeletonData->slotCount - 1; ii >= 0; ii--)
+				for (ii = skeletonData->slotsCount - 1; ii >= 0; ii--)
 					if (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex];
 				FREE(unchanged);
 			}
 			spDrawOrderTimeline_setFrame(timeline, i, Json_getFloat(frame, "time", 0), drawOrder);
 			FREE(drawOrder);
 		}
-		animation->timelines[animation->timelineCount++] = SUPER_CAST(spTimeline, timeline);
+		animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 		duration = timeline->frames[drawOrder->size - 1];
 		if (duration > animation->duration) animation->duration = duration;
 	}
 
+	/* Event timeline. */
 	if (events) {
 		Json* frame;
 
@@ -353,7 +379,7 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 			if (stringValue) MALLOC_STR(event->stringValue, stringValue);
 			spEventTimeline_setFrame(timeline, i, Json_getFloat(frame, "time", 0), event);
 		}
-		animation->timelines[animation->timelineCount++] = SUPER_CAST(spTimeline, timeline);
+		animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 		duration = timeline->frames[events->size - 1];
 		if (duration > animation->duration) animation->duration = duration;
 	}
@@ -375,9 +401,9 @@ spSkeletonData* spSkeletonJson_readSkeletonDataFile (spSkeletonJson* self, const
 }
 
 spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const char* json) {
-	int i;
+	int i, ii;
 	spSkeletonData* skeletonData;
-	Json *root, *bones, *boneMap, *slots, *skins, *animations, *events;
+	Json *root, *skeleton, *bones, *boneMap, *ik, *slots, *skins, *animations, *events;
 
 	FREE(self->error);
 	CONST_CAST(char*, self->error) = 0;
@@ -390,6 +416,15 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 
 	skeletonData = spSkeletonData_create();
 
+	skeleton = Json_getItem(root, "skeleton");
+	if (skeleton) {
+		skeletonData->hash = Json_getString(skeleton, "hash", 0);
+		skeletonData->version = Json_getString(skeleton, "spine", 0);
+		skeletonData->width = Json_getFloat(skeleton, "width", 0);
+		skeletonData->height = Json_getFloat(skeleton, "height", 0);
+	}
+
+	/* Bones. */
 	bones = Json_getItem(root, "bones");
 	skeletonData->bones = MALLOC(spBoneData*, bones->size);
 	for (boneMap = bones->child, i = 0; boneMap; boneMap = boneMap->next, ++i) {
@@ -417,12 +452,51 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 		boneData->inheritRotation = Json_getInt(boneMap, "inheritRotation", 1);
 
 		skeletonData->bones[i] = boneData;
-		++skeletonData->boneCount;
+		skeletonData->bonesCount++;
+	}
+
+	/* IK constraints. */
+	ik = Json_getItem(root, "ik");
+	if (ik) {
+		Json *ikMap;
+		skeletonData->ikConstraintsCount = ik->size;
+		skeletonData->ikConstraints = MALLOC(spIkConstraintData*, ik->size);
+		for (ikMap = ik->child, i = 0; ikMap; ikMap = ikMap->next, ++i) {
+			const char* targetName;
+
+			spIkConstraintData* ikConstraintData = spIkConstraintData_create(Json_getString(ikMap, "name", 0));
+			boneMap = Json_getItem(ikMap, "bones");
+			ikConstraintData->bonesCount = boneMap->size;
+			ikConstraintData->bones = MALLOC(spBoneData*, boneMap->size);
+			for (boneMap = boneMap->child, ii = 0; boneMap; boneMap = boneMap->next, ++ii) {
+				ikConstraintData->bones[ii] = spSkeletonData_findBone(skeletonData, boneMap->valueString);
+				if (!ikConstraintData->bones[ii]) {
+					spSkeletonData_dispose(skeletonData);
+					_spSkeletonJson_setError(self, root, "IK bone not found: ", boneMap->valueString);
+					return 0;
+				}
+			}
+
+			targetName = Json_getString(ikMap, "target", 0);
+			ikConstraintData->target = spSkeletonData_findBone(skeletonData, targetName);
+			if (!ikConstraintData->target) {
+				spSkeletonData_dispose(skeletonData);
+				_spSkeletonJson_setError(self, root, "Target bone not found: ", boneMap->name);
+				return 0;
+			}
+
+			ikConstraintData->bendDirection = Json_getInt(ikMap, "bendPositive", 1) ? 1 : -1;
+			ikConstraintData->mix = Json_getFloat(ikMap, "mix", 1);
+
+			skeletonData->ikConstraints[i] = ikConstraintData;
+		}
 	}
 
+	/* Slots. */
 	slots = Json_getItem(root, "slots");
 	if (slots) {
 		Json *slotMap;
+		skeletonData->slotsCount = slots->size;
 		skeletonData->slots = MALLOC(spSlotData*, slots->size);
 		for (slotMap = slots->child, i = 0; slotMap; slotMap = slotMap->next, ++i) {
 			spSlotData* slotData;
@@ -433,7 +507,7 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 			spBoneData* boneData = spSkeletonData_findBone(skeletonData, boneName);
 			if (!boneData) {
 				spSkeletonData_dispose(skeletonData);
-				_spSkeletonJson_setError(self, root, "spSlot bone not found: ", boneName);
+				_spSkeletonJson_setError(self, root, "Slot bone not found: ", boneName);
 				return 0;
 			}
 
@@ -453,20 +527,20 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 			slotData->additiveBlending = Json_getInt(slotMap, "additive", 0);
 
 			skeletonData->slots[i] = slotData;
-			++skeletonData->slotCount;
 		}
 	}
 
+	/* Skins. */
 	skins = Json_getItem(root, "skins");
 	if (skins) {
 		Json *slotMap;
+		skeletonData->skinsCount = skins->size;
 		skeletonData->skins = MALLOC(spSkin*, skins->size);
 		for (slotMap = skins->child, i = 0; slotMap; slotMap = slotMap->next, ++i) {
 			Json *attachmentsMap;
 			spSkin *skin = spSkin_create(slotMap->name);
 
 			skeletonData->skins[i] = skin;
-			++skeletonData->skinCount;
 			if (strcmp(slotMap->name, "default") == 0) skeletonData->defaultSkin = skin;
 
 			for (attachmentsMap = slotMap->child; attachmentsMap; attachmentsMap = attachmentsMap->next) {
@@ -597,18 +671,18 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 							vertices[i] = entry->valueFloat;
 
 						for (i = 0; i < verticesCount;) {
-							int boneCount = (int)vertices[i];
-							mesh->bonesCount += boneCount + 1;
-							mesh->weightsCount += boneCount * 3;
-							i += 1 + boneCount * 4;
+							int bonesCount = (int)vertices[i];
+							mesh->bonesCount += bonesCount + 1;
+							mesh->weightsCount += bonesCount * 3;
+							i += 1 + bonesCount * 4;
 						}
 						mesh->bones = MALLOC(int, mesh->bonesCount);
 						mesh->weights = MALLOC(float, mesh->weightsCount);
 
 						for (i = 0, b = 0, w = 0; i < verticesCount;) {
-							int boneCount = (int)vertices[i++];
-							mesh->bones[b++] = boneCount;
-							for (nn = i + boneCount * 4; i < nn; i += 4, ++b, w += 3) {
+							int bonesCount = (int)vertices[i++];
+							mesh->bones[b++] = bonesCount;
+							for (nn = i + bonesCount * 4; i < nn; i += 4, ++b, w += 3) {
 								mesh->bones[b] = (int)vertices[i];
 								mesh->weights[w] = vertices[i + 1] * self->scale;
 								mesh->weights[w + 1] = vertices[i + 2] * self->scale;
@@ -670,14 +744,15 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 	if (events) {
 		Json *eventMap;
 		const char* stringValue;
+		skeletonData->eventsCount = events->size;
 		skeletonData->events = MALLOC(spEventData*, events->size);
-		for (eventMap = events->child; eventMap; eventMap = eventMap->next) {
+		for (eventMap = events->child, i = 0; eventMap; eventMap = eventMap->next, ++i) {
 			spEventData* eventData = spEventData_create(eventMap->name);
 			eventData->intValue = Json_getInt(eventMap, "int", 0);
 			eventData->floatValue = Json_getFloat(eventMap, "float", 0);
 			stringValue = Json_getString(eventMap, "string", 0);
 			if (stringValue) MALLOC_STR(eventData->stringValue, stringValue);
-			skeletonData->events[skeletonData->eventCount++] = eventData;
+			skeletonData->events[i] = eventData;
 		}
 	}
 

+ 3 - 3
spine-c/src/spine/SkinnedMeshAttachment.c

@@ -72,10 +72,10 @@ void spSkinnedMeshAttachment_updateUVs (spSkinnedMeshAttachment* self) {
 	}
 }
 
-void spSkinnedMeshAttachment_computeWorldVertices (spSkinnedMeshAttachment* self, float x, float y, spSlot* slot,
-		float* worldVertices) {
+void spSkinnedMeshAttachment_computeWorldVertices (spSkinnedMeshAttachment* self, spSlot* slot, float* worldVertices) {
 	int w = 0, v = 0, b = 0, f = 0;
-	spBone** skeletonBones = slot->skeleton->bones;
+	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;

+ 7 - 9
spine-c/src/spine/Slot.c

@@ -30,17 +30,15 @@
 
 #include <spine/Slot.h>
 #include <spine/extension.h>
-#include <spine/Skeleton.h>
 
 typedef struct {
 	spSlot super;
 	float attachmentTime;
 } _spSlot;
 
-spSlot* spSlot_create (spSlotData* data, spSkeleton* skeleton, spBone* bone) {
+spSlot* spSlot_create (spSlotData* data, spBone* bone) {
 	spSlot* self = SUPER(NEW(_spSlot));
 	CONST_CAST(spSlotData*, self->data) = data;
-	CONST_CAST(spSkeleton*, self->skeleton) = skeleton;
 	CONST_CAST(spBone*, self->bone) = bone;
 	spSlot_setToSetupPose(self);
 	return self;
@@ -53,15 +51,15 @@ void spSlot_dispose (spSlot* self) {
 
 void spSlot_setAttachment (spSlot* self, spAttachment* attachment) {
 	CONST_CAST(spAttachment*, self->attachment) = attachment;
-	SUB_CAST(_spSlot, self) ->attachmentTime = self->skeleton->time;
+	SUB_CAST(_spSlot, self) ->attachmentTime = self->bone->skeleton->time;
 }
 
 void spSlot_setAttachmentTime (spSlot* self, float time) {
-	SUB_CAST(_spSlot, self) ->attachmentTime = self->skeleton->time - time;
+	SUB_CAST(_spSlot, self) ->attachmentTime = self->bone->skeleton->time - time;
 }
 
 float spSlot_getAttachmentTime (const spSlot* self) {
-	return self->skeleton->time - SUB_CAST(_spSlot, self) ->attachmentTime;
+	return self->bone->skeleton->time - SUB_CAST(_spSlot, self) ->attachmentTime;
 }
 
 void spSlot_setToSetupPose (spSlot* self) {
@@ -74,9 +72,9 @@ void spSlot_setToSetupPose (spSlot* self) {
 	if (self->data->attachmentName) {
 		/* Find slot index. */
 		int i;
-		for (i = 0; i < self->skeleton->data->slotCount; ++i) {
-			if (self->data == self->skeleton->data->slots[i]) {
-				attachment = spSkeleton_getAttachmentForSlotIndex(self->skeleton, i, self->data->attachmentName);
+		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;
 			}
 		}

+ 12 - 12
spine-cocos2d-iphone/2/src/spine/SkeletonRenderer.m

@@ -149,14 +149,14 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 	const int* triangles = 0;
 	int trianglesCount = 0;
 	float r = 0, g = 0, b = 0, a = 0;
-	for (int i = 0, n = _skeleton->slotCount; i < n; i++) {
+	for (int i = 0, n = _skeleton->slotsCount; i < n; i++) {
 		spSlot* slot = _skeleton->drawOrder[i];
 		if (!slot->attachment) continue;
 		CCTexture2D *texture = 0;
 		switch (slot->attachment->type) {
 		case SP_ATTACHMENT_REGION: {
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			texture = [self getTextureForRegion:attachment];
 			uvs = attachment->uvs;
 			verticesCount = 8;
@@ -170,7 +170,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		}
 		case SP_ATTACHMENT_MESH: {
 			spMeshAttachment* attachment = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spMeshAttachment_computeWorldVertices(attachment, slot, worldVertices);
 			texture = [self getTextureForMesh:attachment];
 			uvs = attachment->uvs;
 			verticesCount = attachment->verticesCount;
@@ -184,7 +184,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		}
 		case SP_ATTACHMENT_SKINNED_MESH: {
 			spSkinnedMeshAttachment* attachment = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spSkinnedMeshAttachment_computeWorldVertices(attachment, slot, worldVertices);
 			texture = [self getTextureForSkinnedMesh:attachment];
 			uvs = attachment->uvs;
 			verticesCount = attachment->uvsCount;
@@ -220,11 +220,11 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		ccDrawColor4B(0, 0, 255, 255);
 		glLineWidth(1);
 		CGPoint points[4];
-		for (int i = 0, n = _skeleton->slotCount; i < n; i++) {
+		for (int i = 0, n = _skeleton->slotsCount; i < n; i++) {
 			spSlot* slot = _skeleton->drawOrder[i];
 			if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue;
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			points[0] = ccp(worldVertices[0], worldVertices[1]);
 			points[1] = ccp(worldVertices[2], worldVertices[3]);
 			points[2] = ccp(worldVertices[4], worldVertices[5]);
@@ -236,7 +236,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		// Bone lengths.
 		glLineWidth(2);
 		ccDrawColor4B(255, 0, 0, 255);
-		for (int i = 0, n = _skeleton->boneCount; i < n; i++) {
+		for (int i = 0, n = _skeleton->bonesCount; i < n; i++) {
 			spBone *bone = _skeleton->bones[i];
 			float x = bone->data->length * bone->m00 + bone->worldX;
 			float y = bone->data->length * bone->m10 + bone->worldY;
@@ -245,7 +245,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		// Bone origins.
 		ccPointSize(4);
 		ccDrawColor4B(0, 0, 255, 255); // Root bone is blue.
-		for (int i = 0, n = _skeleton->boneCount; i < n; i++) {
+		for (int i = 0, n = _skeleton->bonesCount; i < n; i++) {
 			spBone *bone = _skeleton->bones[i];
 			ccDrawPoint(ccp(bone->worldX, bone->worldY));
 			if (i == 0) ccDrawColor4B(0, 255, 0, 255);
@@ -268,21 +268,21 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 - (CGRect) boundingBox {
 	float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
 	float scaleX = self.scaleX, scaleY = self.scaleY;
-	for (int i = 0; i < _skeleton->slotCount; ++i) {
+	for (int i = 0; i < _skeleton->slotsCount; ++i) {
 		spSlot* slot = _skeleton->slots[i];
 		if (!slot->attachment) continue;
 		int verticesCount;
 		if (slot->attachment->type == SP_ATTACHMENT_REGION) {
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			verticesCount = 8;
 		} else if (slot->attachment->type == SP_ATTACHMENT_MESH) {
 			spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spMeshAttachment_computeWorldVertices(mesh, slot, worldVertices);
 			verticesCount = mesh->verticesCount;
 		} else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) {
 			spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spSkinnedMeshAttachment_computeWorldVertices(mesh, slot, worldVertices);
 			verticesCount = mesh->uvsCount;
 		} else
 			continue;

+ 12 - 12
spine-cocos2d-iphone/3.0/src/spine/SkeletonRenderer.m

@@ -147,7 +147,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 	const int* triangles = 0;
 	int trianglesCount = 0;
 	float r = 0, g = 0, b = 0, a = 0;
-	for (int i = 0, n = _skeleton->slotCount; i < n; i++) {
+	for (int i = 0, n = _skeleton->slotsCount; i < n; i++) {
         
 		spSlot* slot = _skeleton->drawOrder[i];
 		if (!slot->attachment) continue;
@@ -155,7 +155,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		switch (slot->attachment->type) {
 		case SP_ATTACHMENT_REGION: {
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			texture = [self getTextureForRegion:attachment];
 			uvs = attachment->uvs;
 			verticesCount = 8;
@@ -170,7 +170,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		case SP_ATTACHMENT_MESH: {
             
 			spMeshAttachment* attachment = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spMeshAttachment_computeWorldVertices(attachment, slot, worldVertices);
 			texture = [self getTextureForMesh:attachment];
 			uvs = attachment->uvs;
 			verticesCount = attachment->verticesCount;
@@ -185,7 +185,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		case SP_ATTACHMENT_SKINNED_MESH: {
             
 			spSkinnedMeshAttachment* attachment = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spSkinnedMeshAttachment_computeWorldVertices(attachment, slot, worldVertices);
 			texture = [self getTextureForSkinnedMesh:attachment];
 			uvs = attachment->uvs;
 			verticesCount = attachment->uvsCount;
@@ -233,11 +233,11 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 	if (_debugSlots) {
 		// Slots.
 		CGPoint points[4];
-		for (int i = 0, n = _skeleton->slotCount; i < n; i++) {
+		for (int i = 0, n = _skeleton->slotsCount; i < n; i++) {
 			spSlot* slot = _skeleton->drawOrder[i];
 			if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue;
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			points[0] = ccp(worldVertices[0], worldVertices[1]);
 			points[1] = ccp(worldVertices[2], worldVertices[3]);
 			points[2] = ccp(worldVertices[4], worldVertices[5]);
@@ -248,7 +248,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 	}
 	if (_debugBones) {
 		// Bone lengths.
-		for (int i = 0, n = _skeleton->boneCount; i < n; i++) {
+		for (int i = 0, n = _skeleton->bonesCount; i < n; i++) {
 			spBone *bone = _skeleton->bones[i];
 			float x = bone->data->length * bone->m00 + bone->worldX;
 			float y = bone->data->length * bone->m10 + bone->worldY;
@@ -256,7 +256,7 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 		}
         
 		// Bone origins.
-		for (int i = 0, n = _skeleton->boneCount; i < n; i++) {
+		for (int i = 0, n = _skeleton->bonesCount; i < n; i++) {
 			spBone *bone = _skeleton->bones[i];
             [_drawNode drawDot:ccp(bone->worldX, bone->worldY) radius:4 color:[CCColor greenColor]];
             if (i == 0) [_drawNode drawDot:ccp(bone->worldX, bone->worldY) radius:4 color:[CCColor blueColor]];
@@ -279,21 +279,21 @@ static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
 - (CGRect) boundingBox {
 	float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
 	float scaleX = self.scaleX, scaleY = self.scaleY;
-	for (int i = 0; i < _skeleton->slotCount; ++i) {
+	for (int i = 0; i < _skeleton->slotsCount; ++i) {
 		spSlot* slot = _skeleton->slots[i];
 		if (!slot->attachment) continue;
 		int verticesCount;
 		if (slot->attachment->type == SP_ATTACHMENT_REGION) {
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			verticesCount = 8;
 		} else if (slot->attachment->type == SP_ATTACHMENT_MESH) {
 			spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spMeshAttachment_computeWorldVertices(mesh, slot, worldVertices);
 			verticesCount = mesh->verticesCount;
 		} else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) {
 			spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spSkinnedMeshAttachment_computeWorldVertices(mesh, slot, worldVertices);
 			verticesCount = mesh->uvsCount;
 		} else
 			continue;

+ 2 - 2
spine-cocos2dx/2/README.md

@@ -16,5 +16,5 @@ Alternatively, the contents of the `spine-c/src`, `spine-c/include` and `spine-c
 
 ## Examples
 
-[Spineboy](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/2/example/Classes/SpineboyExample.cpp)
-[Golbins](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/2/example/Classes/GoblinsExample.cpp)
+- [Spineboy](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/2/example/Classes/SpineboyExample.cpp)
+- [Golbins](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/2/example/Classes/GoblinsExample.cpp)

+ 12 - 12
spine-cocos2dx/2/src/spine/SkeletonRenderer.cpp

@@ -151,14 +151,14 @@ void SkeletonRenderer::draw () {
 	const int* triangles = nullptr;
 	int trianglesCount = 0;
 	float r = 0, g = 0, b = 0, a = 0;
-	for (int i = 0, n = skeleton->slotCount; i < n; i++) {
+	for (int i = 0, n = skeleton->slotsCount; i < n; i++) {
 		spSlot* slot = skeleton->drawOrder[i];
 		if (!slot->attachment) continue;
 		CCTexture2D *texture = nullptr;
 		switch (slot->attachment->type) {
 		case SP_ATTACHMENT_REGION: {
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			texture = getTexture(attachment);
 			uvs = attachment->uvs;
 			verticesCount = 8;
@@ -172,7 +172,7 @@ void SkeletonRenderer::draw () {
 		}
 		case SP_ATTACHMENT_MESH: {
 			spMeshAttachment* attachment = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spMeshAttachment_computeWorldVertices(attachment, slot, worldVertices);
 			texture = getTexture(attachment);
 			uvs = attachment->uvs;
 			verticesCount = attachment->verticesCount;
@@ -186,7 +186,7 @@ void SkeletonRenderer::draw () {
 		}
 		case SP_ATTACHMENT_SKINNED_MESH: {
 			spSkinnedMeshAttachment* attachment = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spSkinnedMeshAttachment_computeWorldVertices(attachment, slot, worldVertices);
 			texture = getTexture(attachment);
 			uvs = attachment->uvs;
 			verticesCount = attachment->uvsCount;
@@ -220,11 +220,11 @@ void SkeletonRenderer::draw () {
 		ccDrawColor4B(0, 0, 255, 255);
 		glLineWidth(1);
 		CCPoint points[4];
-		for (int i = 0, n = skeleton->slotCount; i < n; i++) {
+		for (int i = 0, n = skeleton->slotsCount; i < n; i++) {
 			spSlot* slot = skeleton->drawOrder[i];
 			if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue;
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			points[0] = ccp(worldVertices[0], worldVertices[1]);
 			points[1] = ccp(worldVertices[2], worldVertices[3]);
 			points[2] = ccp(worldVertices[4], worldVertices[5]);
@@ -236,7 +236,7 @@ void SkeletonRenderer::draw () {
 		// Bone lengths.
 		glLineWidth(2);
 		ccDrawColor4B(255, 0, 0, 255);
-		for (int i = 0, n = skeleton->boneCount; i < n; i++) {
+		for (int i = 0, n = skeleton->bonesCount; i < n; i++) {
 			spBone *bone = skeleton->bones[i];
 			float x = bone->data->length * bone->m00 + bone->worldX;
 			float y = bone->data->length * bone->m10 + bone->worldY;
@@ -245,7 +245,7 @@ void SkeletonRenderer::draw () {
 		// Bone origins.
 		ccPointSize(4);
 		ccDrawColor4B(0, 0, 255, 255); // Root bone is blue.
-		for (int i = 0, n = skeleton->boneCount; i < n; i++) {
+		for (int i = 0, n = skeleton->bonesCount; i < n; i++) {
 			spBone *bone = skeleton->bones[i];
 			ccDrawPoint(ccp(bone->worldX, bone->worldY));
 			if (i == 0) ccDrawColor4B(0, 255, 0, 255);
@@ -268,21 +268,21 @@ CCTexture2D* SkeletonRenderer::getTexture (spSkinnedMeshAttachment* attachment)
 CCRect SkeletonRenderer::boundingBox () {
 	float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
 	float scaleX = getScaleX(), scaleY = getScaleY();
-	for (int i = 0; i < skeleton->slotCount; ++i) {
+	for (int i = 0; i < skeleton->slotsCount; ++i) {
 		spSlot* slot = skeleton->slots[i];
 		if (!slot->attachment) continue;
 		int verticesCount;
 		if (slot->attachment->type == SP_ATTACHMENT_REGION) {
 			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
+			spRegionAttachment_computeWorldVertices(attachment, slot->bone, worldVertices);
 			verticesCount = 8;
 		} else if (slot->attachment->type == SP_ATTACHMENT_MESH) {
 			spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spMeshAttachment_computeWorldVertices(mesh, slot, worldVertices);
 			verticesCount = mesh->verticesCount;
 		} else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) {
 			spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
+			spSkinnedMeshAttachment_computeWorldVertices(mesh, slot, worldVertices);
 			verticesCount = mesh->uvsCount;
 		} else
 			continue;

+ 0 - 20
spine-cocos2dx/3.0/README.md

@@ -1,20 +0,0 @@
-# spine-cocos2dx v3.0
-
-The spine-cocos2dx runtime provides functionality to load, manipulate and render [Spine](http://esotericsoftware.com) skeletal animation data using [cocos2d-x](http://www.cocos2d-x.org/). spine-cocos2dx is based on [spine-c](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-c).
-
-## Setup
-
-1. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip).
-1. Place the contents of a cocos2d-x version 3.0 distribution into the `spine-cocos2dx/3.0/cocos2dx` directory.
-1. Open the XCode (Mac) or Visual C++ 2012 Express (Windows) project file from the `spine-cocos2dx/3.0/example` directory. Build files are also provided for Android.
-
-Alternatively, the contents of the `spine-c/src`, `spine-c/include` and `spine-cocos2dx/3.0/src` directories can be copied into your project. Be sure your header search path will find the contents of the `spine-c/include` and `spine-cocos2dx/3.0/src` directories. Note that the includes use `spine/Xxx.h`, so the `spine` directory cannot be omitted when copying the files.
-
-## Notes
-
-- Images are no longer premultiplied by cocos2d-x as they where in cocos2d-x v2, so the Spine atlas images *should* use premultiplied alpha.
-
-## Examples
-
-[Spineboy](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/3.0/example/Classes/SpineboyExample.cpp)
-[Golbins](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/3.0/example/Classes/GoblinsExample.cpp)

+ 0 - 18
spine-cocos2dx/3.0/example/Classes/AppDelegate.h

@@ -1,18 +0,0 @@
-
-
-#ifndef  _APPDELEGATE_H_
-#define  _APPDELEGATE_H_
-
-#include "cocos2d.h"
-
-class AppDelegate: private cocos2d::CCApplication {
-public:
-	AppDelegate ();
-	virtual ~AppDelegate ();
-
-	virtual bool applicationDidFinishLaunching ();
-	virtual void applicationDidEnterBackground ();
-	virtual void applicationWillEnterForeground ();
-};
-
-#endif // _APPDELEGATE_H_

+ 0 - 61
spine-cocos2dx/3.0/example/Classes/AppMacros.h

@@ -1,61 +0,0 @@
-
-
-#ifndef _APPMACROS_H_
-#define _APPMACROS_H_
-
-#include "cocos2d.h"
-
-/* For demonstrating using one design resolution to match different resources,
- or one resource to match different design resolutions.
-
- [Situation 1] Using one design resolution to match different resources.
- Please look into Appdelegate::applicationDidFinishLaunching.
- We check current device frame size to decide which resource need to be selected.
- So if you want to test this situation which said in title '[Situation 1]',
- you should change ios simulator to different device(e.g. iphone, iphone-retina3.5, iphone-retina4.0, ipad, ipad-retina),
- or change the window size in "proj.XXX/main.cpp" by "CCEGLView::setFrameSize" if you are using win32 or linux plaform
- and modify "proj.mac/AppController.mm" by changing the window rectangle.
-
- [Situation 2] Using one resource to match different design resolutions.
- The coordinates in your codes is based on your current design resolution rather than resource size.
- Therefore, your design resolution could be very large and your resource size could be small.
- To test this, just define the marco 'TARGET_DESIGN_RESOLUTION_SIZE' to 'DESIGN_RESOLUTION_2048X1536'
- and open iphone simulator or create a window of 480x320 size.
-
- [Note] Normally, developer just need to define one design resolution(e.g. 960x640) with one or more resources.
- */
-
-#define DESIGN_RESOLUTION_480X320    0
-#define DESIGN_RESOLUTION_960x640    1
-#define DESIGN_RESOLUTION_1024X768   2
-#define DESIGN_RESOLUTION_2048X1536  3
-
-/* If you want to switch design resolution, change next line */
-#define TARGET_DESIGN_RESOLUTION_SIZE  DESIGN_RESOLUTION_960x640
-
-typedef struct tagResource {
-	cocos2d::Size size;
-	char directory[100];
-} Resource;
-
-static Resource smallResource = {cocos2d::Size(480, 320), "iphone"};
-static Resource mediumResource = {cocos2d::Size(960, 640), "iphone-retina"};
-static Resource largeResource = {cocos2d::Size(1024, 768), "ipad"};
-static Resource extralargeResource = {cocos2d::Size(2048, 1536), "ipad-retina"};
-
-#if (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_480X320)
-static cocos2d::CCSize designResolutionSize = cocos2d::Size(480, 320);
-#elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_960x640)
-static cocos2d::CCSize designResolutionSize = cocos2d::Size(960, 640);
-#elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_1024X768)
-static cocos2d::CCSize designResolutionSize = cocos2d::Size(1024, 768);
-#elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_2048X1536)
-static cocos2d::CCSize designResolutionSize = cocos2d::Size(2048, 1536);
-#else
-#error unknown target design resolution!
-#endif
-
-// The font size 24 is designed for small resolution, so we should change it to fit for current design resolution
-#define TITLE_FONT_SIZE (cocos2d::Director::getInstance()->getOpenGLView()->getDesignResolutionSize().width / smallResource.size.width * 24)
-
-#endif /* _APPMACROS_H_ */

+ 0 - 73
spine-cocos2dx/3.0/example/Classes/GoblinsExample.cpp

@@ -1,73 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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 "GoblinsExample.h"
-#include "SpineboyExample.h"
-#include <iostream>
-#include <fstream>
-#include <string.h>
-
-USING_NS_CC;
-using namespace spine;
-using namespace std;
-
-Scene* GoblinsExample::scene () {
-	Scene *scene = Scene::create();
-	scene->addChild(GoblinsExample::create());
-	return scene;
-}
-
-bool GoblinsExample::init () {
-	if (!LayerColor::initWithColor(Color4B(128, 128, 128, 255))) return false;
-
-	skeletonNode = SkeletonAnimation::createWithFile("goblins-ffd.json", "goblins-ffd.atlas", 1.5f);
-	skeletonNode->setAnimation(0, "walk", true);
-	skeletonNode->setSkin("goblin");
-
-	Size windowSize = Director::getInstance()->getWinSize();
-	skeletonNode->setPosition(Point(windowSize.width / 2, 20));
-	addChild(skeletonNode);
-
-	scheduleUpdate();
-	
-	EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
-	listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
-		if (!skeletonNode->debugBones)
-			skeletonNode->debugBones = true;
-		else if (skeletonNode->timeScale == 1)
-			skeletonNode->timeScale = 0.3f;
-		else
-			Director::getInstance()->replaceScene(SpineboyExample::scene());
-		return true;
-	};
-	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
-
-	return true;
-}

+ 0 - 105
spine-cocos2dx/3.0/example/Classes/SpineboyExample.cpp

@@ -1,105 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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 "SpineboyExample.h"
-#include "GoblinsExample.h"
-#include <iostream>
-#include <fstream>
-#include <string.h>
-
-USING_NS_CC;
-using namespace spine;
-using namespace std;
-
-Scene* SpineboyExample::scene () {
-	Scene *scene = Scene::create();
-	scene->addChild(SpineboyExample::create());
-	return scene;
-}
-
-bool SpineboyExample::init () {
-	if (!LayerColor::initWithColor(Color4B(128, 128, 128, 255))) return false;
-
-	skeletonNode = SkeletonAnimation::createWithFile("spineboy.json", "spineboy.atlas", 0.6f);
-
-	skeletonNode->startListener = [this] (int trackIndex) {
-		spTrackEntry* entry = spAnimationState_getCurrent(skeletonNode->state, trackIndex);
-		const char* animationName = (entry && entry->animation) ? entry->animation->name : 0;
-		log("%d start: %s", trackIndex, animationName);
-	};
-	skeletonNode->endListener = [] (int trackIndex) {
-		log("%d end", trackIndex);
-	};
-	skeletonNode->completeListener = [] (int trackIndex, int loopCount) {
-		log("%d complete: %d", trackIndex, loopCount);
-	};
-	skeletonNode->eventListener = [] (int trackIndex, spEvent* event) {
-		log("%d event: %s, %d, %f, %s", trackIndex, event->data->name, event->intValue, event->floatValue, event->stringValue);
-	};
-
-	skeletonNode->setMix("walk", "jump", 0.2f);
-	skeletonNode->setMix("jump", "run", 0.2f);
-	skeletonNode->setAnimation(0, "walk", true);
-	spTrackEntry* jumpEntry = skeletonNode->addAnimation(0, "jump", false, 3);
-	skeletonNode->addAnimation(0, "run", true);
-
-	skeletonNode->setStartListener(jumpEntry, [] (int trackIndex) {
-		log("jumped!");
-	});
-
-	// skeletonNode->addAnimation(1, "test", true);
-	// skeletonNode->runAction(RepeatForever::create(Sequence::create(FadeOut::create(1), FadeIn::create(1), DelayTime::create(5), NULL)));
-
-	Size windowSize = Director::getInstance()->getWinSize();
-	skeletonNode->setPosition(Point(windowSize.width / 2, 20));
-	addChild(skeletonNode);
-
-	scheduleUpdate();
-	
-	EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
-	listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
-		if (!skeletonNode->debugBones)
-			skeletonNode->debugBones = true;
-		else if (skeletonNode->timeScale == 1)
-			skeletonNode->timeScale = 0.3f;
-		else
-			Director::getInstance()->replaceScene(GoblinsExample::scene());
-		return true;
-	};
-	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
-
-	return true;
-}
-
-void SpineboyExample::update (float deltaTime) {
-	// Test releasing memory.
-	// Director::getInstance()->replaceScene(SpineboyExample::scene());
-}
-

二进制
spine-cocos2dx/3.0/example/Resources/ipad-retina/goblins-ffd.png


二进制
spine-cocos2dx/3.0/example/Resources/ipad-retina/spineboy.png


二进制
spine-cocos2dx/3.0/example/Resources/ipad/goblins-ffd.png


二进制
spine-cocos2dx/3.0/example/Resources/ipad/spineboy.png


二进制
spine-cocos2dx/3.0/example/Resources/iphone-retina/goblins-ffd.png


二进制
spine-cocos2dx/3.0/example/Resources/iphone-retina/spineboy.png


二进制
spine-cocos2dx/3.0/example/Resources/iphone/goblins-ffd.png


二进制
spine-cocos2dx/3.0/example/Resources/iphone/spineboy.png


+ 0 - 112
spine-cocos2dx/3.0/src/spine/PolygonBatch.cpp

@@ -1,112 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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/PolygonBatch.h>
-#include <spine/extension.h>
-
-USING_NS_CC;
-
-namespace spine {
-
-PolygonBatch* PolygonBatch::createWithCapacity (int capacity) {
-	PolygonBatch* batch = new PolygonBatch();
-	batch->initWithCapacity(capacity);
-	batch->autorelease();
-	return batch;
-}
-
-PolygonBatch::PolygonBatch () :
-	capacity(0), 
-	vertices(nullptr), verticesCount(0),
-	triangles(nullptr), trianglesCount(0),
-	texture(nullptr)
-{}
-
-bool PolygonBatch::initWithCapacity (int capacity) {
-	// 32767 is max index, so 32767 / 3 - (32767 / 3 % 3) = 10920.
-	CCASSERT(capacity <= 10920, "capacity cannot be > 10920");
-	CCASSERT(capacity >= 0, "capacity cannot be < 0");
-	this->capacity = capacity;
-	vertices = MALLOC(V2F_C4B_T2F, capacity);
-	triangles = MALLOC(GLushort, capacity * 3);
-	return true;
-}
-
-PolygonBatch::~PolygonBatch () {
-	FREE(vertices);
-	FREE(triangles);
-}
-
-void PolygonBatch::add (const Texture2D* addTexture,
-		const float* addVertices, const float* uvs, int addVerticesCount,
-		const int* addTriangles, int addTrianglesCount,
-		Color4B* color) {
-
-	if (
-		addTexture != texture
-		|| verticesCount + (addVerticesCount >> 1) > capacity
-		|| trianglesCount + addTrianglesCount > capacity * 3) {
-		this->flush();
-		texture = addTexture;
-	}
-
-	for (int i = 0; i < addTrianglesCount; ++i, ++trianglesCount)
-		triangles[trianglesCount] = addTriangles[i] + verticesCount;
-
-	for (int i = 0; i < addVerticesCount; i += 2, ++verticesCount) {
-		V2F_C4B_T2F* vertex = vertices + verticesCount;
-		vertex->vertices.x = addVertices[i];
-		vertex->vertices.y = addVertices[i + 1];
-		vertex->colors = *color;
-		vertex->texCoords.u = uvs[i];
-		vertex->texCoords.v = uvs[i + 1];
-	}
-}
-
-void PolygonBatch::flush () {
-	if (!verticesCount) return;
-
-	GL::bindTexture2D(texture->getName());
-	glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION);
-	glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_COLOR);
-	glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_TEX_COORDS);
-	glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(V2F_C4B_T2F), &vertices[0].vertices);
-	glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V2F_C4B_T2F), &vertices[0].colors);
-	glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORDS, 2, GL_FLOAT, GL_FALSE, sizeof(V2F_C4B_T2F), &vertices[0].texCoords);
-
-	glDrawElements(GL_TRIANGLES, trianglesCount, GL_UNSIGNED_SHORT, triangles);
-
-	verticesCount = 0;
-	trianglesCount = 0;
-
-	CHECK_GL_ERROR_DEBUG();
-}
-
-}

+ 0 - 229
spine-cocos2dx/3.0/src/spine/SkeletonAnimation.cpp

@@ -1,229 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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/SkeletonAnimation.h>
-#include <spine/spine-cocos2dx.h>
-#include <spine/extension.h>
-#include <algorithm>
-
-USING_NS_CC;
-using std::min;
-using std::max;
-using std::vector;
-
-namespace spine {
-
-void animationCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
-	((SkeletonAnimation*)state->rendererObject)->onAnimationStateEvent(trackIndex, type, event, loopCount);
-}
-
-void trackEntryCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
-	((SkeletonAnimation*)state->rendererObject)->onTrackEntryEvent(trackIndex, type, event, loopCount);
-}
-
-typedef struct _TrackEntryListeners {
-	StartListener startListener;
-	EndListener endListener;
-	CompleteListener completeListener;
-	EventListener eventListener;
-} _TrackEntryListeners;
-
-static _TrackEntryListeners* getListeners (spTrackEntry* entry) {
-	if (!entry->rendererObject) {
-		entry->rendererObject = NEW(spine::_TrackEntryListeners);
-		entry->listener = trackEntryCallback;
-	}
-	return (_TrackEntryListeners*)entry->rendererObject;
-}
-
-void disposeTrackEntry (spTrackEntry* entry) {
-	if (entry->rendererObject) FREE(entry->rendererObject);
-	_spTrackEntry_dispose(entry);
-}
-
-//
-
-SkeletonAnimation* SkeletonAnimation::createWithData (spSkeletonData* skeletonData) {
-	SkeletonAnimation* node = new SkeletonAnimation(skeletonData);
-	node->autorelease();
-	return node;
-}
-
-SkeletonAnimation* SkeletonAnimation::createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale) {
-	SkeletonAnimation* node = new SkeletonAnimation(skeletonDataFile, atlas, scale);
-	node->autorelease();
-	return node;
-}
-
-SkeletonAnimation* SkeletonAnimation::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) {
-	SkeletonAnimation* node = new SkeletonAnimation(skeletonDataFile, atlasFile, scale);
-	node->autorelease();
-	return node;
-}
-
-void SkeletonAnimation::initialize () {
-	ownsAnimationStateData = true;
-	state = spAnimationState_create(spAnimationStateData_create(skeleton->data));
-	state->rendererObject = this;
-	state->listener = animationCallback;
-
-	_spAnimationState* stateInternal = (_spAnimationState*)state;
-	stateInternal->disposeTrackEntry = disposeTrackEntry;
-}
-
-SkeletonAnimation::SkeletonAnimation (spSkeletonData *skeletonData)
-		: SkeletonRenderer(skeletonData) {
-	initialize();
-}
-
-SkeletonAnimation::SkeletonAnimation (const char* skeletonDataFile, spAtlas* atlas, float scale)
-		: SkeletonRenderer(skeletonDataFile, atlas, scale) {
-	initialize();
-}
-
-SkeletonAnimation::SkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale)
-		: SkeletonRenderer(skeletonDataFile, atlasFile, scale) {
-	initialize();
-}
-
-SkeletonAnimation::~SkeletonAnimation () {
-	if (ownsAnimationStateData) spAnimationStateData_dispose(state->data);
-	spAnimationState_dispose(state);
-}
-
-void SkeletonAnimation::update (float deltaTime) {
-	super::update(deltaTime);
-
-	deltaTime *= timeScale;
-	spAnimationState_update(state, deltaTime);
-	spAnimationState_apply(state, skeleton);
-	spSkeleton_updateWorldTransform(skeleton);
-}
-
-void SkeletonAnimation::setAnimationStateData (spAnimationStateData* stateData) {
-	CCASSERT(stateData, "stateData cannot be null.");
-
-	if (ownsAnimationStateData) spAnimationStateData_dispose(state->data);
-	spAnimationState_dispose(state);
-
-	ownsAnimationStateData = false;
-	state = spAnimationState_create(stateData);
-	state->rendererObject = this;
-	state->listener = animationCallback;
-}
-
-void SkeletonAnimation::setMix (const char* fromAnimation, const char* toAnimation, float duration) {
-	spAnimationStateData_setMixByName(state->data, fromAnimation, toAnimation, duration);
-}
-
-spTrackEntry* SkeletonAnimation::setAnimation (int trackIndex, const char* name, bool loop) {
-	spAnimation* animation = spSkeletonData_findAnimation(skeleton->data, name);
-	if (!animation) {
-		log("Spine: Animation not found: %s", name);
-		return 0;
-	}
-	return spAnimationState_setAnimation(state, trackIndex, animation, loop);
-}
-
-spTrackEntry* SkeletonAnimation::addAnimation (int trackIndex, const char* name, bool loop, float delay) {
-	spAnimation* animation = spSkeletonData_findAnimation(skeleton->data, name);
-	if (!animation) {
-		log("Spine: Animation not found: %s", name);
-		return 0;
-	}
-	return spAnimationState_addAnimation(state, trackIndex, animation, loop, delay);
-}
-
-spTrackEntry* SkeletonAnimation::getCurrent (int trackIndex) { 
-	return spAnimationState_getCurrent(state, trackIndex);
-}
-
-void SkeletonAnimation::clearTracks () {
-	spAnimationState_clearTracks(state);
-}
-
-void SkeletonAnimation::clearTrack (int trackIndex) {
-	spAnimationState_clearTrack(state, trackIndex);
-}
-
-void SkeletonAnimation::onAnimationStateEvent (int trackIndex, spEventType type, spEvent* event, int loopCount) {
-	switch (type) {
-	case SP_ANIMATION_START:
-		if (startListener) startListener(trackIndex);
-		break;
-	case SP_ANIMATION_END:
-		if (endListener) endListener(trackIndex);
-		break;
-	case SP_ANIMATION_COMPLETE:
-		if (completeListener) completeListener(trackIndex, loopCount);
-		break;
-	case SP_ANIMATION_EVENT:
-		if (eventListener) eventListener(trackIndex, event);
-		break;
-	}
-}
-
-void SkeletonAnimation::onTrackEntryEvent (int trackIndex, spEventType type, spEvent* event, int loopCount) {
-	spTrackEntry* entry = spAnimationState_getCurrent(state, trackIndex);
-	if (!entry->rendererObject) return;
-	_TrackEntryListeners* listeners = (_TrackEntryListeners*)entry->rendererObject;
-	switch (type) {
-	case SP_ANIMATION_START:
-		if (listeners->startListener) listeners->startListener(trackIndex);
-		break;
-	case SP_ANIMATION_END:
-		if (listeners->endListener) listeners->endListener(trackIndex);
-		break;
-	case SP_ANIMATION_COMPLETE:
-		if (listeners->completeListener) listeners->completeListener(trackIndex, loopCount);
-		break;
-	case SP_ANIMATION_EVENT:
-		if (listeners->eventListener) listeners->eventListener(trackIndex, event);
-		break;
-	}
-}
-
-void SkeletonAnimation::setStartListener (spTrackEntry* entry, StartListener listener) {
-	getListeners(entry)->startListener = listener;
-}
-
-void SkeletonAnimation::setEndListener (spTrackEntry* entry, EndListener listener) {
-	getListeners(entry)->endListener = listener;
-}
-
-void SkeletonAnimation::setCompleteListener (spTrackEntry* entry, CompleteListener listener) {
-	getListeners(entry)->completeListener = listener;
-}
-
-void SkeletonAnimation::setEventListener (spTrackEntry* entry, spine::EventListener listener) {
-	getListeners(entry)->eventListener = listener;
-}
-
-}

+ 0 - 96
spine-cocos2dx/3.0/src/spine/SkeletonAnimation.h

@@ -1,96 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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_SKELETONANIMATION_H_
-#define SPINE_SKELETONANIMATION_H_
-
-#include <spine/spine.h>
-#include <spine/SkeletonRenderer.h>
-#include "cocos2d.h"
-
-namespace spine {
-
-typedef std::function<void(int trackIndex)> StartListener;
-typedef std::function<void(int trackIndex)> EndListener;
-typedef std::function<void(int trackIndex, int loopCount)> CompleteListener;
-typedef std::function<void(int trackIndex, spEvent* event)> EventListener;
-
-/** Draws an animated skeleton, providing an AnimationState for applying one or more animations and queuing animations to be
-  * played later. */
-class SkeletonAnimation: public SkeletonRenderer {
-public:
-	spAnimationState* state;
-
-	static SkeletonAnimation* createWithData (spSkeletonData* skeletonData);
-	static SkeletonAnimation* createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
-	static SkeletonAnimation* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
-
-	SkeletonAnimation (spSkeletonData* skeletonData);
-	SkeletonAnimation (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
-	SkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
-
-	virtual ~SkeletonAnimation ();
-
-	virtual void update (float deltaTime);
-
-	void setAnimationStateData (spAnimationStateData* stateData);
-	void setMix (const char* fromAnimation, const char* toAnimation, float duration);
-
-	spTrackEntry* setAnimation (int trackIndex, const char* name, bool loop);
-	spTrackEntry* addAnimation (int trackIndex, const char* name, bool loop, float delay = 0);
-	spTrackEntry* getCurrent (int trackIndex = 0);
-	void clearTracks ();
-	void clearTrack (int trackIndex = 0);
-
-	StartListener startListener;
-	EndListener endListener;
-	CompleteListener completeListener;
-	EventListener eventListener;
-	void setStartListener (spTrackEntry* entry, StartListener listener);
-	void setEndListener (spTrackEntry* entry, EndListener listener);
-	void setCompleteListener (spTrackEntry* entry, CompleteListener listener);
-	void setEventListener (spTrackEntry* entry, EventListener listener);
-
-	virtual void onAnimationStateEvent (int trackIndex, spEventType type, spEvent* event, int loopCount);
-	virtual void onTrackEntryEvent (int trackIndex, spEventType type, spEvent* event, int loopCount);
-
-protected:
-	SkeletonAnimation ();
-
-private:
-	typedef SkeletonRenderer super;
-	bool ownsAnimationStateData;
-
-	void initialize ();
-};
-
-}
-
-#endif /* SPINE_SKELETONANIMATION_H_ */

+ 0 - 366
spine-cocos2dx/3.0/src/spine/SkeletonRenderer.cpp

@@ -1,366 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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/SkeletonRenderer.h>
-#include <spine/spine-cocos2dx.h>
-#include <spine/extension.h>
-#include <spine/PolygonBatch.h>
-#include <algorithm>
-
-USING_NS_CC;
-using std::min;
-using std::max;
-
-namespace spine {
-
-static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
-
-SkeletonRenderer* SkeletonRenderer::createWithData (spSkeletonData* skeletonData, bool ownsSkeletonData) {
-	SkeletonRenderer* node = new SkeletonRenderer(skeletonData, ownsSkeletonData);
-	node->autorelease();
-	return node;
-}
-
-SkeletonRenderer* SkeletonRenderer::createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale) {
-	SkeletonRenderer* node = new SkeletonRenderer(skeletonDataFile, atlas, scale);
-	node->autorelease();
-	return node;
-}
-
-SkeletonRenderer* SkeletonRenderer::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) {
-	SkeletonRenderer* node = new SkeletonRenderer(skeletonDataFile, atlasFile, scale);
-	node->autorelease();
-	return node;
-}
-
-void SkeletonRenderer::initialize () {
-	atlas = 0;
-	debugSlots = false;
-	debugBones = false;
-	timeScale = 1;
-
-	worldVertices = MALLOC(float, 1000); // Max number of vertices per mesh.
-
-	batch = PolygonBatch::createWithCapacity(2000); // Max number of vertices and triangles per batch.
-	batch->retain();
-
-	blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;
-	setOpacityModifyRGB(true);
-
-	setShaderProgram(ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR));
-	scheduleUpdate();
-}
-
-void SkeletonRenderer::setSkeletonData (spSkeletonData *skeletonData, bool ownsSkeletonData) {
-	skeleton = spSkeleton_create(skeletonData);
-	rootBone = skeleton->bones[0];
-	this->ownsSkeletonData = ownsSkeletonData;	
-}
-
-SkeletonRenderer::SkeletonRenderer () {
-	initialize();
-}
-
-SkeletonRenderer::SkeletonRenderer (spSkeletonData *skeletonData, bool ownsSkeletonData) {
-	initialize();
-
-	setSkeletonData(skeletonData, ownsSkeletonData);
-}
-
-SkeletonRenderer::SkeletonRenderer (const char* skeletonDataFile, spAtlas* atlas, float scale) {
-	initialize();
-
-	spSkeletonJson* json = spSkeletonJson_create(atlas);
-	json->scale = scale;
-	spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile);
-	CCASSERT(skeletonData, json->error ? json->error : "Error reading skeleton data.");
-	spSkeletonJson_dispose(json);
-
-	setSkeletonData(skeletonData, true);
-}
-
-SkeletonRenderer::SkeletonRenderer (const char* skeletonDataFile, const char* atlasFile, float scale) {
-	initialize();
-
-	atlas = spAtlas_createFromFile(atlasFile, 0);
-	CCASSERT(atlas, "Error reading atlas file.");
-
-	spSkeletonJson* json = spSkeletonJson_create(atlas);
-	json->scale = scale;
-	spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile);
-	CCASSERT(skeletonData, json->error ? json->error : "Error reading skeleton data file.");
-	spSkeletonJson_dispose(json);
-
-	setSkeletonData(skeletonData, true);
-}
-
-SkeletonRenderer::~SkeletonRenderer () {
-	if (ownsSkeletonData) spSkeletonData_dispose(skeleton->data);
-	if (atlas) spAtlas_dispose(atlas);
-	spSkeleton_dispose(skeleton);
-	batch->release();
-	FREE(worldVertices);
-}
-
-void SkeletonRenderer::update (float deltaTime) {
-	spSkeleton_update(skeleton, deltaTime * timeScale);
-}
-
-void SkeletonRenderer::draw(Renderer* renderer, const kmMat4& transform, bool transformUpdated) {
-    drawCommand.init(_globalZOrder);
-    drawCommand.func = CC_CALLBACK_0(SkeletonRenderer::drawSkeleton, this, transform, transformUpdated);
-    renderer->addCommand(&drawCommand);
-}
-
-void SkeletonRenderer::drawSkeleton (const kmMat4& transform, bool transformUpdated) {
-	getShaderProgram()->use();
-	getShaderProgram()->setUniformsForBuiltins(transform);
-	GL::bindVAO(0);
-
-	Color3B nodeColor = getColor();
-	skeleton->r = nodeColor.r / (float)255;
-	skeleton->g = nodeColor.g / (float)255;
-	skeleton->b = nodeColor.b / (float)255;
-	skeleton->a = getDisplayedOpacity() / (float)255;
-
-	int additive = -1;
-	Color4B color;
-	const float* uvs = nullptr;
-	int verticesCount = 0;
-	const int* triangles = nullptr;
-	int trianglesCount = 0;
-	float r = 0, g = 0, b = 0, a = 0;
-	for (int i = 0, n = skeleton->slotCount; i < n; i++) {
-		spSlot* slot = skeleton->drawOrder[i];
-		if (!slot->attachment) continue;
-		Texture2D *texture = nullptr;
-		switch (slot->attachment->type) {
-		case SP_ATTACHMENT_REGION: {
-			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
-			texture = getTexture(attachment);
-			uvs = attachment->uvs;
-			verticesCount = 8;
-			triangles = quadTriangles;
-			trianglesCount = 6;
-			r = attachment->r;
-			g = attachment->g;
-			b = attachment->b;
-			a = attachment->a;
-			break;
-		}
-		case SP_ATTACHMENT_MESH: {
-			spMeshAttachment* attachment = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
-			texture = getTexture(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_SKINNED_MESH: {
-			spSkinnedMeshAttachment* attachment = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
-			texture = getTexture(attachment);
-			uvs = attachment->uvs;
-			verticesCount = attachment->uvsCount;
-			triangles = attachment->triangles;
-			trianglesCount = attachment->trianglesCount;
-			r = attachment->r;
-			g = attachment->g;
-			b = attachment->b;
-			a = attachment->a;
-			break;
-		}
-		} 
-		if (texture) {
-			if (slot->data->additiveBlending != additive) {
-				batch->flush();
-				GL::blendFunc(blendFunc.src, slot->data->additiveBlending ? GL_ONE : blendFunc.dst);
-				additive = slot->data->additiveBlending;
-			}
-			color.a = skeleton->a * slot->a * a * 255;
-			float multiplier = premultipliedAlpha ? color.a : 255;
-			color.r = skeleton->r * slot->r * r * multiplier;
-			color.g = skeleton->g * slot->g * g * multiplier;
-			color.b = skeleton->b * slot->b * b * multiplier;
-			batch->add(texture, worldVertices, uvs, verticesCount, triangles, trianglesCount, &color);
-		}
-	}
-	batch->flush();
-
-	if (debugSlots || debugBones) {
-		kmGLPushMatrix();
-		kmGLLoadMatrix(&transform);
-		if (debugSlots) {
-			// Slots.
-			DrawPrimitives::setDrawColor4B(0, 0, 255, 255);
-			glLineWidth(1);
-			Point points[4];
-			V3F_C4B_T2F_Quad quad;
-			for (int i = 0, n = skeleton->slotCount; i < n; i++) {
-				spSlot* slot = skeleton->drawOrder[i];
-				if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue;
-				spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-				spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
-				points[0] = Point(worldVertices[0], worldVertices[1]);
-				points[1] = Point(worldVertices[2], worldVertices[3]);
-				points[2] = Point(worldVertices[4], worldVertices[5]);
-				points[3] = Point(worldVertices[6], worldVertices[7]);
-				DrawPrimitives::drawPoly(points, 4, true);
-			}
-		}
-		if (debugBones) {
-			// Bone lengths.
-			glLineWidth(2);
-			DrawPrimitives::setDrawColor4B(255, 0, 0, 255);
-			for (int i = 0, n = skeleton->boneCount; i < n; i++) {
-				spBone *bone = skeleton->bones[i];
-				float x = bone->data->length * bone->m00 + bone->worldX;
-				float y = bone->data->length * bone->m10 + bone->worldY;
-				DrawPrimitives::drawLine(Point(bone->worldX, bone->worldY), Point(x, y));
-			}
-			// Bone origins.
-			DrawPrimitives::setPointSize(4);
-			DrawPrimitives::setDrawColor4B(0, 0, 255, 255); // Root bone is blue.
-			for (int i = 0, n = skeleton->boneCount; i < n; i++) {
-				spBone *bone = skeleton->bones[i];
-				DrawPrimitives::drawPoint(Point(bone->worldX, bone->worldY));
-				if (i == 0) DrawPrimitives::setDrawColor4B(0, 255, 0, 255);
-			}
-		}
-		kmGLPopMatrix();
-	}
-}
-
-Texture2D* SkeletonRenderer::getTexture (spRegionAttachment* attachment) const {
-	return (Texture2D*)((spAtlasRegion*)attachment->rendererObject)->page->rendererObject;
-}
-
-Texture2D* SkeletonRenderer::getTexture (spMeshAttachment* attachment) const {
-	return (Texture2D*)((spAtlasRegion*)attachment->rendererObject)->page->rendererObject;
-}
-
-Texture2D* SkeletonRenderer::getTexture (spSkinnedMeshAttachment* attachment) const {
-	return (Texture2D*)((spAtlasRegion*)attachment->rendererObject)->page->rendererObject;
-}
-
-Rect SkeletonRenderer::getBoundingBox () const {
-	float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
-	float scaleX = getScaleX(), scaleY = getScaleY();
-	for (int i = 0; i < skeleton->slotCount; ++i) {
-		spSlot* slot = skeleton->slots[i];
-		if (!slot->attachment) continue;
-		int verticesCount;
-		if (slot->attachment->type == SP_ATTACHMENT_REGION) {
-			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
-			verticesCount = 8;
-		} else if (slot->attachment->type == SP_ATTACHMENT_MESH) {
-			spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
-			verticesCount = mesh->verticesCount;
-		} else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) {
-			spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
-			verticesCount = mesh->uvsCount;
-		} else
-			continue;
-		for (int ii = 0; ii < verticesCount; ii += 2) {
-			float x = worldVertices[ii] * scaleX, y = worldVertices[ii + 1] * scaleY;
-			minX = min(minX, x);
-			minY = min(minY, y);
-			maxX = max(maxX, x);
-			maxY = max(maxY, y);
-		}
-	}
-	Point position = getPosition();
-	return Rect(position.x + minX, position.y + minY, maxX - minX, maxY - minY);
-}
-
-// --- Convenience methods for Skeleton_* functions.
-
-void SkeletonRenderer::updateWorldTransform () {
-	spSkeleton_updateWorldTransform(skeleton);
-}
-
-void SkeletonRenderer::setToSetupPose () {
-	spSkeleton_setToSetupPose(skeleton);
-}
-void SkeletonRenderer::setBonesToSetupPose () {
-	spSkeleton_setBonesToSetupPose(skeleton);
-}
-void SkeletonRenderer::setSlotsToSetupPose () {
-	spSkeleton_setSlotsToSetupPose(skeleton);
-}
-
-spBone* SkeletonRenderer::findBone (const char* boneName) const {
-	return spSkeleton_findBone(skeleton, boneName);
-}
-
-spSlot* SkeletonRenderer::findSlot (const char* slotName) const {
-	return spSkeleton_findSlot(skeleton, slotName);
-}
-
-bool SkeletonRenderer::setSkin (const char* skinName) {
-	return spSkeleton_setSkinByName(skeleton, skinName) ? true : false;
-}
-
-spAttachment* SkeletonRenderer::getAttachment (const char* slotName, const char* attachmentName) const {
-	return spSkeleton_getAttachmentForSlotName(skeleton, slotName, attachmentName);
-}
-bool SkeletonRenderer::setAttachment (const char* slotName, const char* attachmentName) {
-	return spSkeleton_setAttachment(skeleton, slotName, attachmentName) ? true : false;
-}
-
-// --- CCBlendProtocol
-
-const BlendFunc& SkeletonRenderer::getBlendFunc () const {
-    return blendFunc;
-}
-
-void SkeletonRenderer::setBlendFunc (const BlendFunc &blendFunc) {
-    this->blendFunc = blendFunc;
-}
-
-void SkeletonRenderer::setOpacityModifyRGB (bool value) {
-	premultipliedAlpha = value;
-}
-
-bool SkeletonRenderer::isOpacityModifyRGB () {
-	return premultipliedAlpha;
-}
-
-}

+ 0 - 113
spine-cocos2dx/3.0/src/spine/SkeletonRenderer.h

@@ -1,113 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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_SKELETONRENDERER_H_
-#define SPINE_SKELETONRENDERER_H_
-
-#include <spine/spine.h>
-#include "cocos2d.h"
-
-namespace spine {
-
-class PolygonBatch;
-
-/** Draws a skeleton. */
-class SkeletonRenderer: public cocos2d::Node, public cocos2d::BlendProtocol {
-public:
-	spSkeleton* skeleton;
-	spBone* rootBone;
-	float timeScale;
-	bool debugSlots;
-	bool debugBones;
-	bool premultipliedAlpha;
-
-	static SkeletonRenderer* createWithData (spSkeletonData* skeletonData, bool ownsSkeletonData = false);
-	static SkeletonRenderer* createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
-	static SkeletonRenderer* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
-
-	SkeletonRenderer (spSkeletonData* skeletonData, bool ownsSkeletonData = false);
-	SkeletonRenderer (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
-	SkeletonRenderer (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
-
-	virtual ~SkeletonRenderer ();
-
-	virtual void update (float deltaTime) override;
-	virtual void draw(cocos2d::Renderer* renderer, const kmMat4& transform, bool transformUpdated) override;
-	virtual void drawSkeleton (const kmMat4& transform, bool transformUpdated);
-	virtual cocos2d::Rect getBoundingBox () const override;
-
-	// --- Convenience methods for common Skeleton_* functions.
-	void updateWorldTransform ();
-
-	void setToSetupPose ();
-	void setBonesToSetupPose ();
-	void setSlotsToSetupPose ();
-
-	/* Returns 0 if the bone was not found. */
-	spBone* findBone (const char* boneName) const;
-	/* Returns 0 if the slot was not found. */
-	spSlot* findSlot (const char* slotName) const;
-	
-	/* Sets the skin used to look up attachments not found in the SkeletonData defaultSkin. Attachments from the new skin are
-	 * attached if the corresponding attachment from the old skin was attached. Returns false if the skin was not found.
-	 * @param skin May be 0.*/
-	bool setSkin (const char* skinName);
-	
-	/* Returns 0 if the slot or attachment was not found. */
-	spAttachment* getAttachment (const char* slotName, const char* attachmentName) const;
-	/* Returns false if the slot or attachment was not found. */
-	bool setAttachment (const char* slotName, const char* attachmentName);
-
-	// --- BlendProtocol
-	virtual void setBlendFunc (const cocos2d::BlendFunc& blendFunc);
-	virtual const cocos2d::BlendFunc& getBlendFunc () const;
-	virtual void setOpacityModifyRGB (bool value);
-	virtual bool isOpacityModifyRGB ();
-
-protected:
-	SkeletonRenderer ();
-	void setSkeletonData (spSkeletonData* skeletonData, bool ownsSkeletonData);
-	virtual cocos2d::Texture2D* getTexture (spRegionAttachment* attachment) const;
-	virtual cocos2d::Texture2D* getTexture (spMeshAttachment* attachment) const;
-	virtual cocos2d::Texture2D* getTexture (spSkinnedMeshAttachment* attachment) const;
-
-private:
-	bool ownsSkeletonData;
-	spAtlas* atlas;
-	cocos2d::CustomCommand drawCommand;
-	cocos2d::BlendFunc blendFunc;
-	PolygonBatch* batch;
-	float* worldVertices;
-	void initialize ();
-};
-
-}
-
-#endif /* SPINE_SKELETONRENDERER_H_ */

+ 0 - 21
spine-cocos2dx/3.1/README.md

@@ -1,21 +0,0 @@
-# spine-cocos2dx v3.1
-
-The spine-cocos2dx runtime provides functionality to load, manipulate and render [Spine](http://esotericsoftware.com) skeletal animation data using [cocos2d-x](http://www.cocos2d-x.org/). spine-cocos2dx is based on [spine-c](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-c).
-
-## Setup
-
-1. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip).
-1. Place the contents of a cocos2d-x version 3.1 distribution into the `spine-cocos2dx/3.1/cocos2dx` directory.
-1. Run the `python download-deps.py` script in the `spine-cocos2dx/3.1/cocos2dx` directory.
-1. Open the XCode (Mac) or Visual C++ 2012 Express (Windows) project file from the `spine-cocos2dx/3.1/example` directory. Build files are also provided for Android.
-
-Alternatively, the contents of the `spine-c/src`, `spine-c/include` and `spine-cocos2dx/3.1/src` directories can be copied into your project. Be sure your header search path will find the contents of the `spine-c/include` and `spine-cocos2dx/3.1/src` directories. Note that the includes use `spine/Xxx.h`, so the `spine` directory cannot be omitted when copying the files.
-
-## Notes
-
-- Images are no longer premultiplied by cocos2d-x as they where in cocos2d-x v2, so the Spine atlas images *should* use premultiplied alpha.
-
-## Examples
-
-[Spineboy](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/3.1/example/Classes/SpineboyExample.cpp)
-[Golbins](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/3.1/example/Classes/GoblinsExample.cpp)

+ 0 - 87
spine-cocos2dx/3.1/example/Classes/AppDelegate.cpp

@@ -1,87 +0,0 @@
-#include "AppDelegate.h"
-
-#include <vector>
-#include <string>
-
-#include "SpineboyExample.h"
-#include "AppMacros.h"
-
-USING_NS_CC;
-using namespace std;
-
-AppDelegate::AppDelegate () {
-}
-
-AppDelegate::~AppDelegate () {
-}
-
-bool AppDelegate::applicationDidFinishLaunching () {
-	// initialize director
-	auto director = Director::getInstance();
-	auto glview = director->getOpenGLView();
-
-	// Set the design resolution
-#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
-	// a bug in DirectX 11 level9-x on the device prevents ResolutionPolicy::NO_BORDER from working correctly
-	glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::SHOW_ALL);
-#else
-	glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);
-#endif
-
-	Size frameSize = glview->getFrameSize();
-	
-	vector<string> searchPath;
-
-	// In this demo, we select resource according to the frame's height.
-	// If the resource size is different from design resolution size, you need to set contentScaleFactor.
-	// We use the ratio of resource's height to the height of design resolution,
-	// this can make sure that the resource's height could fit for the height of design resolution.
-	if (frameSize.height > mediumResource.size.height) {
-		// if the frame's height is larger than the height of medium resource size, select large resource.
-		searchPath.push_back(largeResource.directory);
-		director->setContentScaleFactor(MIN(largeResource.size.height/designResolutionSize.height, largeResource.size.width/designResolutionSize.width));
-	} else if (frameSize.height > smallResource.size.height) {
-		// if the frame's height is larger than the height of small resource size, select medium resource.
-		searchPath.push_back(mediumResource.directory);
-		director->setContentScaleFactor(MIN(mediumResource.size.height/designResolutionSize.height, mediumResource.size.width/designResolutionSize.width));
-	} else {
-		// if the frame's height is smaller than the height of medium resource size, select small resource.
-		searchPath.push_back(smallResource.directory);
-		director->setContentScaleFactor(MIN(smallResource.size.height/designResolutionSize.height, smallResource.size.width/designResolutionSize.width));
-	}
-	
-	searchPath.push_back("common");
-	 
-	// set searching path
-	FileUtils::getInstance()->setSearchPaths(searchPath);
-	
-	// turn on display FPS
-	director->setDisplayStats(true);
-
-	// set FPS. the default value is 1.0/60 if you don't call this
-	director->setAnimationInterval(1.0 / 60);
-
-	// create a scene. it's an autorelease object
-	auto scene = SpineboyExample::scene();
-
-	// run
-	director->runWithScene(scene);
-
-	return true;
-}
-
-// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
-void AppDelegate::applicationDidEnterBackground () {
-	Director::getInstance()->stopAnimation();
-
-	// if you use SimpleAudioEngine, it must be paused
-	// SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
-}
-
-// this function will be called when the app is active again
-void AppDelegate::applicationWillEnterForeground () {
-	Director::getInstance()->startAnimation();
-
-	// if you use SimpleAudioEngine, it must resume here
-	// SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
-}

+ 0 - 18
spine-cocos2dx/3.1/example/Classes/AppDelegate.h

@@ -1,18 +0,0 @@
-
-
-#ifndef  _APPDELEGATE_H_
-#define  _APPDELEGATE_H_
-
-#include "cocos2d.h"
-
-class AppDelegate: private cocos2d::CCApplication {
-public:
-	AppDelegate ();
-	virtual ~AppDelegate ();
-
-	virtual bool applicationDidFinishLaunching ();
-	virtual void applicationDidEnterBackground ();
-	virtual void applicationWillEnterForeground ();
-};
-
-#endif // _APPDELEGATE_H_

+ 0 - 61
spine-cocos2dx/3.1/example/Classes/AppMacros.h

@@ -1,61 +0,0 @@
-
-
-#ifndef _APPMACROS_H_
-#define _APPMACROS_H_
-
-#include "cocos2d.h"
-
-/* For demonstrating using one design resolution to match different resources,
- or one resource to match different design resolutions.
-
- [Situation 1] Using one design resolution to match different resources.
- Please look into Appdelegate::applicationDidFinishLaunching.
- We check current device frame size to decide which resource need to be selected.
- So if you want to test this situation which said in title '[Situation 1]',
- you should change ios simulator to different device(e.g. iphone, iphone-retina3.5, iphone-retina4.0, ipad, ipad-retina),
- or change the window size in "proj.XXX/main.cpp" by "CCEGLView::setFrameSize" if you are using win32 or linux plaform
- and modify "proj.mac/AppController.mm" by changing the window rectangle.
-
- [Situation 2] Using one resource to match different design resolutions.
- The coordinates in your codes is based on your current design resolution rather than resource size.
- Therefore, your design resolution could be very large and your resource size could be small.
- To test this, just define the marco 'TARGET_DESIGN_RESOLUTION_SIZE' to 'DESIGN_RESOLUTION_2048X1536'
- and open iphone simulator or create a window of 480x320 size.
-
- [Note] Normally, developer just need to define one design resolution(e.g. 960x640) with one or more resources.
- */
-
-#define DESIGN_RESOLUTION_480X320    0
-#define DESIGN_RESOLUTION_960x640    1
-#define DESIGN_RESOLUTION_1024X768   2
-#define DESIGN_RESOLUTION_2048X1536  3
-
-/* If you want to switch design resolution, change next line */
-#define TARGET_DESIGN_RESOLUTION_SIZE  DESIGN_RESOLUTION_960x640
-
-typedef struct tagResource {
-	cocos2d::Size size;
-	char directory[100];
-} Resource;
-
-static Resource smallResource = {cocos2d::Size(480, 320), "iphone"};
-static Resource mediumResource = {cocos2d::Size(960, 640), "iphone-retina"};
-static Resource largeResource = {cocos2d::Size(1024, 768), "ipad"};
-static Resource extralargeResource = {cocos2d::Size(2048, 1536), "ipad-retina"};
-
-#if (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_480X320)
-static cocos2d::CCSize designResolutionSize = cocos2d::Size(480, 320);
-#elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_960x640)
-static cocos2d::CCSize designResolutionSize = cocos2d::Size(960, 640);
-#elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_1024X768)
-static cocos2d::CCSize designResolutionSize = cocos2d::Size(1024, 768);
-#elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_2048X1536)
-static cocos2d::CCSize designResolutionSize = cocos2d::Size(2048, 1536);
-#else
-#error unknown target design resolution!
-#endif
-
-// The font size 24 is designed for small resolution, so we should change it to fit for current design resolution
-#define TITLE_FONT_SIZE (cocos2d::Director::getInstance()->getOpenGLView()->getDesignResolutionSize().width / smallResource.size.width * 24)
-
-#endif /* _APPMACROS_H_ */

+ 0 - 105
spine-cocos2dx/3.1/example/Classes/SpineboyExample.cpp

@@ -1,105 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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 "SpineboyExample.h"
-#include "GoblinsExample.h"
-#include <iostream>
-#include <fstream>
-#include <string.h>
-
-USING_NS_CC;
-using namespace spine;
-using namespace std;
-
-Scene* SpineboyExample::scene () {
-	Scene *scene = Scene::create();
-	scene->addChild(SpineboyExample::create());
-	return scene;
-}
-
-bool SpineboyExample::init () {
-	if (!LayerColor::initWithColor(Color4B(128, 128, 128, 255))) return false;
-
-	skeletonNode = SkeletonAnimation::createWithFile("spineboy.json", "spineboy.atlas", 0.6f);
-
-	skeletonNode->startListener = [this] (int trackIndex) {
-		spTrackEntry* entry = spAnimationState_getCurrent(skeletonNode->state, trackIndex);
-		const char* animationName = (entry && entry->animation) ? entry->animation->name : 0;
-		log("%d start: %s", trackIndex, animationName);
-	};
-	skeletonNode->endListener = [] (int trackIndex) {
-		log("%d end", trackIndex);
-	};
-	skeletonNode->completeListener = [] (int trackIndex, int loopCount) {
-		log("%d complete: %d", trackIndex, loopCount);
-	};
-	skeletonNode->eventListener = [] (int trackIndex, spEvent* event) {
-		log("%d event: %s, %d, %f, %s", trackIndex, event->data->name, event->intValue, event->floatValue, event->stringValue);
-	};
-
-	skeletonNode->setMix("walk", "jump", 0.2f);
-	skeletonNode->setMix("jump", "run", 0.2f);
-	skeletonNode->setAnimation(0, "walk", true);
-	spTrackEntry* jumpEntry = skeletonNode->addAnimation(0, "jump", false, 3);
-	skeletonNode->addAnimation(0, "run", true);
-
-	skeletonNode->setStartListener(jumpEntry, [] (int trackIndex) {
-		log("jumped!");
-	});
-
-	// skeletonNode->addAnimation(1, "test", true);
-	// skeletonNode->runAction(RepeatForever::create(Sequence::create(FadeOut::create(1), FadeIn::create(1), DelayTime::create(5), NULL)));
-
-	Size windowSize = Director::getInstance()->getWinSize();
-	skeletonNode->setPosition(Vec2(windowSize.width / 2, 20));
-	addChild(skeletonNode);
-
-	scheduleUpdate();
-	
-	EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
-	listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
-		if (!skeletonNode->debugBones)
-			skeletonNode->debugBones = true;
-		else if (skeletonNode->timeScale == 1)
-			skeletonNode->timeScale = 0.3f;
-		else
-			Director::getInstance()->replaceScene(GoblinsExample::scene());
-		return true;
-	};
-	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
-
-	return true;
-}
-
-void SpineboyExample::update (float deltaTime) {
-	// Test releasing memory.
-	// Director::getInstance()->replaceScene(SpineboyExample::scene());
-}
-

+ 0 - 49
spine-cocos2dx/3.1/example/Classes/SpineboyExample.h

@@ -1,49 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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 _SPINEBOYEXAMPLE_H_
-#define _SPINEBOYEXAMPLE_H_
-
-#include "cocos2d.h"
-#include <spine/spine-cocos2dx.h>
-
-class SpineboyExample : public cocos2d::LayerColor {
-public:
-	static cocos2d::Scene* scene ();
-
-	virtual bool init ();
-	virtual void update (float deltaTime);
-
-	CREATE_FUNC (SpineboyExample);
-private:
-	spine::SkeletonAnimation* skeletonNode;
-};
-
-#endif // _SPINEBOYEXAMPLE_H_

+ 0 - 1081
spine-cocos2dx/3.1/example/Resources/common/goblins-ffd.json

@@ -1,1081 +0,0 @@
-{
-"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": "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 }
-],
-"slots": [
-	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
-	{ "name": "left arm", "bone": "left arm", "attachment": "left arm" },
-	{ "name": "left hand item", "bone": "left hand", "attachment": "spear" },
-	{ "name": "left hand", "bone": "left hand", "attachment": "left hand" },
-	{ "name": "left foot", "bone": "left foot", "attachment": "left foot" },
-	{ "name": "left lower leg", "bone": "left lower leg", "attachment": "left lower leg" },
-	{ "name": "left upper leg", "bone": "left upper leg", "attachment": "left upper leg" },
-	{ "name": "neck", "bone": "neck", "attachment": "neck" },
-	{ "name": "torso", "bone": "torso", "attachment": "torso" },
-	{ "name": "pelvis", "bone": "pelvis", "attachment": "pelvis" },
-	{ "name": "right foot", "bone": "right foot", "attachment": "right foot" },
-	{ "name": "right lower leg", "bone": "right lower leg", "attachment": "right lower leg" },
-	{ "name": "undie straps", "bone": "pelvis", "attachment": "undie straps" },
-	{ "name": "undies", "bone": "pelvis", "attachment": "undies" },
-	{ "name": "right upper leg", "bone": "right upper leg", "attachment": "right upper leg" },
-	{ "name": "head", "bone": "head", "attachment": "head" },
-	{ "name": "eyes", "bone": "head" },
-	{ "name": "right shoulder", "bone": "right shoulder", "attachment": "right shoulder" },
-	{ "name": "right arm", "bone": "right arm", "attachment": "right arm" },
-	{ "name": "right hand thumb", "bone": "right hand", "attachment": "right hand thumb" },
-	{ "name": "right hand item", "bone": "right hand", "attachment": "dagger" },
-	{ "name": "right hand", "bone": "right hand", "attachment": "right hand" },
-	{ "name": "right hand item 2", "bone": "right hand", "attachment": "shield" }
-],
-"skins": {
-	"default": {
-		"left hand item": {
-			"dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 },
-			"spear": {
-				"type": "skinnedmesh",
-				"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 ],
-				"hull": 14,
-				"width": 22,
-				"height": 368
-			}
-		},
-		"right hand item": {
-			"dagger": {
-				"type": "mesh",
-				"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,
-				"width": 26,
-				"height": 108
-			}
-		},
-		"right hand item 2": {
-			"shield": { "rotation": 93.49, "width": 70, "height": 72 }
-		}
-	},
-	"goblin": {
-		"eyes": {
-			"eyes closed": { "name": "goblin/eyes-closed", "x": 29.19, "y": -24.89, "rotation": -88.92, "width": 34, "height": 12 }
-		},
-		"head": {
-			"head": {
-				"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 ],
-				"hull": 24,
-				"width": 103,
-				"height": 66
-			}
-		},
-		"left arm": {
-			"left arm": {
-				"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 ],
-				"hull": 9,
-				"width": 37,
-				"height": 35
-			}
-		},
-		"left foot": {
-			"left foot": {
-				"name": "goblin/left-foot",
-				"type": "mesh",
-				"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,
-				"width": 65,
-				"height": 31
-			}
-		},
-		"left hand": {
-			"left hand": {
-				"name": "goblin/left-hand",
-				"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 ],
-				"hull": 9,
-				"width": 36,
-				"height": 41
-			}
-		},
-		"left lower leg": {
-			"left lower leg": {
-				"name": "goblin/left-lower-leg",
-				"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 ],
-				"hull": 11,
-				"width": 33,
-				"height": 70
-			}
-		},
-		"left shoulder": {
-			"left shoulder": {
-				"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 ],
-				"hull": 8,
-				"width": 29,
-				"height": 44
-			}
-		},
-		"left upper leg": {
-			"left upper leg": {
-				"name": "goblin/left-upper-leg",
-				"type": "mesh",
-				"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,
-				"width": 33,
-				"height": 73
-			}
-		},
-		"neck": {
-			"neck": {
-				"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 ],
-				"hull": 10,
-				"width": 36,
-				"height": 41
-			}
-		},
-		"pelvis": {
-			"pelvis": {
-				"name": "goblin/pelvis",
-				"type": "mesh",
-				"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,
-				"width": 62,
-				"height": 43
-			}
-		},
-		"right arm": {
-			"right arm": {
-				"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 ],
-				"hull": 8,
-				"width": 23,
-				"height": 50
-			}
-		},
-		"right foot": {
-			"right foot": {
-				"name": "goblin/right-foot",
-				"type": "mesh",
-				"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,
-				"width": 63,
-				"height": 33
-			}
-		},
-		"right hand": {
-			"right hand": {
-				"name": "goblin/right-hand",
-				"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 ],
-				"hull": 11,
-				"width": 36,
-				"height": 37
-			}
-		},
-		"right hand thumb": {
-			"right hand thumb": {
-				"name": "goblin/right-hand",
-				"type": "mesh",
-				"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,
-				"width": 36,
-				"height": 37
-			}
-		},
-		"right lower leg": {
-			"right lower leg": {
-				"name": "goblin/right-lower-leg",
-				"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 ],
-				"hull": 11,
-				"width": 36,
-				"height": 76
-			}
-		},
-		"right shoulder": {
-			"right shoulder": {
-				"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 ],
-				"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,
-				"width": 39,
-				"height": 45
-			}
-		},
-		"right upper leg": {
-			"right upper leg": {
-				"name": "goblin/right-upper-leg",
-				"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 ],
-				"hull": 10,
-				"width": 34,
-				"height": 63
-			}
-		},
-		"torso": {
-			"torso": {
-				"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 ],
-				"hull": 16,
-				"width": 68,
-				"height": 96
-			}
-		},
-		"undie straps": {
-			"undie straps": {
-				"name": "goblin/undie-straps",
-				"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 ],
-				"hull": 9,
-				"width": 55,
-				"height": 19
-			}
-		},
-		"undies": {
-			"undies": {
-				"name": "goblin/undies",
-				"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 ],
-				"hull": 10,
-				"width": 36,
-				"height": 29
-			}
-		}
-	},
-	"goblingirl": {
-		"eyes": {
-			"eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 }
-		},
-		"head": {
-			"head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 }
-		},
-		"left arm": {
-			"left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 }
-		},
-		"left foot": {
-			"left foot": { "name": "goblingirl/left-foot", "x": 25.17, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 }
-		},
-		"left hand": {
-			"left hand": {
-				"name": "goblingirl/left-hand",
-				"x": 4.34,
-				"y": 2.39,
-				"scaleX": 0.896,
-				"scaleY": 0.896,
-				"rotation": 30.34,
-				"width": 35,
-				"height": 40
-			}
-		},
-		"left lower leg": {
-			"left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.6, "rotation": 105.75, "width": 33, "height": 70 }
-		},
-		"left shoulder": {
-			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 }
-		},
-		"left upper leg": {
-			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 }
-		},
-		"neck": {
-			"neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 }
-		},
-		"pelvis": {
-			"pelvis": { "name": "goblingirl/pelvis", "x": -3.87, "y": 3.18, "width": 62, "height": 43 }
-		},
-		"right arm": {
-			"right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 }
-		},
-		"right foot": {
-			"right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.52, "width": 63, "height": 33 }
-		},
-		"right hand": {
-			"right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
-		},
-		"right hand thumb": {
-			"right hand thumb": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
-		},
-		"right lower leg": {
-			"right lower leg": { "name": "goblingirl/right-lower-leg", "x": 26.15, "y": -3.27, "rotation": 111.83, "width": 36, "height": 76 }
-		},
-		"right shoulder": {
-			"right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 }
-		},
-		"right upper leg": {
-			"right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.69, "y": 2.13, "rotation": 97.49, "width": 34, "height": 63 }
-		},
-		"torso": {
-			"torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 }
-		},
-		"undie straps": {
-			"undie straps": { "name": "goblingirl/undie-straps", "x": -1.51, "y": 14.18, "width": 55, "height": 19 }
-		},
-		"undies": {
-			"undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.7, "width": 36, "height": 29 }
-		}
-	}
-},
-"animations": {
-	"walk": {
-		"slots": {
-			"eyes": {
-				"attachment": [
-					{ "time": 0.7, "name": "eyes closed" },
-					{ "time": 0.8, "name": null }
-				]
-			}
-		},
-		"bones": {
-			"left upper leg": {
-				"rotate": [
-					{ "time": 0, "angle": -26.55 },
-					{ "time": 0.1333, "angle": -8.78 },
-					{ "time": 0.2333, "angle": 9.51 },
-					{ "time": 0.3666, "angle": 30.74 },
-					{ "time": 0.5, "angle": 25.33 },
-					{ "time": 0.6333, "angle": 26.11 },
-					{ "time": 0.7333, "angle": 7.45 },
-					{ "time": 0.8666, "angle": -21.19 },
-					{ "time": 1, "angle": -26.55 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.32, "y": 1.7 },
-					{ "time": 0.3666, "x": -0.06, "y": 2.42 },
-					{ "time": 1, "x": -1.32, "y": 1.7 }
-				]
-			},
-			"right upper leg": {
-				"rotate": [
-					{ "time": 0, "angle": 42.45 },
-					{
-						"time": 0.1333,
-						"angle": 49.86,
-						"curve": [ 0.414, 0, 0.705, 0.99 ]
-					},
-					{ "time": 0.2333, "angle": 22.51 },
-					{ "time": 0.5, "angle": -16.93 },
-					{ "time": 0.6333, "angle": 1.89 },
-					{
-						"time": 0.7333,
-						"angle": 34.86,
-						"curve": [ 0.462, 0.11, 1, 1 ]
-					},
-					{
-						"time": 0.8666,
-						"angle": 58.68,
-						"curve": [ 0.5, 0.02, 1, 1 ]
-					},
-					{ "time": 1, "angle": 42.45 }
-				],
-				"translate": [
-					{ "time": 0, "x": 6.23, "y": 0 },
-					{ "time": 0.2333, "x": 2.14, "y": 2.4 },
-					{ "time": 0.5, "x": 2.44, "y": 4.8 },
-					{ "time": 1, "x": 6.23, "y": 0 }
-				]
-			},
-			"left lower leg": {
-				"rotate": [
-					{ "time": 0, "angle": -18.05 },
-					{ "time": 0.1333, "angle": -63.5 },
-					{ "time": 0.2333, "angle": -83.01 },
-					{ "time": 0.5, "angle": 5.11 },
-					{ "time": 0.6333, "angle": -28.29 },
-					{ "time": 0.7333, "angle": -27.52 },
-					{ "time": 0.8666, "angle": 3.53 },
-					{ "time": 1, "angle": -18.05 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.2333, "x": 2.55, "y": -0.47 },
-					{ "time": 0.5, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 1, "x": 0, "y": 0 }
-				]
-			},
-			"left foot": {
-				"rotate": [
-					{ "time": 0, "angle": -14.56 },
-					{ "time": 0.1333, "angle": -10.42 },
-					{ "time": 0.2333, "angle": -5.01 },
-					{ "time": 0.3, "angle": 6.67 },
-					{ "time": 0.3666, "angle": 3.87 },
-					{ "time": 0.5, "angle": -3.87 },
-					{ "time": 0.6333, "angle": 2.78 },
-					{ "time": 0.7333, "angle": -11.99 },
-					{ "time": 0.8666, "angle": -12.45 },
-					{ "time": 1, "angle": -14.56 }
-				]
-			},
-			"right shoulder": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 5.29,
-						"curve": [ 0.264, 0, 0.75, 1 ]
-					},
-					{ "time": 0.6333, "angle": 6.65 },
-					{ "time": 1, "angle": 5.29 }
-				]
-			},
-			"right arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -4.02,
-						"curve": [ 0.267, 0, 0.804, 0.99 ]
-					},
-					{
-						"time": 0.6333,
-						"angle": 19.78,
-						"curve": [ 0.307, 0, 0.787, 0.99 ]
-					},
-					{ "time": 1, "angle": -4.02 }
-				]
-			},
-			"right hand": {
-				"rotate": [
-					{ "time": 0, "angle": 8.98 },
-					{ "time": 0.6333, "angle": 0.51 },
-					{ "time": 1, "angle": 8.98 }
-				]
-			},
-			"left shoulder": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 6.25,
-						"curve": [ 0.339, 0, 0.683, 1 ]
-					},
-					{
-						"time": 0.5,
-						"angle": -11.78,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
-					},
-					{ "time": 1, "angle": 6.25 }
-				],
-				"translate": [
-					{ "time": 0, "x": 1.15, "y": 0.23 }
-				]
-			},
-			"left hand": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -21.23,
-						"curve": [ 0.295, 0, 0.755, 0.98 ]
-					},
-					{
-						"time": 0.5,
-						"angle": -27.28,
-						"curve": [ 0.241, 0, 0.75, 0.97 ]
-					},
-					{ "time": 1, "angle": -21.23 }
-				]
-			},
-			"left arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 28.37,
-						"curve": [ 0.339, 0, 0.683, 1 ]
-					},
-					{
-						"time": 0.5,
-						"angle": 60.09,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
-					},
-					{ "time": 1, "angle": 28.37 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -10.28 },
-					{
-						"time": 0.1333,
-						"angle": -15.38,
-						"curve": [ 0.545, 0, 0.818, 1 ]
-					},
-					{
-						"time": 0.3666,
-						"angle": -9.78,
-						"curve": [ 0.58, 0.17, 0.669, 0.99 ]
-					},
-					{
-						"time": 0.6333,
-						"angle": -15.75,
-						"curve": [ 0.235, 0.01, 0.795, 1 ]
-					},
-					{
-						"time": 0.8666,
-						"angle": -7.06,
-						"curve": [ 0.209, 0, 0.816, 0.98 ]
-					},
-					{ "time": 1, "angle": -10.28 }
-				],
-				"translate": [
-					{ "time": 0, "x": -3.72, "y": -0.01 }
-				]
-			},
-			"right foot": {
-				"rotate": [
-					{ "time": 0, "angle": -5.25 },
-					{ "time": 0.2333, "angle": -17.76 },
-					{ "time": 0.3666, "angle": -20.09 },
-					{ "time": 0.5, "angle": -19.73 },
-					{ "time": 0.7333, "angle": -11.68 },
-					{ "time": 0.8, "angle": 4.46 },
-					{ "time": 0.8666, "angle": 0.46 },
-					{ "time": 1, "angle": -5.25 }
-				]
-			},
-			"right lower leg": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -3.39,
-						"curve": [ 0.316, 0.01, 0.741, 0.98 ]
-					},
-					{
-						"time": 0.1333,
-						"angle": -43.21,
-						"curve": [ 0.414, 0, 0.705, 0.99 ]
-					},
-					{ "time": 0.2333, "angle": -25.98 },
-					{ "time": 0.5, "angle": -19.53 },
-					{ "time": 0.6333, "angle": -64.8 },
-					{
-						"time": 0.7333,
-						"angle": -89.54,
-						"curve": [ 0.557, 0.18, 1, 1 ]
-					},
-					{ "time": 1, "angle": -3.39 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.6333, "x": 2.18, "y": 0.21 },
-					{ "time": 1, "x": 0, "y": 0 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 1, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": -8.4 },
-					{
-						"time": 0.1333,
-						"x": 0,
-						"y": -9.35,
-						"curve": [ 0.326, 0.05, 0.674, 0.93 ]
-					},
-					{
-						"time": 0.2333,
-						"x": 0,
-						"y": -0.59,
-						"curve": [ 0.325, 0.39, 0.643, 0.7 ]
-					},
-					{ "time": 0.3666, "x": 0, "y": -3.96 },
-					{ "time": 0.5, "x": 0, "y": -8.4 },
-					{
-						"time": 0.6333,
-						"x": 0,
-						"y": -10,
-						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
-					},
-					{
-						"time": 0.7333,
-						"x": 0,
-						"y": -5.29,
-						"curve": [ 0.333, 0.36, 0.662, 0.69 ]
-					},
-					{
-						"time": 0.8,
-						"x": 0,
-						"y": -2.49,
-						"curve": [ 0.322, 0.35, 0.651, 0.68 ]
-					},
-					{ "time": 0.8666, "x": 0, "y": -3.96 },
-					{ "time": 1, "x": 0, "y": -8.4 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 3.6 },
-					{ "time": 0.1333, "angle": 17.49 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
-					{ "time": 0.5, "angle": 5.17 },
-					{ "time": 0.6333, "angle": 18.36 },
-					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
-					{ "time": 1, "angle": 3.6 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 3.6,
-						"curve": [ 0, 0, 0.704, 1.17 ]
-					},
-					{ "time": 0.1333, "angle": -0.2 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
-					{
-						"time": 0.5,
-						"angle": 5.17,
-						"curve": [ 0, 0, 0.704, 1.61 ]
-					},
-					{ "time": 0.6666, "angle": 1.1 },
-					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
-					{ "time": 1, "angle": 3.6 }
-				]
-			},
-			"pelvis": {
-				"rotate": [
-					{ "time": 0, "angle": -1.33 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0.39, "y": -0.78 }
-				]
-			},
-			"spear1": {
-				"rotate": [
-					{ "time": 0, "angle": 1.84 },
-					{ "time": 0.2, "angle": -5.38 },
-					{ "time": 0.5, "angle": 2.95 },
-					{ "time": 0.7333, "angle": -3.67 },
-					{ "time": 1, "angle": 1.84 }
-				]
-			},
-			"spear2": {
-				"rotate": [
-					{ "time": 0, "angle": 1.84 },
-					{ "time": 0.2, "angle": -5.38 },
-					{ "time": 0.5, "angle": 2.95 },
-					{ "time": 0.7333, "angle": -3.67 },
-					{ "time": 1, "angle": 1.84 }
-				]
-			},
-			"spear3": {
-				"rotate": [
-					{ "time": 0, "angle": 3.64 },
-					{ "time": 0.2, "angle": -3.59 },
-					{ "time": 0.5, "angle": 4.74 },
-					{ "time": 0.7333, "angle": -1.87 },
-					{ "time": 1, "angle": 3.64 }
-				]
-			}
-		},
-		"ffd": {
-			"default": {
-				"left hand item": {
-					"spear": [
-						{ "time": 0 }
-					]
-				},
-				"right hand item": {
-					"dagger": [
-						{
-							"time": 0,
-							"offset": 26,
-							"vertices": [ 2.34, 0.14 ],
-							"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 ],
-							"curve": [ 0.25, 0, 0.75, 1 ]
-						},
-						{
-							"time": 1,
-							"offset": 26,
-							"vertices": [ 2.34, 0.14 ]
-						}
-					]
-				}
-			},
-			"goblin": {
-				"head": {
-					"head": [
-						{
-							"time": 0,
-							"curve": [ 0.632, 0, 0.75, 1 ]
-						},
-						{
-							"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 ],
-							"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 ],
-							"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 ],
-							"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 ],
-							"curve": [ 0.25, 0, 0.75, 1 ]
-						},
-						{ "time": 1 }
-					]
-				},
-				"left foot": {
-					"left foot": [
-						{
-							"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 ]
-						},
-						{ "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 ]
-						},
-						{
-							"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 ]
-						},
-						{ "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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						}
-					]
-				},
-				"pelvis": {
-					"pelvis": [
-						{ "time": 0 },
-						{
-							"time": 0.1333,
-							"offset": 6,
-							"vertices": [ -0.68, -4.13 ]
-						},
-						{
-							"time": 0.3333,
-							"offset": 6,
-							"vertices": [ -1.04, -3.1 ]
-						},
-						{
-							"time": 0.7,
-							"offset": 6,
-							"vertices": [ -1.42, -6.3 ]
-						},
-						{
-							"time": 0.8666,
-							"offset": 6,
-							"vertices": [ -1.13, -1.79 ]
-						},
-						{ "time": 1 }
-					]
-				},
-				"right foot": {
-					"right foot": [
-						{ "time": 0 },
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{ "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 ]
-						},
-						{
-							"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 ]
-						},
-						{ "time": 0.8666 }
-					]
-				},
-				"right hand": {
-					"right hand": [
-						{
-							"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 ]
-						},
-						{ "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 ]
-						}
-					]
-				},
-				"right lower leg": {
-					"right lower leg": [
-						{ "time": 0 },
-						{
-							"time": 0.6,
-							"offset": 6,
-							"vertices": [ 1.8, -1.56 ]
-						},
-						{ "time": 1 }
-					]
-				},
-				"right upper leg": {
-					"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 ]
-						},
-						{ "time": 0.3333 },
-						{
-							"time": 0.8666,
-							"offset": 14,
-							"vertices": [ 0.13, -2.35, -1.33, -5.99, -1.35, -4.43 ]
-						},
-						{
-							"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 ]
-						}
-					]
-				},
-				"torso": {
-					"torso": [
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						}
-					]
-				},
-				"undie straps": {
-					"undie straps": [
-						{
-							"time": 0,
-							"offset": 2,
-							"vertices": [ -1.77, 0.54, -0.96, -1.03, -0.39, -0.24, -1.77, 0.54 ]
-						},
-						{
-							"time": 0.1333,
-							"offset": 2,
-							"vertices": [ -2.25, -1.03, -1.49, -4.23, -0.74, -2.84, -1.9, 0.54 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"time": 0.7,
-							"offset": 2,
-							"vertices": [ -0.91, -2.76, -0.62, -3.63, -0.84, -2.26, -2.56, 0.52 ]
-						},
-						{
-							"time": 0.8666,
-							"offset": 2,
-							"vertices": [ -2.56, 0.52, -1.58, 0.32, -1.38, 0.32, -2.56, 0.52 ]
-						},
-						{
-							"time": 1,
-							"offset": 2,
-							"vertices": [ -1.77, 0.54, -0.8, 0.53, -0.8, 0.53, -1.77, 0.54 ]
-						}
-					]
-				},
-				"undies": {
-					"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						}
-					]
-				}
-			}
-		}
-	}
-}
-}

+ 0 - 2412
spine-cocos2dx/3.1/example/Resources/common/spineboy.json

@@ -1,2412 +0,0 @@
-{
-"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": "front_bracer",
-		"parent": "front_upper_arm",
-		"length": 40.57,
-		"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" }
-],
-"slots": [
-	{ "name": "rear_upper_arm", "bone": "rear_upper_arm", "attachment": "rear_upper_arm" },
-	{ "name": "rear_bracer", "bone": "rear_bracer", "attachment": "rear_bracer" },
-	{ "name": "gun", "bone": "gun", "attachment": "gun" },
-	{ "name": "rear_foot", "bone": "rear_foot", "attachment": "rear_foot" },
-	{ "name": "rear_thigh", "bone": "rear_thigh", "attachment": "rear_thigh" },
-	{ "name": "rear_shin", "bone": "rear_shin", "attachment": "rear_shin" },
-	{ "name": "neck", "bone": "neck", "attachment": "neck" },
-	{ "name": "torso", "bone": "torso", "attachment": "torso" },
-	{ "name": "front_upper_arm", "bone": "front_upper_arm", "attachment": "front_upper_arm" },
-	{ "name": "head", "bone": "head", "attachment": "head" },
-	{ "name": "eye", "bone": "head", "attachment": "eye_indifferent" },
-	{ "name": "front_thigh", "bone": "front_thigh", "attachment": "front_thigh" },
-	{ "name": "front_foot", "bone": "front_foot", "attachment": "front_foot" },
-	{ "name": "front_shin", "bone": "front_shin", "attachment": "front_shin" },
-	{ "name": "mouth", "bone": "head", "attachment": "mouth_smile" },
-	{ "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 }
-],
-"skins": {
-	"default": {
-		"eye": {
-			"eye_indifferent": { "x": 85.72, "y": -28.18, "rotation": -70.63, "width": 93, "height": 89 },
-			"eye_surprised": { "x": 85.72, "y": -28.18, "rotation": -70.63, "width": 93, "height": 89 }
-		},
-		"front_bracer": {
-			"front_bracer": { "x": 12.03, "y": -1.67, "rotation": 79.59, "width": 58, "height": 80 }
-		},
-		"front_fist": {
-			"front_fist_closed": { "x": 35.49, "y": 6, "rotation": 67.16, "width": 75, "height": 82 },
-			"front_fist_open": { "x": 39.56, "y": 7.76, "rotation": 67.16, "width": 86, "height": 87 }
-		},
-		"front_foot": {
-			"front_foot": { "x": 29.51, "y": 7.83, "rotation": 18.68, "width": 126, "height": 69 },
-			"front_foot_bend1": { "x": 29.51, "y": 7.83, "rotation": 18.68, "width": 128, "height": 70 },
-			"front_foot_bend2": { "x": 16.07, "y": 13.83, "rotation": 18.68, "width": 108, "height": 93 }
-		},
-		"front_shin": {
-			"front_shin": { "x": 55.11, "y": -3.54, "rotation": 96.59, "width": 82, "height": 184 }
-		},
-		"front_thigh": {
-			"front_thigh": { "x": 42.47, "y": 4.44, "rotation": 84.86, "width": 48, "height": 112 }
-		},
-		"front_upper_arm": {
-			"front_upper_arm": { "x": 28.3, "y": 7.37, "rotation": 97.89, "width": 54, "height": 97 }
-		},
-		"goggles": {
-			"goggles": { "x": 97.07, "y": 6.54, "rotation": -70.63, "width": 261, "height": 166 }
-		},
-		"gun": {
-			"gun": { "x": 77.3, "y": 16.4, "rotation": 60.82, "width": 210, "height": 203 }
-		},
-		"head": {
-			"head": { "x": 128.95, "y": 0.29, "rotation": -70.63, "width": 271, "height": 298 }
-		},
-		"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 },
-			"mouth_smile": { "x": 23.68, "y": -32.23, "rotation": -70.63, "width": 93, "height": 59 }
-		},
-		"muzzle": {
-			"muzzle": { "x": 18.25, "y": 5.44, "rotation": 0.15, "width": 462, "height": 400 }
-		},
-		"neck": {
-			"neck": { "x": 9.76, "y": -3.01, "rotation": -55.22, "width": 36, "height": 41 }
-		},
-		"rear_bracer": {
-			"rear_bracer": { "x": 11.15, "y": -2.2, "rotation": 66.17, "width": 56, "height": 72 }
-		},
-		"rear_foot": {
-			"rear_foot": { "x": 31.51, "y": 3.57, "rotation": 23.07, "width": 113, "height": 60 },
-			"rear_foot_bend1": { "x": 34.39, "y": 4.8, "rotation": 23.07, "width": 117, "height": 66 },
-			"rear_foot_bend2": { "x": 30.38, "y": 12.62, "rotation": 23.07, "width": 103, "height": 83 }
-		},
-		"rear_shin": {
-			"rear_shin": { "x": 58.29, "y": -2.75, "rotation": 92.37, "width": 75, "height": 178 }
-		},
-		"rear_thigh": {
-			"rear_thigh": { "x": 33.1, "y": -4.11, "rotation": 72.54, "width": 65, "height": 104 }
-		},
-		"rear_upper_arm": {
-			"rear_upper_arm": { "x": 21.12, "y": 4.08, "rotation": 89.32, "width": 47, "height": 87 }
-		},
-		"torso": {
-			"torso": { "x": 63.61, "y": 7.12, "rotation": -94.53, "width": 98, "height": 180 }
-		}
-	}
-},
-"events": {
-	"footstep": {},
-	"headAttach": { "int": 3, "float": 4 },
-	"headBehind": { "int": 5, "float": 6, "string": "setup" },
-	"headPop": { "int": 1, "float": 2 }
-},
-"animations": {
-	"death": {
-		"slots": {
-			"eye": {
-				"attachment": [
-					{ "time": 0, "name": "eye_surprised" },
-					{ "time": 0.4666, "name": "eye_indifferent" },
-					{ "time": 2.2333, "name": "eye_surprised" },
-					{ "time": 4.5333, "name": "eye_indifferent" }
-				]
-			},
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_oooo" },
-					{ "time": 2.2333, "name": "mouth_grind" },
-					{ "time": 4.5333, "name": "mouth_oooo" }
-				]
-			}
-		},
-		"bones": {
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": -2.82 },
-					{ "time": 0.1333, "angle": -28.74 },
-					{ "time": 0.2333, "angle": 11.42 },
-					{ "time": 0.3333, "angle": -50.24 },
-					{ "time": 0.4, "angle": -72.66, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -72.66 },
-					{ "time": 0.5, "angle": -20.24 },
-					{ "time": 0.5666, "angle": -85.28, "curve": "stepped" },
-					{ "time": 0.9333, "angle": -85.28, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -85.28 },
-					{ "time": 2.5, "angle": -51.96, "curve": "stepped" },
-					{ "time": 4.5333, "angle": -51.96 },
-					{ "time": 4.6666, "angle": -85.28 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": -2.82 },
-					{ "time": 0.1333, "angle": 12.35 },
-					{ "time": 0.2333, "angle": 29.89 },
-					{ "time": 0.3, "angle": 70.36 },
-					{ "time": 0.4, "angle": -10.22, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -10.22 },
-					{ "time": 0.5, "angle": 2.92 },
-					{ "time": 0.5666, "angle": 47.94, "curve": "stepped" },
-					{ "time": 2.2333, "angle": 47.94 },
-					{ "time": 2.5, "angle": 18.5, "curve": "stepped" },
-					{ "time": 4.5333, "angle": 18.5 },
-					{ "time": 4.6666, "angle": 47.94 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -8.61 },
-					{ "time": 0.1333, "angle": 28.19 },
-					{ "time": 0.2666, "angle": -280.19 },
-					{ "time": 0.4, "angle": -237.22, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -237.22 },
-					{ "time": 0.5, "angle": 76.03, "curve": "stepped" },
-					{ "time": 0.8, "angle": 76.03, "curve": "stepped" },
-					{ "time": 0.9333, "angle": 76.03, "curve": "stepped" },
-					{ "time": 2.2333, "angle": 76.03 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 2.2333, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -38.85 },
-					{ "time": 0.1333, "angle": -299.58 },
-					{ "time": 0.2666, "angle": -244.74 },
-					{ "time": 0.4, "angle": -292.35 },
-					{ "time": 0.4333, "angle": -315.84 },
-					{ "time": 0.5, "angle": -347.94 },
-					{ "time": 0.7, "angle": -347.33, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -347.33 },
-					{ "time": 2.7, "angle": -290.68 },
-					{ "time": 2.7666, "angle": -285.1 },
-					{ "time": 4.6666, "angle": -290.68 },
-					{ "time": 4.8, "angle": 8.61 },
-					{ "time": 4.8666, "angle": 10.94 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -44.69 },
-					{ "time": 0.1333, "angle": 112.26 },
-					{ "time": 0.2666, "angle": 129.07 },
-					{ "time": 0.4, "angle": 134.94, "curve": "stepped" },
-					{ "time": 0.4333, "angle": 134.94 },
-					{ "time": 0.5666, "angle": 172.6, "curve": "stepped" },
-					{ "time": 0.9333, "angle": 172.6, "curve": "stepped" },
-					{ "time": 2.2333, "angle": 172.6 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 21.88 },
-					{ "time": 0.1333, "angle": 11.48 },
-					{ "time": 0.2666, "angle": -18.81 },
-					{ "time": 0.4, "angle": -18.92 },
-					{ "time": 0.4333, "angle": -18.28 },
-					{ "time": 0.5, "angle": 60.61 },
-					{ "time": 0.7, "angle": -18.87, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -18.87 },
-					{ "time": 2.7, "angle": -1.95, "curve": "stepped" },
-					{ "time": 4.6666, "angle": -1.95 },
-					{ "time": 4.8, "angle": 34.55 },
-					{ "time": 4.9333, "angle": -18.74 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": -2.33 },
-					{ "time": 0.2666, "angle": 26.34 },
-					{ "time": 0.7, "angle": -6.07, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -6.07 },
-					{ "time": 2.7, "angle": 5.72, "curve": "stepped" },
-					{ "time": 4.6666, "angle": 5.72 },
-					{ "time": 4.8666, "angle": -6.52 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 10.36 },
-					{ "time": 0.1333, "angle": -23.12 },
-					{ "time": 0.2666, "angle": -23.11 },
-					{ "time": 0.4, "angle": -23.16, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -23.16 },
-					{ "time": 0.5666, "angle": -23.2, "curve": "stepped" },
-					{ "time": 0.9333, "angle": -23.2, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -23.2 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": -2.78 },
-					{ "time": 0.1333, "angle": -24.58 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 0.9333, "angle": 0, "curve": "stepped" },
-					{ "time": 2.2333, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.2, "x": 50.34, "y": 151.73 },
-					{ "time": 0.4, "x": 5.16, "y": -119.64, "curve": "stepped" },
-					{ "time": 0.4333, "x": 5.16, "y": -119.64 },
-					{ "time": 0.5, "x": 50.34, "y": -205.18, "curve": "stepped" },
-					{ "time": 0.8, "x": 50.34, "y": -205.18, "curve": "stepped" },
-					{ "time": 0.9333, "x": 50.34, "y": -205.18, "curve": "stepped" },
-					{ "time": 2.2333, "x": 50.34, "y": -205.18 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": 8.47 },
-					{ "time": 0.2666, "angle": 115.95 },
-					{ "time": 0.4, "angle": 180.66, "curve": "stepped" },
-					{ "time": 0.4333, "angle": 180.66 },
-					{ "time": 0.5, "angle": 155.22 },
-					{ "time": 0.6, "angle": 97.73 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": -27.37 },
-					{ "time": 0.2666, "angle": -35.1 },
-					{ "time": 0.4, "angle": -37.72, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -37.72 },
-					{ "time": 0.5, "angle": -40.06 },
-					{ "time": 0.6, "angle": 2.76 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": 70.45 },
-					{ "time": 0.2666, "angle": 155.34 },
-					{ "time": 0.4, "angle": 214.31, "curve": "stepped" },
-					{ "time": 0.4333, "angle": 214.31 },
-					{ "time": 0.5, "angle": 169.67 },
-					{ "time": 0.8, "angle": 83.27 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": 18.93 },
-					{ "time": 0.2666, "angle": -21.04 },
-					{ "time": 0.4, "angle": -29.93, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -29.93 },
-					{ "time": 0.5, "angle": -16.79 },
-					{ "time": 0.8, "angle": 7.77 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": -11.62 },
-					{ "time": 0.4, "angle": -45.59, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -45.59 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.4, "angle": -48.75, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -48.75 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"gunTip": {
-				"rotate": [
-					{ "time": 0, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			}
-		}
-	},
-	"hit": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0.1666, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_grind" },
-					{ "time": 0.3333, "name": "mouth_smile" }
-				]
-			}
-		},
-		"bones": {
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": 56.42 },
-					{ "time": 0.3333, "angle": 8.89 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 35.38 },
-					{ "time": 0.2333, "angle": 24.94 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 10.21 },
-					{ "time": 0.3333, "angle": -41.3 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -310.92,
-						"curve": [ 0.38, 0.53, 0.744, 1 ]
-					},
-					{ "time": 0.3333, "angle": -112.59 }
-				],
-				"translate": [
-					{ "time": 0, "x": 7.23, "y": -13.13 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 36.99 },
-					{ "time": 0.3333, "angle": -28.64 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": 13.59 },
-					{ "time": 0.3333, "angle": 7.55 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 271.02,
-						"curve": [ 0.342, 0.36, 0.68, 0.71 ]
-					},
-					{ "time": 0.3333, "angle": -15.84 }
-				],
-				"translate": [
-					{ "time": 0.3333, "x": -0.09, "y": -0.46 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.3333, "angle": 40.03 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": 14.98 },
-					{ "time": 0.3333, "angle": 39.75 }
-				]
-			},
-			"hip": {
-				"translate": [
-					{ "time": 0, "x": -75.54, "y": -78.03 },
-					{ "time": 0.2333, "x": -36.48, "y": 12.42 },
-					{ "time": 0.3333, "x": -36.48, "y": -2.99 }
-				]
-			},
-			"front_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 90.94,
-						"curve": [ 0.227, 0.26, 0.432, 1 ]
-					},
-					{ "time": 0.3333, "angle": 32.02 }
-				],
-				"translate": [
-					{ "time": 0, "x": 7.21, "y": -4 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 40.51,
-						"curve": [ 0.295, 0.3, 0.59, 0.99 ]
-					},
-					{ "time": 0.3333, "angle": 90.76 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.96, "y": -0.32 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{ "time": 0, "angle": -96.62 },
-					{ "time": 0.3333, "angle": -15.13 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 7.99 },
-					{ "time": 0.3333, "angle": -67.54 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 5.4 },
-					{ "time": 0.3333, "angle": -16.26 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 2.67 },
-					{ "time": 0.3333, "angle": -10.31 }
-				]
-			}
-		}
-	},
-	"idle": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_open" },
-					{ "time": 1.6666, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_smile" },
-					{ "time": 1.6666, "name": "mouth_smile" }
-				]
-			}
-		},
-		"bones": {
-			"torso": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -5.61,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.8333,
-						"angle": -9.65,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -5.61 }
-				],
-				"translate": [
-					{ "time": 0, "x": -6.49, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -59.85,
-						"curve": [ 0.492, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -54.31,
-						"curve": [ 0.324, 0.11, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -59.85 }
-				],
-				"translate": [
-					{ "time": 0, "x": -7.12, "y": -8.23 },
-					{ "time": 0.6666, "x": -6.32, "y": -8.3 },
-					{ "time": 1.6666, "x": -7.12, "y": -8.23 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 62.41,
-						"curve": [ 0.504, 0.02, 0.75, 1 ]
-					},
-					{
-						"time": 0.7333,
-						"angle": 43.83,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": 62.41 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.83, "y": -16.78 },
-					{ "time": 0.6666, "x": 0.34, "y": -15.23 },
-					{ "time": 1.6666, "x": -1.83, "y": -16.78 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": 2.39 },
-					{ "time": 1.6666, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.88, "y": -4.76, "curve": "stepped" },
-					{ "time": 1.6666, "x": -1.88, "y": -4.76 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 0.64,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -4.34,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": 0.64 }
-				],
-				"translate": [
-					{ "time": 0, "x": -13.39, "y": 6.69, "curve": "stepped" },
-					{ "time": 1.6666, "x": -13.39, "y": 6.69 }
-				],
-				"scale": [
-					{
-						"time": 0,
-						"x": 0.896,
-						"y": 1,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 0.825,
-						"y": 1,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "x": 0.896, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{ "time": 0, "angle": -19.28, "curve": "stepped" },
-					{ "time": 1.6666, "angle": -19.28 }
-				],
-				"scale": [
-					{
-						"time": 0,
-						"x": 1,
-						"y": 1,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 0.994,
-						"y": 1,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 30.5,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 40.15,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": 30.5 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -23.83,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -43.77,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": -23.83 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 5.13,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 10.04,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": 5.13 }
-				],
-				"scale": [
-					{ "time": 0, "x": 0.755, "y": 1.309, "curve": "stepped" },
-					{ "time": 1.6666, "x": 0.755, "y": 1.309 }
-				]
-			},
-			"hip": {
-				"translate": [
-					{
-						"time": 0,
-						"x": -6.63,
-						"y": -23.01,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 6.27,
-						"y": -35,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "x": -6.63, "y": -23.01 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -7.34,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 3.85,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": -7.34 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -17.16,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 12.52,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -17.16 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -5.51,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -3.12,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -5.51 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 45.46,
-						"curve": [ 0.492, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 41.33,
-						"curve": [ 0.32, 0.1, 0.736, 0.91 ]
-					},
-					{ "time": 1.6666, "angle": 45.46 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 0,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -15.59,
-						"curve": [ 0.732, 0, 0.769, 0.99 ]
-					},
-					{ "time": 1.6666, "angle": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -6.84,
-						"curve": [ 0.492, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -14.63,
-						"curve": [ 0.324, 0.11, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -6.84 }
-				],
-				"scale": [
-					{
-						"time": 0,
-						"x": 1,
-						"y": 1,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 0.689,
-						"y": 1.1,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			}
-		}
-	},
-	"jump": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_open" },
-					{ "time": 0.2, "name": "front_fist_closed" },
-					{ "time": 0.6666, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_grind" }
-				]
-			},
-			"torso": {
-				"attachment": [
-					{ "time": 0, "name": "torso" }
-				]
-			}
-		},
-		"bones": {
-			"front_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 91.53,
-						"curve": [ 0.278, 0.46, 0.763, 1 ]
-					},
-					{
-						"time": 0.2,
-						"angle": -35.83,
-						"curve": [ 0.761, 0, 0.75, 1 ]
-					},
-					{ "time": 0.4333, "angle": 127.74 },
-					{
-						"time": 0.7333,
-						"angle": 48.18,
-						"curve": [ 0.227, 0.26, 0.432, 1 ]
-					},
-					{ "time": 0.8333, "angle": 25.35 },
-					{ "time": 0.9333, "angle": 45.37 },
-					{ "time": 1.0333, "angle": 38.12 },
-					{ "time": 1.1333, "angle": 25.35 },
-					{ "time": 1.3333, "angle": 91.53 }
-				],
-				"translate": [
-					{ "time": 0, "x": -2.56, "y": 5.77 },
-					{ "time": 0.4333, "x": 8.3, "y": 7.98 },
-					{ "time": 0.7333, "x": 7.21, "y": -4 },
-					{ "time": 1.3333, "x": -2.56, "y": 5.77 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -42.63 },
-					{ "time": 0.2, "angle": -5.74 },
-					{ "time": 0.4333, "angle": -50.76 },
-					{ "time": 0.7333, "angle": 1.89 },
-					{ "time": 0.8333, "angle": 11.58 },
-					{ "time": 0.9666, "angle": -1.89 },
-					{ "time": 1.1333, "angle": 11.58 },
-					{ "time": 1.3333, "angle": -42.63 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": -26.32 },
-					{ "time": 0.2, "angle": 121.44 },
-					{ "time": 0.4333, "angle": 70.54 },
-					{
-						"time": 0.7333,
-						"angle": 79.89,
-						"curve": [ 0.295, 0.3, 0.59, 0.99 ]
-					},
-					{ "time": 0.8333, "angle": 99.12 },
-					{ "time": 0.9333, "angle": 74.05 },
-					{ "time": 1.0333, "angle": 98.04 },
-					{ "time": 1.1333, "angle": 99.12 },
-					{ "time": 1.3333, "angle": -26.32 }
-				],
-				"translate": [
-					{ "time": 0, "x": -0.56, "y": -0.32 },
-					{ "time": 0.4333, "x": -8.5, "y": 10.58 },
-					{ "time": 0.7333, "x": -1.96, "y": -0.32 },
-					{ "time": 1.3333, "x": -0.56, "y": -0.32 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": -78.69 },
-					{ "time": 0.4333, "angle": -55.56 },
-					{ "time": 0.7333, "angle": -62.84 },
-					{ "time": 0.8333, "angle": -80.74 },
-					{ "time": 0.9333, "angle": -41.12 },
-					{ "time": 1.0333, "angle": -77.4 },
-					{ "time": 1.1333, "angle": -80.74 },
-					{ "time": 1.3333, "angle": -78.69 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.7333, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -22.61 },
-					{ "time": 0.2, "angle": -246.68 },
-					{
-						"time": 0.6,
-						"angle": 11.28,
-						"curve": [ 0.246, 0, 0.633, 0.53 ]
-					},
-					{
-						"time": 0.7333,
-						"angle": -57.45,
-						"curve": [ 0.38, 0.53, 0.744, 1 ]
-					},
-					{ "time": 0.8666, "angle": -112.59 },
-					{ "time": 0.9333, "angle": -102.17 },
-					{ "time": 1.0333, "angle": -108.61 },
-					{ "time": 1.1333, "angle": -112.59 },
-					{ "time": 1.3333, "angle": -22.61 }
-				],
-				"translate": [
-					{ "time": 0, "x": 6.08, "y": 7.15 },
-					{ "time": 0.2, "x": 7.23, "y": -13.13, "curve": "stepped" },
-					{ "time": 0.7333, "x": 7.23, "y": -13.13 },
-					{ "time": 1.3333, "x": 6.08, "y": 7.15 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 66.46 },
-					{ "time": 0.2, "angle": 42.39 },
-					{ "time": 0.4333, "angle": 26.06 },
-					{ "time": 0.7333, "angle": 13.28 },
-					{ "time": 0.8666, "angle": -28.64 },
-					{ "time": 0.9333, "angle": -22.31 },
-					{ "time": 1.0333, "angle": -35.39 },
-					{ "time": 1.1333, "angle": -28.64 },
-					{ "time": 1.3333, "angle": 66.46 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": -28.43 },
-					{ "time": 0.4333, "angle": -45.6 },
-					{ "time": 0.7333, "angle": -53.66 },
-					{ "time": 0.8666, "angle": 7.55 },
-					{ "time": 0.9333, "angle": 31.15 },
-					{ "time": 1.0333, "angle": -32.58 },
-					{ "time": 1.1333, "angle": 7.55 },
-					{ "time": 1.3333, "angle": -28.43 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": 39.68 },
-					{ "time": 0.2, "angle": 276.57 },
-					{ "time": 0.3, "angle": 17.73 },
-					{ "time": 0.4333, "angle": 83.38 },
-					{
-						"time": 0.6,
-						"angle": -4.71,
-						"curve": [ 0.246, 0, 0.633, 0.53 ]
-					},
-					{
-						"time": 0.7333,
-						"angle": -69.63,
-						"curve": [ 0.342, 0.36, 0.68, 0.71 ]
-					},
-					{
-						"time": 0.7666,
-						"angle": 321.47,
-						"curve": [ 0.333, 0.33, 0.667, 0.66 ]
-					},
-					{
-						"time": 0.8,
-						"angle": 33.7,
-						"curve": [ 0.358, 0.64, 0.693, 1 ]
-					},
-					{ "time": 0.8666, "angle": 34.56 },
-					{ "time": 1.0333, "angle": 71.96 },
-					{ "time": 1.1333, "angle": 34.56 },
-					{ "time": 1.3333, "angle": 39.68 }
-				],
-				"translate": [
-					{ "time": 0, "x": -3.1, "y": -4.86 },
-					{ "time": 0.2, "x": 23.33, "y": 49.07 },
-					{ "time": 0.4333, "x": 20.78, "y": 40.21 },
-					{ "time": 1.3333, "x": -3.1, "y": -4.86 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 29.66 },
-					{ "time": 0.2, "angle": 45.06 },
-					{ "time": 0.4333, "angle": -4.34 },
-					{ "time": 0.7666, "angle": 61.68 },
-					{ "time": 0.8, "angle": 82.59 },
-					{ "time": 0.8666, "angle": 80.06 },
-					{ "time": 1.0333, "angle": 57.56 },
-					{ "time": 1.1333, "angle": 80.06 },
-					{ "time": 1.3333, "angle": 29.66 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 24.9 },
-					{ "time": 0.2, "angle": 16.31 },
-					{ "time": 0.4333, "angle": 7.44 },
-					{ "time": 0.7333, "angle": -20.35 },
-					{ "time": 0.8333, "angle": -0.69, "curve": "stepped" },
-					{ "time": 1.1333, "angle": -0.69 },
-					{ "time": 1.3333, "angle": 24.9 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 24.92 },
-					{ "time": 0.2, "angle": 10.36 },
-					{ "time": 0.4333, "angle": 28.65 },
-					{ "time": 0.7333, "angle": -2.65 },
-					{ "time": 0.8333, "angle": -28.94, "curve": "stepped" },
-					{ "time": 1.1333, "angle": -28.94 },
-					{ "time": 1.3333, "angle": 24.92 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": -34.51,
-						"y": -78.62,
-						"curve": [ 0.232, 1, 0.75, 1 ]
-					},
-					{
-						"time": 0.2,
-						"x": -34.51,
-						"y": 182.5,
-						"curve": [ 0.232, 0.48, 0.598, 0.79 ]
-					},
-					{
-						"time": 0.7666,
-						"x": -34.51,
-						"y": 596.22,
-						"curve": [ 0.329, 0.17, 0.66, 0.21 ]
-					},
-					{ "time": 1.1333, "x": -34.51, "y": 2.49 },
-					{ "time": 1.3333, "x": -34.51, "y": -78.62 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -90.62,
-						"curve": [ 0.416, 0.54, 0.743, 1 ]
-					},
-					{
-						"time": 0.2,
-						"angle": -10.52,
-						"curve": [ 0.644, 0, 0.75, 1 ]
-					},
-					{ "time": 0.4333, "angle": -127.72 },
-					{ "time": 0.7333, "angle": -19.91 },
-					{ "time": 0.8333, "angle": -5.16 },
-					{ "time": 0.9333, "angle": -35.06 },
-					{ "time": 1.0333, "angle": -43.97 },
-					{ "time": 1.1333, "angle": -5.16 },
-					{ "time": 1.3333, "angle": -90.62 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": -0.79 },
-					{ "time": 0.0333, "angle": 16.27 },
-					{ "time": 0.0666, "angle": 23.52 },
-					{ "time": 0.1, "angle": 21.02 },
-					{ "time": 0.1333, "angle": 10.92 },
-					{ "time": 0.2, "angle": -38.45 },
-					{ "time": 0.4333, "angle": 6.62 },
-					{ "time": 0.7333, "angle": -11.51 },
-					{ "time": 1.0333, "angle": -22.91 },
-					{ "time": 1.3333, "angle": -0.79 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": -12.77 },
-					{ "time": 0.2, "angle": 17.05 },
-					{ "time": 0.4333, "angle": 19.45 },
-					{ "time": 0.7333, "angle": 2.67 },
-					{ "time": 1.0333, "angle": -28.49 },
-					{ "time": 1.3333, "angle": -12.77 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": 6.18 },
-					{ "time": 0.2, "angle": 30.81 },
-					{ "time": 0.4333, "angle": 13.25 },
-					{ "time": 0.7333, "angle": 14.98 },
-					{ "time": 0.7666, "angle": 25.64 },
-					{ "time": 0.8, "angle": 20.62 },
-					{ "time": 0.8666, "angle": 64.52 },
-					{ "time": 1.0333, "angle": 8.59 },
-					{ "time": 1.1333, "angle": 64.52 },
-					{ "time": 1.3333, "angle": 6.18 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			}
-		}
-	},
-	"run": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_closed" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_grind" }
-				]
-			},
-			"torso": {
-				"attachment": [
-					{ "time": 0, "name": "torso" }
-				]
-			}
-		},
-		"bones": {
-			"front_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 42.05,
-						"curve": [ 0.195, 0.86, 0.75, 1 ]
-					},
-					{ "time": 0.0666, "angle": 46.07 },
-					{ "time": 0.1333, "angle": -20.28 },
-					{ "time": 0.2, "angle": -27.23 },
-					{ "time": 0.2666, "angle": -47.16 },
-					{ "time": 0.3333, "angle": -39.79 },
-					{ "time": 0.4, "angle": -25.86 },
-					{ "time": 0.4666, "angle": 14.35 },
-					{ "time": 0.5333, "angle": 55.62 },
-					{ "time": 0.6, "angle": 69.65 },
-					{ "time": 0.6666, "angle": 86.4 },
-					{ "time": 0.7333, "angle": 65.87 },
-					{ "time": 0.8, "angle": 42.05 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.0333, "x": -5.79, "y": 11.15 },
-					{ "time": 0.0666, "x": -5.13, "y": 11.55 },
-					{ "time": 0.1333, "x": -7.7, "y": 8.98 },
-					{ "time": 0.5333, "x": -1.26, "y": 3.83 },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -39.7 },
-					{ "time": 0.2, "angle": -57.29 },
-					{ "time": 0.4, "angle": -39.7 },
-					{ "time": 0.6, "angle": -57.29 },
-					{ "time": 0.8, "angle": -39.7 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": -56.59 },
-					{ "time": 0.0666, "angle": -21.57 },
-					{ "time": 0.1333, "angle": 27.95 },
-					{ "time": 0.2, "angle": 42.42 },
-					{ "time": 0.2666, "angle": 62.37 },
-					{ "time": 0.3333, "angle": 45.42 },
-					{ "time": 0.4, "angle": 15.67 },
-					{ "time": 0.4666, "angle": 28.22 },
-					{ "time": 0.5333, "angle": -38.62 },
-					{ "time": 0.6, "angle": -53.26 },
-					{ "time": 0.6666, "angle": -79.31 },
-					{ "time": 0.7333, "angle": -86.47 },
-					{ "time": 0.8, "angle": -56.59 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.4, "x": -6.76, "y": -3.86 },
-					{ "time": 0.4333, "x": -15.85, "y": 7.28 },
-					{ "time": 0.4666, "x": -13.04, "y": 4.04 },
-					{ "time": 0.5, "x": -10.24, "y": 7.11 },
-					{ "time": 0.5333, "x": -9.01, "y": -5.15 },
-					{ "time": 0.6666, "x": -23.18, "y": -2.57 },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": -74 },
-					{ "time": 0.0666, "angle": -83.38 },
-					{ "time": 0.1333, "angle": -106.69 },
-					{ "time": 0.2, "angle": -66.01 },
-					{ "time": 0.2666, "angle": -55.22 },
-					{ "time": 0.3333, "angle": -24.8 },
-					{
-						"time": 0.4,
-						"angle": 18.44,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.4666, "angle": -56.65 },
-					{
-						"time": 0.5333,
-						"angle": -11.94,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.6666, "angle": -41.26 },
-					{ "time": 0.7333, "angle": -43.6 },
-					{ "time": 0.8, "angle": -74 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -89.36 },
-					{ "time": 0.0666, "angle": -95.67 },
-					{ "time": 0.1333, "angle": -22 },
-					{ "time": 0.2, "angle": -316.04 },
-					{ "time": 0.2666, "angle": -274.94 },
-					{ "time": 0.3333, "angle": -273.74 },
-					{ "time": 0.4, "angle": -272.09 },
-					{ "time": 0.4666, "angle": -264.89 },
-					{ "time": 0.5333, "angle": -320.09 },
-					{ "time": 0.6, "angle": -50.83 },
-					{ "time": 0.6666, "angle": -81.72 },
-					{ "time": 0.7333, "angle": -83.92 },
-					{ "time": 0.8, "angle": -89.36 }
-				],
-				"translate": [
-					{ "time": 0, "x": 6.24, "y": 10.05 },
-					{ "time": 0.2666, "x": 4.95, "y": -13.13 },
-					{ "time": 0.6, "x": -2.43, "y": 1.94 },
-					{ "time": 0.8, "x": 6.24, "y": 10.05 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 33.43 },
-					{ "time": 0.0666, "angle": 20.53 },
-					{ "time": 0.1333, "angle": 15.26 },
-					{ "time": 0.2, "angle": 19.28 },
-					{ "time": 0.2666, "angle": 22.62 },
-					{ "time": 0.3333, "angle": 37.29 },
-					{ "time": 0.4, "angle": 41.53 },
-					{ "time": 0.4666, "angle": 31.73 },
-					{ "time": 0.5333, "angle": 67.45 },
-					{ "time": 0.6666, "angle": 39.77 },
-					{ "time": 0.7333, "angle": 30.95 },
-					{ "time": 0.8, "angle": 33.43 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": -19.75 },
-					{ "time": 0.0666, "angle": -37.11 },
-					{ "time": 0.1333, "angle": -50.79 },
-					{ "time": 0.2666, "angle": -12.69 },
-					{ "time": 0.3333, "angle": 3.01 },
-					{ "time": 0.4333, "angle": 12.05 },
-					{ "time": 0.5333, "angle": 13.25 },
-					{ "time": 0.8, "angle": -19.75 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": 68.68 },
-					{ "time": 0.0666, "angle": 73.89 },
-					{ "time": 0.1333, "angle": -9.64 },
-					{ "time": 0.2, "angle": 284.27 },
-					{ "time": 0.2666, "angle": 283.29 },
-					{ "time": 0.3333, "angle": 278.28 },
-					{ "time": 0.4, "angle": 271.02 },
-					{ "time": 0.4666, "angle": 263.2 },
-					{ "time": 0.5333, "angle": 314.25 },
-					{ "time": 0.6, "angle": 16.83 },
-					{ "time": 0.6666, "angle": 70.35 },
-					{ "time": 0.7333, "angle": 73.53 },
-					{ "time": 0.8, "angle": 68.68 }
-				],
-				"translate": [
-					{ "time": 0, "x": -2.57, "y": -8.89 },
-					{ "time": 0.1333, "x": -4.68, "y": 7.2 },
-					{ "time": 0.2, "x": 21.73, "y": 51.17 },
-					{ "time": 0.6, "x": 4.33, "y": 2.05 },
-					{ "time": 0.8, "x": -2.57, "y": -8.89 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 31.04 },
-					{ "time": 0.0666, "angle": 28.28 },
-					{ "time": 0.1333, "angle": 49.36 },
-					{ "time": 0.2, "angle": 59.37 },
-					{ "time": 0.2666, "angle": 8.56 },
-					{ "time": 0.3333, "angle": 9.38 },
-					{ "time": 0.4, "angle": 11.51 },
-					{ "time": 0.4666, "angle": 7.22 },
-					{ "time": 0.5333, "angle": -18.44 },
-					{ "time": 0.6, "angle": 11.44 },
-					{ "time": 0.6666, "angle": 9.99 },
-					{ "time": 0.7333, "angle": 8.28 },
-					{ "time": 0.8, "angle": 31.04 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 11.03 },
-					{ "time": 0.2, "angle": 13.58 },
-					{ "time": 0.4, "angle": 11.03 },
-					{ "time": 0.6, "angle": 13.58 },
-					{ "time": 0.8, "angle": 11.03 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 11.03 },
-					{ "time": 0.1, "angle": 12.34 },
-					{ "time": 0.2, "angle": 25.55 },
-					{ "time": 0.4, "angle": 11.03 },
-					{ "time": 0.5, "angle": 12.34 },
-					{ "time": 0.6, "angle": 25.55 },
-					{ "time": 0.8, "angle": 11.03 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": -62.47, "y": -23.1 },
-					{
-						"time": 0.0666,
-						"x": -62.47,
-						"y": -38.51,
-						"curve": [ 0.244, 0.04, 0.75, 1 ]
-					},
-					{
-						"time": 0.2666,
-						"x": -62.47,
-						"y": 22.28,
-						"curve": [ 0.17, 0.52, 0.75, 1 ]
-					},
-					{ "time": 0.4, "x": -62.47, "y": -23.1 },
-					{ "time": 0.4333, "x": -62.47, "y": -24.59 },
-					{
-						"time": 0.4666,
-						"x": -62.47,
-						"y": -43.29,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.6666, "x": -62.47, "y": 22.28 },
-					{ "time": 0.8, "x": -62.47, "y": -23.1 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 0,
-						"curve": [ 0.481, 0.01, 0.75, 1 ]
-					},
-					{ "time": 0.0666, "angle": -64.42 },
-					{
-						"time": 0.1333,
-						"angle": -20.59,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.2666, "angle": -62.51 },
-					{ "time": 0.3333, "angle": -79.74 },
-					{ "time": 0.4, "angle": -78.28 },
-					{
-						"time": 0.4666,
-						"angle": -118.96,
-						"curve": [ 0.93, 0, 0.952, 0.95 ]
-					},
-					{ "time": 0.6, "angle": -88.95 },
-					{ "time": 0.6666, "angle": -79.09 },
-					{ "time": 0.7333, "angle": -47.77 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{
-						"time": 0.0333,
-						"angle": -21.13,
-						"curve": [ 0.121, 0.23, 0.75, 1 ]
-					},
-					{ "time": 0.0666, "angle": 17.64 },
-					{ "time": 0.1, "angle": 29.92 },
-					{ "time": 0.1333, "angle": 16.44 },
-					{ "time": 0.2, "angle": -29.22 },
-					{ "time": 0.2666, "angle": -1.61 },
-					{ "time": 0.3333, "angle": -10.22 },
-					{ "time": 0.4666, "angle": -15.99 },
-					{ "time": 0.6, "angle": 9.03 },
-					{ "time": 0.7333, "angle": 17.32 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.0666, "angle": -12.04 },
-					{ "time": 0.1333, "angle": -0.87 },
-					{ "time": 0.2, "angle": 25.81 },
-					{ "time": 0.2666, "angle": 4.71 },
-					{
-						"time": 0.4,
-						"angle": 18.09,
-						"curve": [ 0.281, 0.73, 0.75, 1 ]
-					},
-					{ "time": 0.4333, "angle": -1.7 },
-					{ "time": 0.4666, "angle": 27.12 },
-					{ "time": 0.5, "angle": 38.83 },
-					{ "time": 0.5333, "angle": 30.76 },
-					{ "time": 0.5666, "angle": -20.49 },
-					{ "time": 0.6, "angle": -30.8 },
-					{ "time": 0.6666, "angle": -1.31 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": 24.72 },
-					{ "time": 0.5, "angle": -11.87 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			}
-		},
-		"events": [
-			{ "time": 0, "name": "footstep" },
-			{ "time": 0.4, "name": "footstep", "int": 1 }
-		]
-	},
-	"shoot": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0.1333, "name": "front_fist_closed" },
-					{ "time": 0.4, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0.1333, "name": "mouth_grind" }
-				]
-			},
-			"muzzle": {
-				"attachment": [
-					{ "time": 0.1333, "name": "muzzle" },
-					{ "time": 0.2666, "name": null }
-				],
-				"color": [
-					{
-						"time": 0.1333,
-						"color": "ffffff00",
-						"curve": [ 0.118, 0.99, 0.75, 1 ]
-					},
-					{
-						"time": 0.1666,
-						"color": "ffffffff",
-						"curve": [ 0.821, 0, 0.909, 0.89 ]
-					},
-					{ "time": 0.2666, "color": "ffffff00" }
-				]
-			}
-		},
-		"bones": {
-			"front_fist": {
-				"scale": [
-					{ "time": 0.1333, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.4, "x": 1, "y": 1 }
-				]
-			},
-			"gunTip": {
-				"translate": [
-					{ "time": 0.1333, "x": 0, "y": 0 },
-					{ "time": 0.2, "x": 20.93, "y": 1.57 }
-				],
-				"scale": [
-					{ "time": 0.1333, "x": 1, "y": 1 },
-					{ "time": 0.2, "x": 1.247, "y": 1.516 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": 1.9 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": 7.95,
-						"y": 5.84,
-						"curve": [ 0, 0.3, 0.678, 1 ]
-					},
-					{ "time": 0.3, "x": -9.3, "y": -1.41 },
-					{ "time": 0.4, "x": 0, "y": 0 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": -30.47 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": 0,
-						"y": 0,
-						"curve": [ 0, 0.3, 0.678, 1 ]
-					},
-					{ "time": 0.3, "x": -5.99, "y": -3.71 },
-					{ "time": 0.4, "x": 0, "y": 0 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": 62.3 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": 0,
-						"y": 0,
-						"curve": [ 0, 0.3, 0.678, 1 ]
-					},
-					{ "time": 0.3, "x": 2.81, "y": 11.41 },
-					{ "time": 0.4, "x": 0, "y": 0 }
-				]
-			}
-		}
-	},
-	"test": {
-		"slots": {
-			"front_foot": {
-				"color": [
-					{ "time": 0.6666, "color": "ffffffff" },
-					{ "time": 1.3333, "color": "ff0700ff" }
-				]
-			},
-			"gun": {
-				"color": [
-					{ "time": 0, "color": "ffffffff", "curve": "stepped" },
-					{ "time": 0.6666, "color": "ffffffff" },
-					{ "time": 1.3333, "color": "32ff00ff" }
-				]
-			},
-			"rear_foot": {
-				"color": [
-					{ "time": 0.6666, "color": "ffffffff" },
-					{ "time": 1.3333, "color": "ff0700ff" }
-				]
-			}
-		},
-		"bones": {
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.3333, "angle": -20.72 },
-					{ "time": 0.6666, "angle": -32.41 },
-					{ "time": 1, "angle": -5.3 },
-					{ "time": 1.3333, "angle": 24.96 },
-					{ "time": 1.6666, "angle": 15.61 },
-					{ "time": 2, "angle": 0 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": 0,
-						"y": 0,
-						"curve": [ 0.172, 0.37, 0.574, 0.73 ]
-					},
-					{
-						"time": 0.1666,
-						"x": 144.19,
-						"y": -77.59,
-						"curve": [ 0.372, 0.61, 0.765, 1 ]
-					},
-					{
-						"time": 0.3333,
-						"x": 217.61,
-						"y": -192.63,
-						"curve": [ 0.282, 0, 0.624, 0.31 ]
-					},
-					{
-						"time": 0.5,
-						"x": 181.21,
-						"y": -365.66,
-						"curve": [ 0.313, 0.21, 0.654, 0.54 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 20.09,
-						"y": -500.4,
-						"curve": [ 0.147, 0.27, 0.75, 1 ]
-					},
-					{ "time": 0.8333, "x": -194.24, "y": -341.84 },
-					{ "time": 1, "x": -307.93, "y": -114 },
-					{
-						"time": 1.1666,
-						"x": -330.38,
-						"y": 121.42,
-						"curve": [ 0.25, 0, 0.764, 0.48 ]
-					},
-					{
-						"time": 1.3333,
-						"x": -240.42,
-						"y": 335.66,
-						"curve": [ 0.229, 0.37, 0.58, 0.73 ]
-					},
-					{
-						"time": 1.5,
-						"x": -56.12,
-						"y": 288.06,
-						"curve": [ 0.296, 0.6, 0.641, 1 ]
-					},
-					{
-						"time": 1.6666,
-						"x": 87.63,
-						"y": 191.33,
-						"curve": [ 0.238, 0, 0.626, 0.39 ]
-					},
-					{
-						"time": 1.8333,
-						"x": 60.62,
-						"y": 95.14,
-						"curve": [ 0.41, 0.26, 0.803, 0.62 ]
-					},
-					{ "time": 2, "x": 0, "y": 0 }
-				]
-			}
-		},
-		"draworder": [
-			{
-				"time": 0.6666,
-				"offsets": [
-					{ "slot": "head", "offset": -9 },
-					{ "slot": "eye", "offset": -9 },
-					{ "slot": "mouth", "offset": -12 },
-					{ "slot": "goggles", "offset": -12 }
-				]
-			},
-			{ "time": 1.3333 }
-		],
-		"events": [
-			{ "time": 0, "name": "headPop", "int": 0, "float": 0, "string": "pop.wav" },
-			{ "time": 1, "name": "headBehind", "int": 7, "float": 8, "string": "animate" },
-			{ "time": 2, "name": "headAttach", "int": 0, "float": 0, "string": "attach.wav" }
-		]
-	},
-	"walk": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_closed" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_smile" }
-				]
-			},
-			"torso": {
-				"attachment": [
-					{ "time": 0, "name": "torso" }
-				]
-			}
-		},
-		"bones": {
-			"front_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": 15.79 },
-					{ "time": 0.1, "angle": 27.39 },
-					{ "time": 0.2, "angle": -7.94 },
-					{ "time": 0.3, "angle": -16.94 },
-					{ "time": 0.4, "angle": -28.62 },
-					{ "time": 0.5, "angle": -19.3 },
-					{ "time": 0.6, "angle": -3.08 },
-					{ "time": 0.7, "angle": 29.51 },
-					{ "time": 0.8, "angle": 15.79 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.4, "x": -1.18, "y": 0.54 },
-					{ "time": 0.5, "x": 0.11, "y": 0.41 },
-					{ "time": 0.6, "x": 9.48, "y": 0.27 },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.4, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 5.12 },
-					{ "time": 0.1, "angle": -20.87 },
-					{ "time": 0.2, "angle": 13.37 },
-					{ "time": 0.3, "angle": 15.98 },
-					{ "time": 0.4, "angle": 5.94 },
-					{ "time": 0.5, "angle": -26.76 },
-					{ "time": 0.7, "angle": -55.44 },
-					{ "time": 0.8, "angle": 5.12 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": -34.38 },
-					{ "time": 0.1, "angle": -30.32 },
-					{ "time": 0.2, "angle": -37.22 },
-					{ "time": 0.3, "angle": 20.73 },
-					{ "time": 0.4, "angle": 8.69 },
-					{ "time": 0.5, "angle": 12.16 },
-					{ "time": 0.6, "angle": -24.62 },
-					{ "time": 0.7, "angle": -27.26 },
-					{ "time": 0.8, "angle": -34.38 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.4, "x": 4.08, "y": -9.53 },
-					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.7, "x": -21.14, "y": -9.6 },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 14.26 },
-					{ "time": 0.1, "angle": -17.3 },
-					{ "time": 0.2, "angle": -12.67 },
-					{ "time": 0.3, "angle": -58.89 },
-					{ "time": 0.4, "angle": 15.95 },
-					{ "time": 0.5, "angle": -9 },
-					{ "time": 0.6, "angle": 26.06 },
-					{ "time": 0.7, "angle": 21.85 },
-					{ "time": 0.8, "angle": 14.26 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.1, "x": 0.951, "y": 1 },
-					{ "time": 0.5, "x": 0.975, "y": 1 },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 10.13 },
-					{ "time": 0.1, "angle": 12.27 },
-					{ "time": 0.2, "angle": -2.94 },
-					{ "time": 0.3, "angle": 6.29 },
-					{ "time": 0.4, "angle": 13.45 },
-					{ "time": 0.5, "angle": -3.57 },
-					{ "time": 0.6, "angle": -0.97 },
-					{ "time": 0.7, "angle": 2.97 },
-					{ "time": 0.8, "angle": 10.13 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -23.74 },
-					{ "time": 0.4, "angle": -320.57 },
-					{ "time": 0.8, "angle": -23.74 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": 11.62 },
-					{ "time": 0.1, "angle": 19.36 },
-					{ "time": 0.4, "angle": 345.26 },
-					{ "time": 0.5, "angle": 343.44 },
-					{ "time": 0.8, "angle": 11.62 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -12.11 },
-					{ "time": 0.1666, "angle": -17.16 },
-					{ "time": 0.4, "angle": -12.11 },
-					{ "time": 0.5666, "angle": -15.81 },
-					{ "time": 0.8, "angle": -12.11 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 1.41 },
-					{ "time": 0.2333, "angle": -3.04 },
-					{ "time": 0.4, "angle": 1.41 },
-					{ "time": 0.6333, "angle": -3.04 },
-					{ "time": 0.8, "angle": 1.41 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 6.97 },
-					{ "time": 0.1666, "angle": 8.02 },
-					{ "time": 0.2666, "angle": 12.65 },
-					{ "time": 0.4, "angle": 6.97 },
-					{ "time": 0.5666, "angle": 8.02 },
-					{ "time": 0.6666, "angle": 12.65 },
-					{ "time": 0.8, "angle": 6.97 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": -23.93,
-						"y": 3.22,
-						"curve": [ 0.518, 0.03, 0.807, 0.61 ]
-					},
-					{
-						"time": 0.1,
-						"x": -23.93,
-						"y": -9.24,
-						"curve": [ 0.135, 0.33, 0.601, 0.99 ]
-					},
-					{
-						"time": 0.2,
-						"x": -23.93,
-						"y": 4.35,
-						"curve": [ 0.204, 0.68, 0.75, 1 ]
-					},
-					{
-						"time": 0.3,
-						"x": -23.93,
-						"y": 2.38,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.4,
-						"x": -23.93,
-						"y": -2.5,
-						"curve": [ 0.692, 0.01, 0.75, 1 ]
-					},
-					{
-						"time": 0.5,
-						"x": -23.93,
-						"y": -10.32,
-						"curve": [ 0.235, 0.77, 0.75, 1 ]
-					},
-					{
-						"time": 0.6,
-						"x": -23.93,
-						"y": 4.35,
-						"curve": [ 0.287, 0.37, 0.718, 0.76 ]
-					},
-					{
-						"time": 0.7,
-						"x": -23.93,
-						"y": 10.34,
-						"curve": [ 0.615, 0, 0.75, 1 ]
-					},
-					{ "time": 0.8, "x": -23.93, "y": 3.22 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.4, "angle": 20.59 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 12.49 },
-					{ "time": 0.1, "angle": -8.34 },
-					{ "time": 0.2, "angle": -6.17 },
-					{ "time": 0.3, "angle": -0.75 },
-					{ "time": 0.3333, "angle": 3.89 },
-					{ "time": 0.4, "angle": 10.22 },
-					{ "time": 0.5, "angle": 11.44 },
-					{ "time": 0.6, "angle": -0.33 },
-					{ "time": 0.7, "angle": 0.15 },
-					{ "time": 0.8, "angle": 12.49 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 3.58 },
-					{ "time": 0.1, "angle": 5.51 },
-					{ "time": 0.4, "angle": -22.77 },
-					{ "time": 0.5, "angle": -9.65 },
-					{ "time": 0.8, "angle": 3.58 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": -15.22 },
-					{ "time": 0.1, "angle": -51.4 },
-					{ "time": 0.4, "angle": -39.4 },
-					{ "time": 0.5, "angle": 19.26 },
-					{ "time": 0.8, "angle": -15.22 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -24.06,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.1,
-						"angle": -10.94,
-						"curve": [ 0.381, 0.54, 0.742, 1 ]
-					},
-					{
-						"time": 0.4,
-						"angle": 25.34,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -27.47,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.8, "angle": -24.06 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			}
-		}
-	}
-}
-}

二进制
spine-cocos2dx/3.1/example/Resources/common/sprite.png


+ 0 - 292
spine-cocos2dx/3.1/example/Resources/ipad-retina/goblins-ffd.atlas

@@ -1,292 +0,0 @@
-
-goblins-ffd.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-dagger
-  rotate: false
-  xy: 2, 28
-  size: 26, 108
-  orig: 26, 108
-  offset: 0, 0
-  index: -1
-goblin/eyes-closed
-  rotate: false
-  xy: 137, 29
-  size: 34, 12
-  orig: 34, 12
-  offset: 0, 0
-  index: -1
-goblin/head
-  rotate: false
-  xy: 26, 357
-  size: 103, 66
-  orig: 103, 66
-  offset: 0, 0
-  index: -1
-goblin/left-arm
-  rotate: false
-  xy: 30, 28
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblin/left-foot
-  rotate: false
-  xy: 134, 260
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblin/left-hand
-  rotate: false
-  xy: 69, 25
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/left-lower-leg
-  rotate: false
-  xy: 134, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblin/left-shoulder
-  rotate: false
-  xy: 137, 43
-  size: 29, 44
-  orig: 29, 44
-  offset: 0, 0
-  index: -1
-goblin/left-upper-leg
-  rotate: false
-  xy: 30, 65
-  size: 33, 73
-  orig: 33, 73
-  offset: 0, 0
-  index: -1
-goblin/neck
-  rotate: false
-  xy: 201, 387
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/pelvis
-  rotate: false
-  xy: 26, 140
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblin/right-arm
-  rotate: false
-  xy: 171, 84
-  size: 23, 50
-  orig: 23, 50
-  offset: 0, 0
-  index: -1
-goblin/right-foot
-  rotate: false
-  xy: 134, 225
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblin/right-hand
-  rotate: false
-  xy: 204, 258
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblin/right-lower-leg
-  rotate: false
-  xy: 201, 430
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblin/right-shoulder
-  rotate: false
-  xy: 130, 89
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblin/right-upper-leg
-  rotate: false
-  xy: 98, 214
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblin/torso
-  rotate: false
-  xy: 131, 410
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblin/undie-straps
-  rotate: false
-  xy: 2, 7
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblin/undies
-  rotate: false
-  xy: 199, 227
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-goblingirl/eyes-closed
-  rotate: false
-  xy: 59, 2
-  size: 37, 21
-  orig: 37, 21
-  offset: 0, 0
-  index: -1
-goblingirl/head
-  rotate: false
-  xy: 26, 425
-  size: 103, 81
-  orig: 103, 81
-  offset: 0, 0
-  index: -1
-goblingirl/left-arm
-  rotate: false
-  xy: 201, 190
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblingirl/left-foot
-  rotate: false
-  xy: 134, 192
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblingirl/left-hand
-  rotate: false
-  xy: 196, 109
-  size: 35, 40
-  orig: 35, 40
-  offset: 0, 0
-  index: -1
-goblingirl/left-lower-leg
-  rotate: false
-  xy: 169, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/left-shoulder
-  rotate: false
-  xy: 107, 30
-  size: 28, 46
-  orig: 28, 46
-  offset: 0, 0
-  index: -1
-goblingirl/left-upper-leg
-  rotate: false
-  xy: 65, 68
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/neck
-  rotate: false
-  xy: 204, 297
-  size: 35, 41
-  orig: 35, 41
-  offset: 0, 0
-  index: -1
-goblingirl/pelvis
-  rotate: false
-  xy: 131, 365
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblingirl/right-arm
-  rotate: false
-  xy: 100, 97
-  size: 28, 50
-  orig: 28, 50
-  offset: 0, 0
-  index: -1
-goblingirl/right-foot
-  rotate: false
-  xy: 134, 157
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblingirl/right-hand
-  rotate: false
-  xy: 199, 151
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblingirl/right-lower-leg
-  rotate: false
-  xy: 96, 279
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblingirl/right-shoulder
-  rotate: false
-  xy: 204, 340
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblingirl/right-upper-leg
-  rotate: false
-  xy: 98, 149
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblingirl/torso
-  rotate: false
-  xy: 26, 259
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblingirl/undie-straps
-  rotate: false
-  xy: 134, 136
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblingirl/undies
-  rotate: false
-  xy: 196, 78
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-shield
-  rotate: false
-  xy: 26, 185
-  size: 70, 72
-  orig: 70, 72
-  offset: 0, 0
-  index: -1
-spear
-  rotate: false
-  xy: 2, 138
-  size: 22, 368
-  orig: 22, 368
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.1/example/Resources/ipad-retina/goblins-ffd.png


+ 0 - 194
spine-cocos2dx/3.1/example/Resources/ipad-retina/spineboy.atlas

@@ -1,194 +0,0 @@
-
-spineboy.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-eye_indifferent
-  rotate: true
-  xy: 389, 5
-  size: 56, 53
-  orig: 56, 53
-  offset: 0, 0
-  index: -1
-eye_surprised
-  rotate: false
-  xy: 580, 34
-  size: 56, 53
-  orig: 56, 53
-  offset: 0, 0
-  index: -1
-front_bracer
-  rotate: false
-  xy: 732, 85
-  size: 35, 48
-  orig: 35, 48
-  offset: 0, 0
-  index: -1
-front_fist_closed
-  rotate: false
-  xy: 556, 91
-  size: 45, 49
-  orig: 45, 49
-  offset: 0, 0
-  index: -1
-front_fist_open
-  rotate: false
-  xy: 668, 32
-  size: 52, 52
-  orig: 52, 52
-  offset: 0, 0
-  index: -1
-front_foot
-  rotate: false
-  xy: 924, 201
-  size: 76, 41
-  orig: 76, 41
-  offset: 0, 0
-  index: -1
-front_foot_bend1
-  rotate: false
-  xy: 845, 200
-  size: 77, 42
-  orig: 77, 42
-  offset: 0, 0
-  index: -1
-front_foot_bend2
-  rotate: false
-  xy: 778, 186
-  size: 65, 56
-  orig: 65, 56
-  offset: 0, 0
-  index: -1
-front_shin
-  rotate: true
-  xy: 444, 91
-  size: 49, 110
-  orig: 49, 110
-  offset: 0, 0
-  index: -1
-front_thigh
-  rotate: true
-  xy: 603, 89
-  size: 29, 67
-  orig: 29, 67
-  offset: 0, 0
-  index: -1
-front_upper_arm
-  rotate: true
-  xy: 672, 86
-  size: 32, 58
-  orig: 32, 58
-  offset: 0, 0
-  index: -1
-goggles
-  rotate: false
-  xy: 444, 142
-  size: 157, 100
-  orig: 157, 100
-  offset: 0, 0
-  index: -1
-gun
-  rotate: false
-  xy: 603, 120
-  size: 126, 122
-  orig: 126, 122
-  offset: 0, 0
-  index: -1
-head
-  rotate: false
-  xy: 279, 63
-  size: 163, 179
-  orig: 163, 179
-  offset: 0, 0
-  index: -1
-mouth_grind
-  rotate: false
-  xy: 845, 163
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-mouth_oooo
-  rotate: false
-  xy: 842, 126
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-mouth_smile
-  rotate: false
-  xy: 769, 97
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-muzzle
-  rotate: false
-  xy: 2, 2
-  size: 275, 240
-  orig: 277, 240
-  offset: 0, 0
-  index: -1
-neck
-  rotate: false
-  xy: 903, 173
-  size: 22, 25
-  orig: 22, 25
-  offset: 0, 0
-  index: -1
-rear_bracer
-  rotate: false
-  xy: 722, 40
-  size: 34, 43
-  orig: 34, 43
-  offset: 0, 0
-  index: -1
-rear_foot
-  rotate: false
-  xy: 444, 11
-  size: 68, 36
-  orig: 68, 36
-  offset: 0, 0
-  index: -1
-rear_foot_bend1
-  rotate: false
-  xy: 444, 49
-  size: 70, 40
-  orig: 70, 40
-  offset: 0, 0
-  index: -1
-rear_foot_bend2
-  rotate: false
-  xy: 778, 134
-  size: 62, 50
-  orig: 62, 50
-  offset: 0, 0
-  index: -1
-rear_shin
-  rotate: false
-  xy: 731, 135
-  size: 45, 107
-  orig: 45, 107
-  offset: 0, 0
-  index: -1
-rear_thigh
-  rotate: true
-  xy: 516, 50
-  size: 39, 62
-  orig: 39, 62
-  offset: 0, 0
-  index: -1
-rear_upper_arm
-  rotate: false
-  xy: 638, 35
-  size: 28, 52
-  orig: 28, 52
-  offset: 0, 0
-  index: -1
-torso
-  rotate: true
-  xy: 279, 2
-  size: 59, 108
-  orig: 59, 108
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.1/example/Resources/ipad-retina/spineboy.png


+ 0 - 292
spine-cocos2dx/3.1/example/Resources/ipad/goblins-ffd.atlas

@@ -1,292 +0,0 @@
-
-goblins-ffd.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-dagger
-  rotate: false
-  xy: 2, 28
-  size: 26, 108
-  orig: 26, 108
-  offset: 0, 0
-  index: -1
-goblin/eyes-closed
-  rotate: false
-  xy: 137, 29
-  size: 34, 12
-  orig: 34, 12
-  offset: 0, 0
-  index: -1
-goblin/head
-  rotate: false
-  xy: 26, 357
-  size: 103, 66
-  orig: 103, 66
-  offset: 0, 0
-  index: -1
-goblin/left-arm
-  rotate: false
-  xy: 30, 28
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblin/left-foot
-  rotate: false
-  xy: 134, 260
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblin/left-hand
-  rotate: false
-  xy: 69, 25
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/left-lower-leg
-  rotate: false
-  xy: 134, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblin/left-shoulder
-  rotate: false
-  xy: 137, 43
-  size: 29, 44
-  orig: 29, 44
-  offset: 0, 0
-  index: -1
-goblin/left-upper-leg
-  rotate: false
-  xy: 30, 65
-  size: 33, 73
-  orig: 33, 73
-  offset: 0, 0
-  index: -1
-goblin/neck
-  rotate: false
-  xy: 201, 387
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/pelvis
-  rotate: false
-  xy: 26, 140
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblin/right-arm
-  rotate: false
-  xy: 171, 84
-  size: 23, 50
-  orig: 23, 50
-  offset: 0, 0
-  index: -1
-goblin/right-foot
-  rotate: false
-  xy: 134, 225
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblin/right-hand
-  rotate: false
-  xy: 204, 258
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblin/right-lower-leg
-  rotate: false
-  xy: 201, 430
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblin/right-shoulder
-  rotate: false
-  xy: 130, 89
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblin/right-upper-leg
-  rotate: false
-  xy: 98, 214
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblin/torso
-  rotate: false
-  xy: 131, 410
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblin/undie-straps
-  rotate: false
-  xy: 2, 7
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblin/undies
-  rotate: false
-  xy: 199, 227
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-goblingirl/eyes-closed
-  rotate: false
-  xy: 59, 2
-  size: 37, 21
-  orig: 37, 21
-  offset: 0, 0
-  index: -1
-goblingirl/head
-  rotate: false
-  xy: 26, 425
-  size: 103, 81
-  orig: 103, 81
-  offset: 0, 0
-  index: -1
-goblingirl/left-arm
-  rotate: false
-  xy: 201, 190
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblingirl/left-foot
-  rotate: false
-  xy: 134, 192
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblingirl/left-hand
-  rotate: false
-  xy: 196, 109
-  size: 35, 40
-  orig: 35, 40
-  offset: 0, 0
-  index: -1
-goblingirl/left-lower-leg
-  rotate: false
-  xy: 169, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/left-shoulder
-  rotate: false
-  xy: 107, 30
-  size: 28, 46
-  orig: 28, 46
-  offset: 0, 0
-  index: -1
-goblingirl/left-upper-leg
-  rotate: false
-  xy: 65, 68
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/neck
-  rotate: false
-  xy: 204, 297
-  size: 35, 41
-  orig: 35, 41
-  offset: 0, 0
-  index: -1
-goblingirl/pelvis
-  rotate: false
-  xy: 131, 365
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblingirl/right-arm
-  rotate: false
-  xy: 100, 97
-  size: 28, 50
-  orig: 28, 50
-  offset: 0, 0
-  index: -1
-goblingirl/right-foot
-  rotate: false
-  xy: 134, 157
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblingirl/right-hand
-  rotate: false
-  xy: 199, 151
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblingirl/right-lower-leg
-  rotate: false
-  xy: 96, 279
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblingirl/right-shoulder
-  rotate: false
-  xy: 204, 340
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblingirl/right-upper-leg
-  rotate: false
-  xy: 98, 149
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblingirl/torso
-  rotate: false
-  xy: 26, 259
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblingirl/undie-straps
-  rotate: false
-  xy: 134, 136
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblingirl/undies
-  rotate: false
-  xy: 196, 78
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-shield
-  rotate: false
-  xy: 26, 185
-  size: 70, 72
-  orig: 70, 72
-  offset: 0, 0
-  index: -1
-spear
-  rotate: false
-  xy: 2, 138
-  size: 22, 368
-  orig: 22, 368
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.1/example/Resources/ipad/goblins-ffd.png


+ 0 - 194
spine-cocos2dx/3.1/example/Resources/ipad/spineboy.atlas

@@ -1,194 +0,0 @@
-
-spineboy.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-eye_indifferent
-  rotate: true
-  xy: 389, 5
-  size: 56, 53
-  orig: 56, 53
-  offset: 0, 0
-  index: -1
-eye_surprised
-  rotate: false
-  xy: 580, 34
-  size: 56, 53
-  orig: 56, 53
-  offset: 0, 0
-  index: -1
-front_bracer
-  rotate: false
-  xy: 732, 85
-  size: 35, 48
-  orig: 35, 48
-  offset: 0, 0
-  index: -1
-front_fist_closed
-  rotate: false
-  xy: 556, 91
-  size: 45, 49
-  orig: 45, 49
-  offset: 0, 0
-  index: -1
-front_fist_open
-  rotate: false
-  xy: 668, 32
-  size: 52, 52
-  orig: 52, 52
-  offset: 0, 0
-  index: -1
-front_foot
-  rotate: false
-  xy: 924, 201
-  size: 76, 41
-  orig: 76, 41
-  offset: 0, 0
-  index: -1
-front_foot_bend1
-  rotate: false
-  xy: 845, 200
-  size: 77, 42
-  orig: 77, 42
-  offset: 0, 0
-  index: -1
-front_foot_bend2
-  rotate: false
-  xy: 778, 186
-  size: 65, 56
-  orig: 65, 56
-  offset: 0, 0
-  index: -1
-front_shin
-  rotate: true
-  xy: 444, 91
-  size: 49, 110
-  orig: 49, 110
-  offset: 0, 0
-  index: -1
-front_thigh
-  rotate: true
-  xy: 603, 89
-  size: 29, 67
-  orig: 29, 67
-  offset: 0, 0
-  index: -1
-front_upper_arm
-  rotate: true
-  xy: 672, 86
-  size: 32, 58
-  orig: 32, 58
-  offset: 0, 0
-  index: -1
-goggles
-  rotate: false
-  xy: 444, 142
-  size: 157, 100
-  orig: 157, 100
-  offset: 0, 0
-  index: -1
-gun
-  rotate: false
-  xy: 603, 120
-  size: 126, 122
-  orig: 126, 122
-  offset: 0, 0
-  index: -1
-head
-  rotate: false
-  xy: 279, 63
-  size: 163, 179
-  orig: 163, 179
-  offset: 0, 0
-  index: -1
-mouth_grind
-  rotate: false
-  xy: 845, 163
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-mouth_oooo
-  rotate: false
-  xy: 842, 126
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-mouth_smile
-  rotate: false
-  xy: 769, 97
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-muzzle
-  rotate: false
-  xy: 2, 2
-  size: 275, 240
-  orig: 277, 240
-  offset: 0, 0
-  index: -1
-neck
-  rotate: false
-  xy: 903, 173
-  size: 22, 25
-  orig: 22, 25
-  offset: 0, 0
-  index: -1
-rear_bracer
-  rotate: false
-  xy: 722, 40
-  size: 34, 43
-  orig: 34, 43
-  offset: 0, 0
-  index: -1
-rear_foot
-  rotate: false
-  xy: 444, 11
-  size: 68, 36
-  orig: 68, 36
-  offset: 0, 0
-  index: -1
-rear_foot_bend1
-  rotate: false
-  xy: 444, 49
-  size: 70, 40
-  orig: 70, 40
-  offset: 0, 0
-  index: -1
-rear_foot_bend2
-  rotate: false
-  xy: 778, 134
-  size: 62, 50
-  orig: 62, 50
-  offset: 0, 0
-  index: -1
-rear_shin
-  rotate: false
-  xy: 731, 135
-  size: 45, 107
-  orig: 45, 107
-  offset: 0, 0
-  index: -1
-rear_thigh
-  rotate: true
-  xy: 516, 50
-  size: 39, 62
-  orig: 39, 62
-  offset: 0, 0
-  index: -1
-rear_upper_arm
-  rotate: false
-  xy: 638, 35
-  size: 28, 52
-  orig: 28, 52
-  offset: 0, 0
-  index: -1
-torso
-  rotate: true
-  xy: 279, 2
-  size: 59, 108
-  orig: 59, 108
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.1/example/Resources/ipad/spineboy.png


+ 0 - 292
spine-cocos2dx/3.1/example/Resources/iphone-retina/goblins-ffd.atlas

@@ -1,292 +0,0 @@
-
-goblins-ffd.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-dagger
-  rotate: false
-  xy: 2, 28
-  size: 26, 108
-  orig: 26, 108
-  offset: 0, 0
-  index: -1
-goblin/eyes-closed
-  rotate: false
-  xy: 137, 29
-  size: 34, 12
-  orig: 34, 12
-  offset: 0, 0
-  index: -1
-goblin/head
-  rotate: false
-  xy: 26, 357
-  size: 103, 66
-  orig: 103, 66
-  offset: 0, 0
-  index: -1
-goblin/left-arm
-  rotate: false
-  xy: 30, 28
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblin/left-foot
-  rotate: false
-  xy: 134, 260
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblin/left-hand
-  rotate: false
-  xy: 69, 25
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/left-lower-leg
-  rotate: false
-  xy: 134, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblin/left-shoulder
-  rotate: false
-  xy: 137, 43
-  size: 29, 44
-  orig: 29, 44
-  offset: 0, 0
-  index: -1
-goblin/left-upper-leg
-  rotate: false
-  xy: 30, 65
-  size: 33, 73
-  orig: 33, 73
-  offset: 0, 0
-  index: -1
-goblin/neck
-  rotate: false
-  xy: 201, 387
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/pelvis
-  rotate: false
-  xy: 26, 140
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblin/right-arm
-  rotate: false
-  xy: 171, 84
-  size: 23, 50
-  orig: 23, 50
-  offset: 0, 0
-  index: -1
-goblin/right-foot
-  rotate: false
-  xy: 134, 225
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblin/right-hand
-  rotate: false
-  xy: 204, 258
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblin/right-lower-leg
-  rotate: false
-  xy: 201, 430
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblin/right-shoulder
-  rotate: false
-  xy: 130, 89
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblin/right-upper-leg
-  rotate: false
-  xy: 98, 214
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblin/torso
-  rotate: false
-  xy: 131, 410
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblin/undie-straps
-  rotate: false
-  xy: 2, 7
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblin/undies
-  rotate: false
-  xy: 199, 227
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-goblingirl/eyes-closed
-  rotate: false
-  xy: 59, 2
-  size: 37, 21
-  orig: 37, 21
-  offset: 0, 0
-  index: -1
-goblingirl/head
-  rotate: false
-  xy: 26, 425
-  size: 103, 81
-  orig: 103, 81
-  offset: 0, 0
-  index: -1
-goblingirl/left-arm
-  rotate: false
-  xy: 201, 190
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblingirl/left-foot
-  rotate: false
-  xy: 134, 192
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblingirl/left-hand
-  rotate: false
-  xy: 196, 109
-  size: 35, 40
-  orig: 35, 40
-  offset: 0, 0
-  index: -1
-goblingirl/left-lower-leg
-  rotate: false
-  xy: 169, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/left-shoulder
-  rotate: false
-  xy: 107, 30
-  size: 28, 46
-  orig: 28, 46
-  offset: 0, 0
-  index: -1
-goblingirl/left-upper-leg
-  rotate: false
-  xy: 65, 68
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/neck
-  rotate: false
-  xy: 204, 297
-  size: 35, 41
-  orig: 35, 41
-  offset: 0, 0
-  index: -1
-goblingirl/pelvis
-  rotate: false
-  xy: 131, 365
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblingirl/right-arm
-  rotate: false
-  xy: 100, 97
-  size: 28, 50
-  orig: 28, 50
-  offset: 0, 0
-  index: -1
-goblingirl/right-foot
-  rotate: false
-  xy: 134, 157
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblingirl/right-hand
-  rotate: false
-  xy: 199, 151
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblingirl/right-lower-leg
-  rotate: false
-  xy: 96, 279
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblingirl/right-shoulder
-  rotate: false
-  xy: 204, 340
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblingirl/right-upper-leg
-  rotate: false
-  xy: 98, 149
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblingirl/torso
-  rotate: false
-  xy: 26, 259
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblingirl/undie-straps
-  rotate: false
-  xy: 134, 136
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblingirl/undies
-  rotate: false
-  xy: 196, 78
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-shield
-  rotate: false
-  xy: 26, 185
-  size: 70, 72
-  orig: 70, 72
-  offset: 0, 0
-  index: -1
-spear
-  rotate: false
-  xy: 2, 138
-  size: 22, 368
-  orig: 22, 368
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.1/example/Resources/iphone-retina/goblins-ffd.png


+ 0 - 194
spine-cocos2dx/3.1/example/Resources/iphone-retina/spineboy.atlas

@@ -1,194 +0,0 @@
-
-spineboy.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-eye_indifferent
-  rotate: true
-  xy: 389, 5
-  size: 56, 53
-  orig: 56, 53
-  offset: 0, 0
-  index: -1
-eye_surprised
-  rotate: false
-  xy: 580, 34
-  size: 56, 53
-  orig: 56, 53
-  offset: 0, 0
-  index: -1
-front_bracer
-  rotate: false
-  xy: 732, 85
-  size: 35, 48
-  orig: 35, 48
-  offset: 0, 0
-  index: -1
-front_fist_closed
-  rotate: false
-  xy: 556, 91
-  size: 45, 49
-  orig: 45, 49
-  offset: 0, 0
-  index: -1
-front_fist_open
-  rotate: false
-  xy: 668, 32
-  size: 52, 52
-  orig: 52, 52
-  offset: 0, 0
-  index: -1
-front_foot
-  rotate: false
-  xy: 924, 201
-  size: 76, 41
-  orig: 76, 41
-  offset: 0, 0
-  index: -1
-front_foot_bend1
-  rotate: false
-  xy: 845, 200
-  size: 77, 42
-  orig: 77, 42
-  offset: 0, 0
-  index: -1
-front_foot_bend2
-  rotate: false
-  xy: 778, 186
-  size: 65, 56
-  orig: 65, 56
-  offset: 0, 0
-  index: -1
-front_shin
-  rotate: true
-  xy: 444, 91
-  size: 49, 110
-  orig: 49, 110
-  offset: 0, 0
-  index: -1
-front_thigh
-  rotate: true
-  xy: 603, 89
-  size: 29, 67
-  orig: 29, 67
-  offset: 0, 0
-  index: -1
-front_upper_arm
-  rotate: true
-  xy: 672, 86
-  size: 32, 58
-  orig: 32, 58
-  offset: 0, 0
-  index: -1
-goggles
-  rotate: false
-  xy: 444, 142
-  size: 157, 100
-  orig: 157, 100
-  offset: 0, 0
-  index: -1
-gun
-  rotate: false
-  xy: 603, 120
-  size: 126, 122
-  orig: 126, 122
-  offset: 0, 0
-  index: -1
-head
-  rotate: false
-  xy: 279, 63
-  size: 163, 179
-  orig: 163, 179
-  offset: 0, 0
-  index: -1
-mouth_grind
-  rotate: false
-  xy: 845, 163
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-mouth_oooo
-  rotate: false
-  xy: 842, 126
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-mouth_smile
-  rotate: false
-  xy: 769, 97
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-muzzle
-  rotate: false
-  xy: 2, 2
-  size: 275, 240
-  orig: 277, 240
-  offset: 0, 0
-  index: -1
-neck
-  rotate: false
-  xy: 903, 173
-  size: 22, 25
-  orig: 22, 25
-  offset: 0, 0
-  index: -1
-rear_bracer
-  rotate: false
-  xy: 722, 40
-  size: 34, 43
-  orig: 34, 43
-  offset: 0, 0
-  index: -1
-rear_foot
-  rotate: false
-  xy: 444, 11
-  size: 68, 36
-  orig: 68, 36
-  offset: 0, 0
-  index: -1
-rear_foot_bend1
-  rotate: false
-  xy: 444, 49
-  size: 70, 40
-  orig: 70, 40
-  offset: 0, 0
-  index: -1
-rear_foot_bend2
-  rotate: false
-  xy: 778, 134
-  size: 62, 50
-  orig: 62, 50
-  offset: 0, 0
-  index: -1
-rear_shin
-  rotate: false
-  xy: 731, 135
-  size: 45, 107
-  orig: 45, 107
-  offset: 0, 0
-  index: -1
-rear_thigh
-  rotate: true
-  xy: 516, 50
-  size: 39, 62
-  orig: 39, 62
-  offset: 0, 0
-  index: -1
-rear_upper_arm
-  rotate: false
-  xy: 638, 35
-  size: 28, 52
-  orig: 28, 52
-  offset: 0, 0
-  index: -1
-torso
-  rotate: true
-  xy: 279, 2
-  size: 59, 108
-  orig: 59, 108
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.1/example/Resources/iphone-retina/spineboy.png


+ 0 - 292
spine-cocos2dx/3.1/example/Resources/iphone/goblins-ffd.atlas

@@ -1,292 +0,0 @@
-
-goblins-ffd.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-dagger
-  rotate: false
-  xy: 2, 28
-  size: 26, 108
-  orig: 26, 108
-  offset: 0, 0
-  index: -1
-goblin/eyes-closed
-  rotate: false
-  xy: 137, 29
-  size: 34, 12
-  orig: 34, 12
-  offset: 0, 0
-  index: -1
-goblin/head
-  rotate: false
-  xy: 26, 357
-  size: 103, 66
-  orig: 103, 66
-  offset: 0, 0
-  index: -1
-goblin/left-arm
-  rotate: false
-  xy: 30, 28
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblin/left-foot
-  rotate: false
-  xy: 134, 260
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblin/left-hand
-  rotate: false
-  xy: 69, 25
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/left-lower-leg
-  rotate: false
-  xy: 134, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblin/left-shoulder
-  rotate: false
-  xy: 137, 43
-  size: 29, 44
-  orig: 29, 44
-  offset: 0, 0
-  index: -1
-goblin/left-upper-leg
-  rotate: false
-  xy: 30, 65
-  size: 33, 73
-  orig: 33, 73
-  offset: 0, 0
-  index: -1
-goblin/neck
-  rotate: false
-  xy: 201, 387
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/pelvis
-  rotate: false
-  xy: 26, 140
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblin/right-arm
-  rotate: false
-  xy: 171, 84
-  size: 23, 50
-  orig: 23, 50
-  offset: 0, 0
-  index: -1
-goblin/right-foot
-  rotate: false
-  xy: 134, 225
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblin/right-hand
-  rotate: false
-  xy: 204, 258
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblin/right-lower-leg
-  rotate: false
-  xy: 201, 430
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblin/right-shoulder
-  rotate: false
-  xy: 130, 89
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblin/right-upper-leg
-  rotate: false
-  xy: 98, 214
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblin/torso
-  rotate: false
-  xy: 131, 410
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblin/undie-straps
-  rotate: false
-  xy: 2, 7
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblin/undies
-  rotate: false
-  xy: 199, 227
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-goblingirl/eyes-closed
-  rotate: false
-  xy: 59, 2
-  size: 37, 21
-  orig: 37, 21
-  offset: 0, 0
-  index: -1
-goblingirl/head
-  rotate: false
-  xy: 26, 425
-  size: 103, 81
-  orig: 103, 81
-  offset: 0, 0
-  index: -1
-goblingirl/left-arm
-  rotate: false
-  xy: 201, 190
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblingirl/left-foot
-  rotate: false
-  xy: 134, 192
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblingirl/left-hand
-  rotate: false
-  xy: 196, 109
-  size: 35, 40
-  orig: 35, 40
-  offset: 0, 0
-  index: -1
-goblingirl/left-lower-leg
-  rotate: false
-  xy: 169, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/left-shoulder
-  rotate: false
-  xy: 107, 30
-  size: 28, 46
-  orig: 28, 46
-  offset: 0, 0
-  index: -1
-goblingirl/left-upper-leg
-  rotate: false
-  xy: 65, 68
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/neck
-  rotate: false
-  xy: 204, 297
-  size: 35, 41
-  orig: 35, 41
-  offset: 0, 0
-  index: -1
-goblingirl/pelvis
-  rotate: false
-  xy: 131, 365
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblingirl/right-arm
-  rotate: false
-  xy: 100, 97
-  size: 28, 50
-  orig: 28, 50
-  offset: 0, 0
-  index: -1
-goblingirl/right-foot
-  rotate: false
-  xy: 134, 157
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblingirl/right-hand
-  rotate: false
-  xy: 199, 151
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblingirl/right-lower-leg
-  rotate: false
-  xy: 96, 279
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblingirl/right-shoulder
-  rotate: false
-  xy: 204, 340
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblingirl/right-upper-leg
-  rotate: false
-  xy: 98, 149
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblingirl/torso
-  rotate: false
-  xy: 26, 259
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblingirl/undie-straps
-  rotate: false
-  xy: 134, 136
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblingirl/undies
-  rotate: false
-  xy: 196, 78
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-shield
-  rotate: false
-  xy: 26, 185
-  size: 70, 72
-  orig: 70, 72
-  offset: 0, 0
-  index: -1
-spear
-  rotate: false
-  xy: 2, 138
-  size: 22, 368
-  orig: 22, 368
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.1/example/Resources/iphone/goblins-ffd.png


+ 0 - 194
spine-cocos2dx/3.1/example/Resources/iphone/spineboy.atlas

@@ -1,194 +0,0 @@
-
-spineboy.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-eye_indifferent
-  rotate: true
-  xy: 389, 5
-  size: 56, 53
-  orig: 56, 53
-  offset: 0, 0
-  index: -1
-eye_surprised
-  rotate: false
-  xy: 580, 34
-  size: 56, 53
-  orig: 56, 53
-  offset: 0, 0
-  index: -1
-front_bracer
-  rotate: false
-  xy: 732, 85
-  size: 35, 48
-  orig: 35, 48
-  offset: 0, 0
-  index: -1
-front_fist_closed
-  rotate: false
-  xy: 556, 91
-  size: 45, 49
-  orig: 45, 49
-  offset: 0, 0
-  index: -1
-front_fist_open
-  rotate: false
-  xy: 668, 32
-  size: 52, 52
-  orig: 52, 52
-  offset: 0, 0
-  index: -1
-front_foot
-  rotate: false
-  xy: 924, 201
-  size: 76, 41
-  orig: 76, 41
-  offset: 0, 0
-  index: -1
-front_foot_bend1
-  rotate: false
-  xy: 845, 200
-  size: 77, 42
-  orig: 77, 42
-  offset: 0, 0
-  index: -1
-front_foot_bend2
-  rotate: false
-  xy: 778, 186
-  size: 65, 56
-  orig: 65, 56
-  offset: 0, 0
-  index: -1
-front_shin
-  rotate: true
-  xy: 444, 91
-  size: 49, 110
-  orig: 49, 110
-  offset: 0, 0
-  index: -1
-front_thigh
-  rotate: true
-  xy: 603, 89
-  size: 29, 67
-  orig: 29, 67
-  offset: 0, 0
-  index: -1
-front_upper_arm
-  rotate: true
-  xy: 672, 86
-  size: 32, 58
-  orig: 32, 58
-  offset: 0, 0
-  index: -1
-goggles
-  rotate: false
-  xy: 444, 142
-  size: 157, 100
-  orig: 157, 100
-  offset: 0, 0
-  index: -1
-gun
-  rotate: false
-  xy: 603, 120
-  size: 126, 122
-  orig: 126, 122
-  offset: 0, 0
-  index: -1
-head
-  rotate: false
-  xy: 279, 63
-  size: 163, 179
-  orig: 163, 179
-  offset: 0, 0
-  index: -1
-mouth_grind
-  rotate: false
-  xy: 845, 163
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-mouth_oooo
-  rotate: false
-  xy: 842, 126
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-mouth_smile
-  rotate: false
-  xy: 769, 97
-  size: 56, 35
-  orig: 56, 35
-  offset: 0, 0
-  index: -1
-muzzle
-  rotate: false
-  xy: 2, 2
-  size: 275, 240
-  orig: 277, 240
-  offset: 0, 0
-  index: -1
-neck
-  rotate: false
-  xy: 903, 173
-  size: 22, 25
-  orig: 22, 25
-  offset: 0, 0
-  index: -1
-rear_bracer
-  rotate: false
-  xy: 722, 40
-  size: 34, 43
-  orig: 34, 43
-  offset: 0, 0
-  index: -1
-rear_foot
-  rotate: false
-  xy: 444, 11
-  size: 68, 36
-  orig: 68, 36
-  offset: 0, 0
-  index: -1
-rear_foot_bend1
-  rotate: false
-  xy: 444, 49
-  size: 70, 40
-  orig: 70, 40
-  offset: 0, 0
-  index: -1
-rear_foot_bend2
-  rotate: false
-  xy: 778, 134
-  size: 62, 50
-  orig: 62, 50
-  offset: 0, 0
-  index: -1
-rear_shin
-  rotate: false
-  xy: 731, 135
-  size: 45, 107
-  orig: 45, 107
-  offset: 0, 0
-  index: -1
-rear_thigh
-  rotate: true
-  xy: 516, 50
-  size: 39, 62
-  orig: 39, 62
-  offset: 0, 0
-  index: -1
-rear_upper_arm
-  rotate: false
-  xy: 638, 35
-  size: 28, 52
-  orig: 28, 52
-  offset: 0, 0
-  index: -1
-torso
-  rotate: true
-  xy: 279, 2
-  size: 59, 108
-  orig: 59, 108
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.1/example/Resources/iphone/spineboy.png


+ 0 - 22
spine-cocos2dx/3.1/example/proj.win32/main.cpp

@@ -1,22 +0,0 @@
-#include "main.h"
-#include "../Classes/AppDelegate.h"
-
-USING_NS_CC;
-
-int APIENTRY _tWinMain(HINSTANCE hInstance,
-					   HINSTANCE hPrevInstance,
-					   LPTSTR lpCmdLine,
-					   int nCmdShow)
-{
-	UNREFERENCED_PARAMETER(hPrevInstance);
-	UNREFERENCED_PARAMETER(lpCmdLine);
-
-	// create the application instance
-	AppDelegate app;
-
-	auto director = Director::getInstance();
-	auto glview = GLView::create("Spine Example");
-	glview->setFrameSize(960, 640);
-	director->setOpenGLView(glview);
-	return Application::getInstance()->run();
-}

+ 0 - 9
spine-cocos2dx/3.1/example/proj.win32/main.h

@@ -1,9 +0,0 @@
-#ifndef __MAIN_H__
-#define __MAIN_H__
-
-#define WIN32_LEAN_AND_MEAN
-
-#include <windows.h>
-#include <tchar.h>
-
-#endif    // __MAIN_H__

+ 0 - 53
spine-cocos2dx/3.1/example/proj.win32/spine-cocos2dx.sln

@@ -1,53 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Express 2012 for Windows Desktop
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spine-cocos2dx", "spine-cocos2dx.vcxproj", "{DB4C84B9-AC6D-46A1-B7E6-A77FE4515ACF}"
-	ProjectSection(ProjectDependencies) = postProject
-		{98A51BA8-FC3A-415B-AC8F-8C7BD464E93E} = {98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}
-	EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcocos2d", "..\..\cocos2dx\cocos\2d\cocos2d.vcxproj", "{98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libchipmunk", "..\..\cocos2dx\external\chipmunk\proj.win32\chipmunk.vcxproj", "{207BC7A9-CCF1-4F2F-A04D-45F72242AE25}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spine-c", "..\..\..\..\spine-c\spine-c.vcxproj", "{5D74934A-7512-45EE-8402-7B95D3642E85}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{DB4C84B9-AC6D-46A1-B7E6-A77FE4515ACF}.Debug|Win32.ActiveCfg = Debug|Win32
-		{DB4C84B9-AC6D-46A1-B7E6-A77FE4515ACF}.Debug|Win32.Build.0 = Debug|Win32
-		{DB4C84B9-AC6D-46A1-B7E6-A77FE4515ACF}.Release|Win32.ActiveCfg = Release|Win32
-		{DB4C84B9-AC6D-46A1-B7E6-A77FE4515ACF}.Release|Win32.Build.0 = Release|Win32
-		{98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Debug|Win32.ActiveCfg = Debug|Win32
-		{98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Debug|Win32.Build.0 = Debug|Win32
-		{98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Release|Win32.ActiveCfg = Release|Win32
-		{98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Release|Win32.Build.0 = Release|Win32
-		{207BC7A9-CCF1-4F2F-A04D-45F72242AE25}.Debug|Win32.ActiveCfg = Debug|Win32
-		{207BC7A9-CCF1-4F2F-A04D-45F72242AE25}.Debug|Win32.Build.0 = Debug|Win32
-		{207BC7A9-CCF1-4F2F-A04D-45F72242AE25}.Release|Win32.ActiveCfg = Release|Win32
-		{207BC7A9-CCF1-4F2F-A04D-45F72242AE25}.Release|Win32.Build.0 = Release|Win32
-		{5D74934A-7512-45EE-8402-7B95D3642E85}.Debug|Win32.ActiveCfg = Debug|Win32
-		{5D74934A-7512-45EE-8402-7B95D3642E85}.Debug|Win32.Build.0 = Debug|Win32
-		{5D74934A-7512-45EE-8402-7B95D3642E85}.Release|Win32.ActiveCfg = Release|Win32
-		{5D74934A-7512-45EE-8402-7B95D3642E85}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(DPCodeReviewSolutionGUID) = preSolution
-		DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
-	EndGlobalSection
-	GlobalSection(DPCodeReviewSolutionGUID) = preSolution
-		DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
-	EndGlobalSection
-	GlobalSection(DPCodeReviewSolutionGUID) = preSolution
-		DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
-	EndGlobalSection
-	GlobalSection(DPCodeReviewSolutionGUID) = preSolution
-		DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
-	EndGlobalSection
-EndGlobal

+ 0 - 171
spine-cocos2dx/3.1/example/proj.win32/spine-cocos2dx.vcxproj

@@ -1,171 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{DB4C84B9-AC6D-46A1-B7E6-A77FE4515ACF}</ProjectGuid>
-    <RootNamespace>spine</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-    <ProjectName>spine-cocos2dx</ProjectName>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' == '10.0'">v100</PlatformToolset>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0'">v110</PlatformToolset>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v110_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' == '10.0'">v100</PlatformToolset>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0'">v110</PlatformToolset>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v110_xp</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="..\..\cocos2dx\cocos\2d\cocos2dx.props" />
-    <Import Project="..\..\cocos2dx\cocos\2d\cocos2d_headers.props" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="..\..\cocos2dx\cocos\2d\cocos2dx.props" />
-    <Import Project="..\..\cocos2dx\cocos\2d\cocos2d_headers.props" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration).win32\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration).win32\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration).win32\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration).win32\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LibraryPath>$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A\lib;$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LibraryPath>$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A\lib;$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir)..\Classes;$(ProjectDir)..\..\src;$(ProjectDir)..\..\..\..\spine-c\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;COCOS2D_DEBUG=1;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <DisableSpecificWarnings>4267;4251;4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>
-      <CompileAs>CompileAsCpp</CompileAs>
-    </ClCompile>
-    <Link>
-      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>$(OutDir)$(ProjectName).exe</OutputFile>
-      <AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-      <EntryPointSymbol>
-      </EntryPointSymbol>
-      <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
-      <IgnoreSpecificDefaultLibraries>libcmt.lib;msvcrt.lib;libcmtd.lib</IgnoreSpecificDefaultLibraries>
-    </Link>
-    <PostBuildEvent>
-      <Command>
-      </Command>
-    </PostBuildEvent>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\cocos2dx;$(ProjectDir)..\..\..\..\cocos2dx\include;$(ProjectDir)..\..\..\..\cocos2dx\kazmath\include;$(ProjectDir)..\..\..\..\cocos2dx\platform\win32;$(ProjectDir)..\..\..\..\cocos2dx\platform\third_party\win32\OGLES;..\Classes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <DisableSpecificWarnings>4267;4251;4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>
-    </ClCompile>
-    <Link>
-      <AdditionalDependencies>opengl32.lib;glew32.lib;libcocos2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>$(OutDir)$(ProjectName).exe</OutputFile>
-      <AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-    <PostBuildEvent>
-      <Command>
-      </Command>
-    </PostBuildEvent>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\..\src\spine\PolygonBatch.h" />
-    <ClInclude Include="..\..\src\spine\SkeletonAnimation.h" />
-    <ClInclude Include="..\..\src\spine\SkeletonRenderer.h" />
-    <ClInclude Include="..\..\src\spine\spine-cocos2dx.h" />
-    <ClInclude Include="..\Classes\AppDelegate.h" />
-    <ClInclude Include="..\Classes\AppMacros.h" />
-    <ClInclude Include="..\Classes\GoblinsExample.h" />
-    <ClInclude Include="..\Classes\SpineboyExample.h" />
-    <ClInclude Include="main.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\..\src\spine\PolygonBatch.cpp" />
-    <ClCompile Include="..\..\src\spine\SkeletonAnimation.cpp" />
-    <ClCompile Include="..\..\src\spine\SkeletonRenderer.cpp" />
-    <ClCompile Include="..\..\src\spine\spine-cocos2dx.cpp" />
-    <ClCompile Include="..\Classes\AppDelegate.cpp" />
-    <ClCompile Include="..\Classes\GoblinsExample.cpp" />
-    <ClCompile Include="..\Classes\SpineboyExample.cpp" />
-    <ClCompile Include="main.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\..\spine-c\spine-c.vcxproj">
-      <Project>{5d74934a-7512-45ee-8402-7b95d3642e85}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\cocos2dx\cocos\2d\cocos2d.vcxproj">
-      <Project>{98a51ba8-fc3a-415b-ac8f-8c7bd464e93e}</Project>
-      <Private>false</Private>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-      <CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
-      <LinkLibraryDependencies>true</LinkLibraryDependencies>
-      <UseLibraryDependencyInputs>false</UseLibraryDependencyInputs>
-    </ProjectReference>
-    <ProjectReference Include="..\..\cocos2dx\external\chipmunk\proj.win32\chipmunk.vcxproj">
-      <Project>{207bc7a9-ccf1-4f2f-a04d-45f72242ae25}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>

+ 0 - 69
spine-cocos2dx/3.1/example/proj.win32/spine-cocos2dx.vcxproj.filters

@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="win32">
-      <UniqueIdentifier>{ef769de4-53ac-449d-92e6-e67ec8d7414e}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Classes">
-      <UniqueIdentifier>{0dcd52ca-d521-4ba1-a1fa-c0d58a2df402}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="src">
-      <UniqueIdentifier>{54b66b2b-0990-4335-a821-332c44b6f83e}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="main.h">
-      <Filter>win32</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Classes\AppDelegate.h">
-      <Filter>Classes</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Classes\AppMacros.h">
-      <Filter>Classes</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\src\spine\SkeletonRenderer.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\src\spine\spine-cocos2dx.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\src\spine\SkeletonAnimation.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\src\spine\PolygonBatch.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Classes\SpineboyExample.h">
-      <Filter>Classes</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Classes\GoblinsExample.h">
-      <Filter>Classes</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="main.cpp">
-      <Filter>win32</Filter>
-    </ClCompile>
-    <ClCompile Include="..\Classes\AppDelegate.cpp">
-      <Filter>Classes</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\spine\SkeletonRenderer.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\spine\spine-cocos2dx.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\spine\SkeletonAnimation.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\spine\PolygonBatch.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="..\Classes\SpineboyExample.cpp">
-      <Filter>Classes</Filter>
-    </ClCompile>
-    <ClCompile Include="..\Classes\GoblinsExample.cpp">
-      <Filter>Classes</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>

+ 0 - 112
spine-cocos2dx/3.1/src/spine/PolygonBatch.cpp

@@ -1,112 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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/PolygonBatch.h>
-#include <spine/extension.h>
-
-USING_NS_CC;
-
-namespace spine {
-
-PolygonBatch* PolygonBatch::createWithCapacity (int capacity) {
-	PolygonBatch* batch = new PolygonBatch();
-	batch->initWithCapacity(capacity);
-	batch->autorelease();
-	return batch;
-}
-
-PolygonBatch::PolygonBatch () :
-	capacity(0), 
-	vertices(nullptr), verticesCount(0),
-	triangles(nullptr), trianglesCount(0),
-	texture(nullptr)
-{}
-
-bool PolygonBatch::initWithCapacity (int capacity) {
-	// 32767 is max index, so 32767 / 3 - (32767 / 3 % 3) = 10920.
-	CCASSERT(capacity <= 10920, "capacity cannot be > 10920");
-	CCASSERT(capacity >= 0, "capacity cannot be < 0");
-	this->capacity = capacity;
-	vertices = MALLOC(V2F_C4B_T2F, capacity);
-	triangles = MALLOC(GLushort, capacity * 3);
-	return true;
-}
-
-PolygonBatch::~PolygonBatch () {
-	FREE(vertices);
-	FREE(triangles);
-}
-
-void PolygonBatch::add (const Texture2D* addTexture,
-		const float* addVertices, const float* uvs, int addVerticesCount,
-		const int* addTriangles, int addTrianglesCount,
-		Color4B* color) {
-
-	if (
-		addTexture != texture
-		|| verticesCount + (addVerticesCount >> 1) > capacity
-		|| trianglesCount + addTrianglesCount > capacity * 3) {
-		this->flush();
-		texture = addTexture;
-	}
-
-	for (int i = 0; i < addTrianglesCount; ++i, ++trianglesCount)
-		triangles[trianglesCount] = addTriangles[i] + verticesCount;
-
-	for (int i = 0; i < addVerticesCount; i += 2, ++verticesCount) {
-		V2F_C4B_T2F* vertex = vertices + verticesCount;
-		vertex->vertices.x = addVertices[i];
-		vertex->vertices.y = addVertices[i + 1];
-		vertex->colors = *color;
-		vertex->texCoords.u = uvs[i];
-		vertex->texCoords.v = uvs[i + 1];
-	}
-}
-
-void PolygonBatch::flush () {
-	if (!verticesCount) return;
-
-	GL::bindTexture2D(texture->getName());
-	glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION);
-	glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_COLOR);
-	glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_TEX_COORDS);
-	glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(V2F_C4B_T2F), &vertices[0].vertices);
-	glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V2F_C4B_T2F), &vertices[0].colors);
-	glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORDS, 2, GL_FLOAT, GL_FALSE, sizeof(V2F_C4B_T2F), &vertices[0].texCoords);
-
-	glDrawElements(GL_TRIANGLES, trianglesCount, GL_UNSIGNED_SHORT, triangles);
-
-	verticesCount = 0;
-	trianglesCount = 0;
-
-	CHECK_GL_ERROR_DEBUG();
-}
-
-}

+ 0 - 229
spine-cocos2dx/3.1/src/spine/SkeletonAnimation.cpp

@@ -1,229 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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/SkeletonAnimation.h>
-#include <spine/spine-cocos2dx.h>
-#include <spine/extension.h>
-#include <algorithm>
-
-USING_NS_CC;
-using std::min;
-using std::max;
-using std::vector;
-
-namespace spine {
-
-void animationCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
-	((SkeletonAnimation*)state->rendererObject)->onAnimationStateEvent(trackIndex, type, event, loopCount);
-}
-
-void trackEntryCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
-	((SkeletonAnimation*)state->rendererObject)->onTrackEntryEvent(trackIndex, type, event, loopCount);
-}
-
-typedef struct _TrackEntryListeners {
-	StartListener startListener;
-	EndListener endListener;
-	CompleteListener completeListener;
-	EventListener eventListener;
-} _TrackEntryListeners;
-
-static _TrackEntryListeners* getListeners (spTrackEntry* entry) {
-	if (!entry->rendererObject) {
-		entry->rendererObject = NEW(spine::_TrackEntryListeners);
-		entry->listener = trackEntryCallback;
-	}
-	return (_TrackEntryListeners*)entry->rendererObject;
-}
-
-void disposeTrackEntry (spTrackEntry* entry) {
-	if (entry->rendererObject) FREE(entry->rendererObject);
-	_spTrackEntry_dispose(entry);
-}
-
-//
-
-SkeletonAnimation* SkeletonAnimation::createWithData (spSkeletonData* skeletonData) {
-	SkeletonAnimation* node = new SkeletonAnimation(skeletonData);
-	node->autorelease();
-	return node;
-}
-
-SkeletonAnimation* SkeletonAnimation::createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale) {
-	SkeletonAnimation* node = new SkeletonAnimation(skeletonDataFile, atlas, scale);
-	node->autorelease();
-	return node;
-}
-
-SkeletonAnimation* SkeletonAnimation::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) {
-	SkeletonAnimation* node = new SkeletonAnimation(skeletonDataFile, atlasFile, scale);
-	node->autorelease();
-	return node;
-}
-
-void SkeletonAnimation::initialize () {
-	ownsAnimationStateData = true;
-	state = spAnimationState_create(spAnimationStateData_create(skeleton->data));
-	state->rendererObject = this;
-	state->listener = animationCallback;
-
-	_spAnimationState* stateInternal = (_spAnimationState*)state;
-	stateInternal->disposeTrackEntry = disposeTrackEntry;
-}
-
-SkeletonAnimation::SkeletonAnimation (spSkeletonData *skeletonData)
-		: SkeletonRenderer(skeletonData) {
-	initialize();
-}
-
-SkeletonAnimation::SkeletonAnimation (const char* skeletonDataFile, spAtlas* atlas, float scale)
-		: SkeletonRenderer(skeletonDataFile, atlas, scale) {
-	initialize();
-}
-
-SkeletonAnimation::SkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale)
-		: SkeletonRenderer(skeletonDataFile, atlasFile, scale) {
-	initialize();
-}
-
-SkeletonAnimation::~SkeletonAnimation () {
-	if (ownsAnimationStateData) spAnimationStateData_dispose(state->data);
-	spAnimationState_dispose(state);
-}
-
-void SkeletonAnimation::update (float deltaTime) {
-	super::update(deltaTime);
-
-	deltaTime *= timeScale;
-	spAnimationState_update(state, deltaTime);
-	spAnimationState_apply(state, skeleton);
-	spSkeleton_updateWorldTransform(skeleton);
-}
-
-void SkeletonAnimation::setAnimationStateData (spAnimationStateData* stateData) {
-	CCASSERT(stateData, "stateData cannot be null.");
-
-	if (ownsAnimationStateData) spAnimationStateData_dispose(state->data);
-	spAnimationState_dispose(state);
-
-	ownsAnimationStateData = false;
-	state = spAnimationState_create(stateData);
-	state->rendererObject = this;
-	state->listener = animationCallback;
-}
-
-void SkeletonAnimation::setMix (const char* fromAnimation, const char* toAnimation, float duration) {
-	spAnimationStateData_setMixByName(state->data, fromAnimation, toAnimation, duration);
-}
-
-spTrackEntry* SkeletonAnimation::setAnimation (int trackIndex, const char* name, bool loop) {
-	spAnimation* animation = spSkeletonData_findAnimation(skeleton->data, name);
-	if (!animation) {
-		log("Spine: Animation not found: %s", name);
-		return 0;
-	}
-	return spAnimationState_setAnimation(state, trackIndex, animation, loop);
-}
-
-spTrackEntry* SkeletonAnimation::addAnimation (int trackIndex, const char* name, bool loop, float delay) {
-	spAnimation* animation = spSkeletonData_findAnimation(skeleton->data, name);
-	if (!animation) {
-		log("Spine: Animation not found: %s", name);
-		return 0;
-	}
-	return spAnimationState_addAnimation(state, trackIndex, animation, loop, delay);
-}
-
-spTrackEntry* SkeletonAnimation::getCurrent (int trackIndex) { 
-	return spAnimationState_getCurrent(state, trackIndex);
-}
-
-void SkeletonAnimation::clearTracks () {
-	spAnimationState_clearTracks(state);
-}
-
-void SkeletonAnimation::clearTrack (int trackIndex) {
-	spAnimationState_clearTrack(state, trackIndex);
-}
-
-void SkeletonAnimation::onAnimationStateEvent (int trackIndex, spEventType type, spEvent* event, int loopCount) {
-	switch (type) {
-	case SP_ANIMATION_START:
-		if (startListener) startListener(trackIndex);
-		break;
-	case SP_ANIMATION_END:
-		if (endListener) endListener(trackIndex);
-		break;
-	case SP_ANIMATION_COMPLETE:
-		if (completeListener) completeListener(trackIndex, loopCount);
-		break;
-	case SP_ANIMATION_EVENT:
-		if (eventListener) eventListener(trackIndex, event);
-		break;
-	}
-}
-
-void SkeletonAnimation::onTrackEntryEvent (int trackIndex, spEventType type, spEvent* event, int loopCount) {
-	spTrackEntry* entry = spAnimationState_getCurrent(state, trackIndex);
-	if (!entry->rendererObject) return;
-	_TrackEntryListeners* listeners = (_TrackEntryListeners*)entry->rendererObject;
-	switch (type) {
-	case SP_ANIMATION_START:
-		if (listeners->startListener) listeners->startListener(trackIndex);
-		break;
-	case SP_ANIMATION_END:
-		if (listeners->endListener) listeners->endListener(trackIndex);
-		break;
-	case SP_ANIMATION_COMPLETE:
-		if (listeners->completeListener) listeners->completeListener(trackIndex, loopCount);
-		break;
-	case SP_ANIMATION_EVENT:
-		if (listeners->eventListener) listeners->eventListener(trackIndex, event);
-		break;
-	}
-}
-
-void SkeletonAnimation::setStartListener (spTrackEntry* entry, StartListener listener) {
-	getListeners(entry)->startListener = listener;
-}
-
-void SkeletonAnimation::setEndListener (spTrackEntry* entry, EndListener listener) {
-	getListeners(entry)->endListener = listener;
-}
-
-void SkeletonAnimation::setCompleteListener (spTrackEntry* entry, CompleteListener listener) {
-	getListeners(entry)->completeListener = listener;
-}
-
-void SkeletonAnimation::setEventListener (spTrackEntry* entry, spine::EventListener listener) {
-	getListeners(entry)->eventListener = listener;
-}
-
-}

+ 0 - 96
spine-cocos2dx/3.1/src/spine/SkeletonAnimation.h

@@ -1,96 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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_SKELETONANIMATION_H_
-#define SPINE_SKELETONANIMATION_H_
-
-#include <spine/spine.h>
-#include <spine/SkeletonRenderer.h>
-#include "cocos2d.h"
-
-namespace spine {
-
-typedef std::function<void(int trackIndex)> StartListener;
-typedef std::function<void(int trackIndex)> EndListener;
-typedef std::function<void(int trackIndex, int loopCount)> CompleteListener;
-typedef std::function<void(int trackIndex, spEvent* event)> EventListener;
-
-/** Draws an animated skeleton, providing an AnimationState for applying one or more animations and queuing animations to be
-  * played later. */
-class SkeletonAnimation: public SkeletonRenderer {
-public:
-	spAnimationState* state;
-
-	static SkeletonAnimation* createWithData (spSkeletonData* skeletonData);
-	static SkeletonAnimation* createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
-	static SkeletonAnimation* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
-
-	SkeletonAnimation (spSkeletonData* skeletonData);
-	SkeletonAnimation (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
-	SkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
-
-	virtual ~SkeletonAnimation ();
-
-	virtual void update (float deltaTime);
-
-	void setAnimationStateData (spAnimationStateData* stateData);
-	void setMix (const char* fromAnimation, const char* toAnimation, float duration);
-
-	spTrackEntry* setAnimation (int trackIndex, const char* name, bool loop);
-	spTrackEntry* addAnimation (int trackIndex, const char* name, bool loop, float delay = 0);
-	spTrackEntry* getCurrent (int trackIndex = 0);
-	void clearTracks ();
-	void clearTrack (int trackIndex = 0);
-
-	StartListener startListener;
-	EndListener endListener;
-	CompleteListener completeListener;
-	EventListener eventListener;
-	void setStartListener (spTrackEntry* entry, StartListener listener);
-	void setEndListener (spTrackEntry* entry, EndListener listener);
-	void setCompleteListener (spTrackEntry* entry, CompleteListener listener);
-	void setEventListener (spTrackEntry* entry, EventListener listener);
-
-	virtual void onAnimationStateEvent (int trackIndex, spEventType type, spEvent* event, int loopCount);
-	virtual void onTrackEntryEvent (int trackIndex, spEventType type, spEvent* event, int loopCount);
-
-protected:
-	SkeletonAnimation ();
-
-private:
-	typedef SkeletonRenderer super;
-	bool ownsAnimationStateData;
-
-	void initialize ();
-};
-
-}
-
-#endif /* SPINE_SKELETONANIMATION_H_ */

+ 0 - 369
spine-cocos2dx/3.1/src/spine/SkeletonRenderer.cpp

@@ -1,369 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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/SkeletonRenderer.h>
-#include <spine/spine-cocos2dx.h>
-#include <spine/extension.h>
-#include <spine/PolygonBatch.h>
-#include <algorithm>
-
-USING_NS_CC;
-using std::min;
-using std::max;
-
-namespace spine {
-
-static const int quadTriangles[6] = {0, 1, 2, 2, 3, 0};
-
-SkeletonRenderer* SkeletonRenderer::createWithData (spSkeletonData* skeletonData, bool ownsSkeletonData) {
-	SkeletonRenderer* node = new SkeletonRenderer(skeletonData, ownsSkeletonData);
-	node->autorelease();
-	return node;
-}
-
-SkeletonRenderer* SkeletonRenderer::createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale) {
-	SkeletonRenderer* node = new SkeletonRenderer(skeletonDataFile, atlas, scale);
-	node->autorelease();
-	return node;
-}
-
-SkeletonRenderer* SkeletonRenderer::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) {
-	SkeletonRenderer* node = new SkeletonRenderer(skeletonDataFile, atlasFile, scale);
-	node->autorelease();
-	return node;
-}
-
-void SkeletonRenderer::initialize () {
-	atlas = 0;
-	debugSlots = false;
-	debugBones = false;
-	timeScale = 1;
-
-	worldVertices = MALLOC(float, 1000); // Max number of vertices per mesh.
-
-	batch = PolygonBatch::createWithCapacity(2000); // Max number of vertices and triangles per batch.
-	batch->retain();
-
-	blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;
-	setOpacityModifyRGB(true);
-
-	setGLProgram(ShaderCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR));
-	scheduleUpdate();
-}
-
-void SkeletonRenderer::setSkeletonData (spSkeletonData *skeletonData, bool ownsSkeletonData) {
-	skeleton = spSkeleton_create(skeletonData);
-	rootBone = skeleton->bones[0];
-	this->ownsSkeletonData = ownsSkeletonData;	
-}
-
-SkeletonRenderer::SkeletonRenderer () {
-	initialize();
-}
-
-SkeletonRenderer::SkeletonRenderer (spSkeletonData *skeletonData, bool ownsSkeletonData) {
-	initialize();
-
-	setSkeletonData(skeletonData, ownsSkeletonData);
-}
-
-SkeletonRenderer::SkeletonRenderer (const char* skeletonDataFile, spAtlas* atlas, float scale) {
-	initialize();
-
-	spSkeletonJson* json = spSkeletonJson_create(atlas);
-	json->scale = scale;
-	spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile);
-	CCASSERT(skeletonData, json->error ? json->error : "Error reading skeleton data.");
-	spSkeletonJson_dispose(json);
-
-	setSkeletonData(skeletonData, true);
-}
-
-SkeletonRenderer::SkeletonRenderer (const char* skeletonDataFile, const char* atlasFile, float scale) {
-	initialize();
-
-	atlas = spAtlas_createFromFile(atlasFile, 0);
-	CCASSERT(atlas, "Error reading atlas file.");
-
-	spSkeletonJson* json = spSkeletonJson_create(atlas);
-	json->scale = scale;
-	spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile);
-	CCASSERT(skeletonData, json->error ? json->error : "Error reading skeleton data file.");
-	spSkeletonJson_dispose(json);
-
-	setSkeletonData(skeletonData, true);
-}
-
-SkeletonRenderer::~SkeletonRenderer () {
-	if (ownsSkeletonData) spSkeletonData_dispose(skeleton->data);
-	if (atlas) spAtlas_dispose(atlas);
-	spSkeleton_dispose(skeleton);
-	batch->release();
-	FREE(worldVertices);
-}
-
-void SkeletonRenderer::update (float deltaTime) {
-	spSkeleton_update(skeleton, deltaTime * timeScale);
-}
-
-void SkeletonRenderer::draw (Renderer* renderer, const Mat4& transform, bool transformUpdated) {
-    drawCommand.init(_globalZOrder);
-    drawCommand.func = CC_CALLBACK_0(SkeletonRenderer::drawSkeleton, this, transform, transformUpdated);
-    renderer->addCommand(&drawCommand);
-}
-
-void SkeletonRenderer::drawSkeleton (const Mat4 &transform, bool transformUpdated) {
-	getGLProgram()->use();
-	getGLProgram()->setUniformsForBuiltins(transform);
-	GL::bindVAO(0);
-
-	Color3B nodeColor = getColor();
-	skeleton->r = nodeColor.r / (float)255;
-	skeleton->g = nodeColor.g / (float)255;
-	skeleton->b = nodeColor.b / (float)255;
-	skeleton->a = getDisplayedOpacity() / (float)255;
-
-	int additive = -1;
-	Color4B color;
-	const float* uvs = nullptr;
-	int verticesCount = 0;
-	const int* triangles = nullptr;
-	int trianglesCount = 0;
-	float r = 0, g = 0, b = 0, a = 0;
-	for (int i = 0, n = skeleton->slotCount; i < n; i++) {
-		spSlot* slot = skeleton->drawOrder[i];
-		if (!slot->attachment) continue;
-		Texture2D *texture = nullptr;
-		switch (slot->attachment->type) {
-		case SP_ATTACHMENT_REGION: {
-			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
-			texture = getTexture(attachment);
-			uvs = attachment->uvs;
-			verticesCount = 8;
-			triangles = quadTriangles;
-			trianglesCount = 6;
-			r = attachment->r;
-			g = attachment->g;
-			b = attachment->b;
-			a = attachment->a;
-			break;
-		}
-		case SP_ATTACHMENT_MESH: {
-			spMeshAttachment* attachment = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
-			texture = getTexture(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_SKINNED_MESH: {
-			spSkinnedMeshAttachment* attachment = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
-			texture = getTexture(attachment);
-			uvs = attachment->uvs;
-			verticesCount = attachment->uvsCount;
-			triangles = attachment->triangles;
-			trianglesCount = attachment->trianglesCount;
-			r = attachment->r;
-			g = attachment->g;
-			b = attachment->b;
-			a = attachment->a;
-			break;
-		}
-		default: ;
-		} 
-		if (texture) {
-			if (slot->data->additiveBlending != additive) {
-				batch->flush();
-				GL::blendFunc(blendFunc.src, slot->data->additiveBlending ? GL_ONE : blendFunc.dst);
-				additive = slot->data->additiveBlending;
-			}
-			color.a = skeleton->a * slot->a * a * 255;
-			float multiplier = premultipliedAlpha ? color.a : 255;
-			color.r = skeleton->r * slot->r * r * multiplier;
-			color.g = skeleton->g * slot->g * g * multiplier;
-			color.b = skeleton->b * slot->b * b * multiplier;
-			batch->add(texture, worldVertices, uvs, verticesCount, triangles, trianglesCount, &color);
-		}
-	}
-	batch->flush();
-
-	if (debugSlots || debugBones) {
-		Director* director = Director::getInstance();
-		director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
-		director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform);
-
-		if (debugSlots) {
-			// Slots.
-			DrawPrimitives::setDrawColor4B(0, 0, 255, 255);
-			glLineWidth(1);
-			Vec2 points[4];
-			V3F_C4B_T2F_Quad quad;
-			for (int i = 0, n = skeleton->slotCount; i < n; i++) {
-				spSlot* slot = skeleton->drawOrder[i];
-				if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_REGION) continue;
-				spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-				spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
-				points[0] = Vec2(worldVertices[0], worldVertices[1]);
-				points[1] = Vec2(worldVertices[2], worldVertices[3]);
-				points[2] = Vec2(worldVertices[4], worldVertices[5]);
-				points[3] = Vec2(worldVertices[6], worldVertices[7]);
-				DrawPrimitives::drawPoly(points, 4, true);
-			}
-		}
-		if (debugBones) {
-			// Bone lengths.
-			glLineWidth(2);
-			DrawPrimitives::setDrawColor4B(255, 0, 0, 255);
-			for (int i = 0, n = skeleton->boneCount; i < n; i++) {
-				spBone *bone = skeleton->bones[i];
-				float x = bone->data->length * bone->m00 + bone->worldX;
-				float y = bone->data->length * bone->m10 + bone->worldY;
-				DrawPrimitives::drawLine(Vec2(bone->worldX, bone->worldY), Vec2(x, y));
-			}
-			// Bone origins.
-			DrawPrimitives::setPointSize(4);
-			DrawPrimitives::setDrawColor4B(0, 0, 255, 255); // Root bone is blue.
-			for (int i = 0, n = skeleton->boneCount; i < n; i++) {
-				spBone *bone = skeleton->bones[i];
-				DrawPrimitives::drawPoint(Vec2(bone->worldX, bone->worldY));
-				if (i == 0) DrawPrimitives::setDrawColor4B(0, 255, 0, 255);
-			}
-		}
-		director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
-	}
-}
-
-Texture2D* SkeletonRenderer::getTexture (spRegionAttachment* attachment) const {
-	return (Texture2D*)((spAtlasRegion*)attachment->rendererObject)->page->rendererObject;
-}
-
-Texture2D* SkeletonRenderer::getTexture (spMeshAttachment* attachment) const {
-	return (Texture2D*)((spAtlasRegion*)attachment->rendererObject)->page->rendererObject;
-}
-
-Texture2D* SkeletonRenderer::getTexture (spSkinnedMeshAttachment* attachment) const {
-	return (Texture2D*)((spAtlasRegion*)attachment->rendererObject)->page->rendererObject;
-}
-
-Rect SkeletonRenderer::getBoundingBox () const {
-	float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
-	float scaleX = getScaleX(), scaleY = getScaleY();
-	for (int i = 0; i < skeleton->slotCount; ++i) {
-		spSlot* slot = skeleton->slots[i];
-		if (!slot->attachment) continue;
-		int verticesCount;
-		if (slot->attachment->type == SP_ATTACHMENT_REGION) {
-			spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
-			spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, worldVertices);
-			verticesCount = 8;
-		} else if (slot->attachment->type == SP_ATTACHMENT_MESH) {
-			spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment;
-			spMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
-			verticesCount = mesh->verticesCount;
-		} else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) {
-			spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment;
-			spSkinnedMeshAttachment_computeWorldVertices(mesh, slot->skeleton->x, slot->skeleton->y, slot, worldVertices);
-			verticesCount = mesh->uvsCount;
-		} else
-			continue;
-		for (int ii = 0; ii < verticesCount; ii += 2) {
-			float x = worldVertices[ii] * scaleX, y = worldVertices[ii + 1] * scaleY;
-			minX = min(minX, x);
-			minY = min(minY, y);
-			maxX = max(maxX, x);
-			maxY = max(maxY, y);
-		}
-	}
-	Vec2 position = getPosition();
-	return Rect(position.x + minX, position.y + minY, maxX - minX, maxY - minY);
-}
-
-// --- Convenience methods for Skeleton_* functions.
-
-void SkeletonRenderer::updateWorldTransform () {
-	spSkeleton_updateWorldTransform(skeleton);
-}
-
-void SkeletonRenderer::setToSetupPose () {
-	spSkeleton_setToSetupPose(skeleton);
-}
-void SkeletonRenderer::setBonesToSetupPose () {
-	spSkeleton_setBonesToSetupPose(skeleton);
-}
-void SkeletonRenderer::setSlotsToSetupPose () {
-	spSkeleton_setSlotsToSetupPose(skeleton);
-}
-
-spBone* SkeletonRenderer::findBone (const char* boneName) const {
-	return spSkeleton_findBone(skeleton, boneName);
-}
-
-spSlot* SkeletonRenderer::findSlot (const char* slotName) const {
-	return spSkeleton_findSlot(skeleton, slotName);
-}
-
-bool SkeletonRenderer::setSkin (const char* skinName) {
-	return spSkeleton_setSkinByName(skeleton, skinName) ? true : false;
-}
-
-spAttachment* SkeletonRenderer::getAttachment (const char* slotName, const char* attachmentName) const {
-	return spSkeleton_getAttachmentForSlotName(skeleton, slotName, attachmentName);
-}
-bool SkeletonRenderer::setAttachment (const char* slotName, const char* attachmentName) {
-	return spSkeleton_setAttachment(skeleton, slotName, attachmentName) ? true : false;
-}
-
-// --- CCBlendProtocol
-
-const BlendFunc& SkeletonRenderer::getBlendFunc () const {
-    return blendFunc;
-}
-
-void SkeletonRenderer::setBlendFunc (const BlendFunc &blendFunc) {
-    this->blendFunc = blendFunc;
-}
-
-void SkeletonRenderer::setOpacityModifyRGB (bool value) {
-	premultipliedAlpha = value;
-}
-
-bool SkeletonRenderer::isOpacityModifyRGB () {
-	return premultipliedAlpha;
-}
-
-}

+ 0 - 113
spine-cocos2dx/3.1/src/spine/SkeletonRenderer.h

@@ -1,113 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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_SKELETONRENDERER_H_
-#define SPINE_SKELETONRENDERER_H_
-
-#include <spine/spine.h>
-#include "cocos2d.h"
-
-namespace spine {
-
-class PolygonBatch;
-
-/** Draws a skeleton. */
-class SkeletonRenderer: public cocos2d::Node, public cocos2d::BlendProtocol {
-public:
-	spSkeleton* skeleton;
-	spBone* rootBone;
-	float timeScale;
-	bool debugSlots;
-	bool debugBones;
-	bool premultipliedAlpha;
-
-	static SkeletonRenderer* createWithData (spSkeletonData* skeletonData, bool ownsSkeletonData = false);
-	static SkeletonRenderer* createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
-	static SkeletonRenderer* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
-
-	SkeletonRenderer (spSkeletonData* skeletonData, bool ownsSkeletonData = false);
-	SkeletonRenderer (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
-	SkeletonRenderer (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
-
-	virtual ~SkeletonRenderer ();
-
-	virtual void update (float deltaTime) override;
-	virtual void draw (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, bool transformUpdated) override;
-	virtual void drawSkeleton (const cocos2d::Mat4& transform, bool transformUpdated);
-	virtual cocos2d::Rect getBoundingBox () const override;
-
-	// --- Convenience methods for common Skeleton_* functions.
-	void updateWorldTransform ();
-
-	void setToSetupPose ();
-	void setBonesToSetupPose ();
-	void setSlotsToSetupPose ();
-
-	/* Returns 0 if the bone was not found. */
-	spBone* findBone (const char* boneName) const;
-	/* Returns 0 if the slot was not found. */
-	spSlot* findSlot (const char* slotName) const;
-	
-	/* Sets the skin used to look up attachments not found in the SkeletonData defaultSkin. Attachments from the new skin are
-	 * attached if the corresponding attachment from the old skin was attached. Returns false if the skin was not found.
-	 * @param skin May be 0.*/
-	bool setSkin (const char* skinName);
-	
-	/* Returns 0 if the slot or attachment was not found. */
-	spAttachment* getAttachment (const char* slotName, const char* attachmentName) const;
-	/* Returns false if the slot or attachment was not found. */
-	bool setAttachment (const char* slotName, const char* attachmentName);
-
-	// --- BlendProtocol
-	virtual void setBlendFunc (const cocos2d::BlendFunc& blendFunc);
-	virtual const cocos2d::BlendFunc& getBlendFunc () const;
-	virtual void setOpacityModifyRGB (bool value);
-	virtual bool isOpacityModifyRGB ();
-
-protected:
-	SkeletonRenderer ();
-	void setSkeletonData (spSkeletonData* skeletonData, bool ownsSkeletonData);
-	virtual cocos2d::Texture2D* getTexture (spRegionAttachment* attachment) const;
-	virtual cocos2d::Texture2D* getTexture (spMeshAttachment* attachment) const;
-	virtual cocos2d::Texture2D* getTexture (spSkinnedMeshAttachment* attachment) const;
-
-private:
-	bool ownsSkeletonData;
-	spAtlas* atlas;
-	cocos2d::CustomCommand drawCommand;
-	cocos2d::BlendFunc blendFunc;
-	PolygonBatch* batch;
-	float* worldVertices;
-	void initialize ();
-};
-
-}
-
-#endif /* SPINE_SKELETONRENDERER_H_ */

+ 0 - 55
spine-cocos2dx/3.1/src/spine/spine-cocos2dx.cpp

@@ -1,55 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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/spine-cocos2dx.h>
-#include <spine/extension.h>
-
-USING_NS_CC;
-
-void _spAtlasPage_createTexture (spAtlasPage* self, const char* path) {
-	Texture2D* texture = Director::getInstance()->getTextureCache()->addImage(path);
-	texture->retain();
-	self->rendererObject = texture;
-	self->width = texture->getPixelsWide();
-	self->height = texture->getPixelsHigh();
-}
-
-void _spAtlasPage_disposeTexture (spAtlasPage* self) {
-	((Texture2D*)self->rendererObject)->release();
-}
-
-char* _spUtil_readFile (const char* path, int* length) {
-	Data data = FileUtils::getInstance()->getDataFromFile(
-			FileUtils::getInstance()->fullPathForFilename(path).c_str());
-	*length = data.getSize();
-	char* bytes = MALLOC(char, *length);
-	memcpy(bytes, data.getBytes(), *length);
-	return bytes;
-}

+ 0 - 39
spine-cocos2dx/3.1/src/spine/spine-cocos2dx.h

@@ -1,39 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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_COCOS2DX_H_
-#define SPINE_COCOS2DX_H_
-
-#include <spine/spine.h>
-#include "cocos2d.h"
-#include <spine/SkeletonRenderer.h>
-#include <spine/SkeletonAnimation.h>
-
-#endif /* SPINE_COCOS2DX_H_ */

+ 0 - 21
spine-cocos2dx/3.2/README.md

@@ -1,21 +0,0 @@
-# spine-cocos2dx v3.2
-
-The spine-cocos2dx runtime provides functionality to load, manipulate and render [Spine](http://esotericsoftware.com) skeletal animation data using [cocos2d-x](http://www.cocos2d-x.org/). spine-cocos2dx is based on [spine-c](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-c).
-
-## Setup
-
-1. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip).
-1. Place the contents of a cocos2d-x version 3.2 distribution into the `spine-cocos2dx/3.2/cocos2dx` directory.
-1. Run the `python download-deps.py` script in the `spine-cocos2dx/3.2/cocos2dx` directory.
-1. Open the XCode (Mac) or Visual C++ 2012 Express (Windows) project file from the `spine-cocos2dx/3.2/example` directory. Build files are also provided for Android.
-
-Alternatively, the contents of the `spine-c/src`, `spine-c/include` and `spine-cocos2dx/3.2/src` directories can be copied into your project. Be sure your header search path will find the contents of the `spine-c/include` and `spine-cocos2dx/3.1/src` directories. Note that the includes use `spine/Xxx.h`, so the `spine` directory cannot be omitted when copying the files.
-
-## Notes
-
-- Images are no longer premultiplied by cocos2d-x as they where in cocos2d-x v2, so the Spine atlas images *should* use premultiplied alpha.
-
-## Examples
-
-[Spineboy](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/3.2/example/Classes/SpineboyExample.cpp)
-[Golbins](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-cocos2dx/3.2/example/Classes/GoblinsExample.cpp)

+ 0 - 0
spine-cocos2dx/3.2/cocos2dx/Place cocos2dx here.txt


+ 0 - 91
spine-cocos2dx/3.2/example/Classes/AppDelegate.cpp

@@ -1,91 +0,0 @@
-#include "AppDelegate.h"
-
-#include <vector>
-#include <string>
-
-#include "SpineboyExample.h"
-#include "AppMacros.h"
-
-USING_NS_CC;
-using namespace std;
-
-AppDelegate::AppDelegate () {
-}
-
-AppDelegate::~AppDelegate () {
-}
-
-bool AppDelegate::applicationDidFinishLaunching () {
-	// initialize director
-	auto director = Director::getInstance();
-	auto glview = director->getOpenGLView();
-    if(!glview) {
-        glview = GLView::create("Spine Example");
-        director->setOpenGLView(glview);
-    }
-
-	// Set the design resolution
-#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
-	// a bug in DirectX 11 level9-x on the device prevents ResolutionPolicy::NO_BORDER from working correctly
-	glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::SHOW_ALL);
-#else
-	glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);
-#endif
-
-	Size frameSize = glview->getFrameSize();
-	
-	vector<string> searchPath;
-
-	// In this demo, we select resource according to the frame's height.
-	// If the resource size is different from design resolution size, you need to set contentScaleFactor.
-	// We use the ratio of resource's height to the height of design resolution,
-	// this can make sure that the resource's height could fit for the height of design resolution.
-	if (frameSize.height > mediumResource.size.height) {
-		// if the frame's height is larger than the height of medium resource size, select large resource.
-		searchPath.push_back(largeResource.directory);
-		director->setContentScaleFactor(MIN(largeResource.size.height/designResolutionSize.height, largeResource.size.width/designResolutionSize.width));
-	} else if (frameSize.height > smallResource.size.height) {
-		// if the frame's height is larger than the height of small resource size, select medium resource.
-		searchPath.push_back(mediumResource.directory);
-		director->setContentScaleFactor(MIN(mediumResource.size.height/designResolutionSize.height, mediumResource.size.width/designResolutionSize.width));
-	} else {
-		// if the frame's height is smaller than the height of medium resource size, select small resource.
-		searchPath.push_back(smallResource.directory);
-		director->setContentScaleFactor(MIN(smallResource.size.height/designResolutionSize.height, smallResource.size.width/designResolutionSize.width));
-	}
-	
-	searchPath.push_back("common");
-	 
-	// set searching path
-	FileUtils::getInstance()->setSearchPaths(searchPath);
-	
-	// turn on display FPS
-	director->setDisplayStats(true);
-
-	// set FPS. the default value is 1.0/60 if you don't call this
-	director->setAnimationInterval(1.0 / 60);
-
-	// create a scene. it's an autorelease object
-	auto scene = SpineboyExample::scene();
-
-	// run
-	director->runWithScene(scene);
-
-	return true;
-}
-
-// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
-void AppDelegate::applicationDidEnterBackground () {
-	Director::getInstance()->stopAnimation();
-
-	// if you use SimpleAudioEngine, it must be paused
-	// SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
-}
-
-// this function will be called when the app is active again
-void AppDelegate::applicationWillEnterForeground () {
-	Director::getInstance()->startAnimation();
-
-	// if you use SimpleAudioEngine, it must resume here
-	// SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
-}

+ 0 - 49
spine-cocos2dx/3.2/example/Classes/SpineboyExample.h

@@ -1,49 +0,0 @@
-/******************************************************************************
- * Spine Runtimes Software License
- * Version 2.1
- * 
- * Copyright (c) 2013, Esoteric Software
- * All rights reserved.
- * 
- * You are granted a perpetual, non-exclusive, non-sublicensable and
- * non-transferable license to install, execute and perform the Spine Runtimes
- * Software (the "Software") solely for internal use. Without the written
- * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE 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 _SPINEBOYEXAMPLE_H_
-#define _SPINEBOYEXAMPLE_H_
-
-#include "cocos2d.h"
-#include <spine/spine-cocos2dx.h>
-
-class SpineboyExample : public cocos2d::LayerColor {
-public:
-	static cocos2d::Scene* scene ();
-
-	virtual bool init ();
-	virtual void update (float deltaTime);
-
-	CREATE_FUNC (SpineboyExample);
-private:
-	spine::SkeletonAnimation* skeletonNode;
-};
-
-#endif // _SPINEBOYEXAMPLE_H_

+ 0 - 1081
spine-cocos2dx/3.2/example/Resources/common/goblins-ffd.json

@@ -1,1081 +0,0 @@
-{
-"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": "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 }
-],
-"slots": [
-	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
-	{ "name": "left arm", "bone": "left arm", "attachment": "left arm" },
-	{ "name": "left hand item", "bone": "left hand", "attachment": "spear" },
-	{ "name": "left hand", "bone": "left hand", "attachment": "left hand" },
-	{ "name": "left foot", "bone": "left foot", "attachment": "left foot" },
-	{ "name": "left lower leg", "bone": "left lower leg", "attachment": "left lower leg" },
-	{ "name": "left upper leg", "bone": "left upper leg", "attachment": "left upper leg" },
-	{ "name": "neck", "bone": "neck", "attachment": "neck" },
-	{ "name": "torso", "bone": "torso", "attachment": "torso" },
-	{ "name": "pelvis", "bone": "pelvis", "attachment": "pelvis" },
-	{ "name": "right foot", "bone": "right foot", "attachment": "right foot" },
-	{ "name": "right lower leg", "bone": "right lower leg", "attachment": "right lower leg" },
-	{ "name": "undie straps", "bone": "pelvis", "attachment": "undie straps" },
-	{ "name": "undies", "bone": "pelvis", "attachment": "undies" },
-	{ "name": "right upper leg", "bone": "right upper leg", "attachment": "right upper leg" },
-	{ "name": "head", "bone": "head", "attachment": "head" },
-	{ "name": "eyes", "bone": "head" },
-	{ "name": "right shoulder", "bone": "right shoulder", "attachment": "right shoulder" },
-	{ "name": "right arm", "bone": "right arm", "attachment": "right arm" },
-	{ "name": "right hand thumb", "bone": "right hand", "attachment": "right hand thumb" },
-	{ "name": "right hand item", "bone": "right hand", "attachment": "dagger" },
-	{ "name": "right hand", "bone": "right hand", "attachment": "right hand" },
-	{ "name": "right hand item 2", "bone": "right hand", "attachment": "shield" }
-],
-"skins": {
-	"default": {
-		"left hand item": {
-			"dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 },
-			"spear": {
-				"type": "skinnedmesh",
-				"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 ],
-				"hull": 14,
-				"width": 22,
-				"height": 368
-			}
-		},
-		"right hand item": {
-			"dagger": {
-				"type": "mesh",
-				"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,
-				"width": 26,
-				"height": 108
-			}
-		},
-		"right hand item 2": {
-			"shield": { "rotation": 93.49, "width": 70, "height": 72 }
-		}
-	},
-	"goblin": {
-		"eyes": {
-			"eyes closed": { "name": "goblin/eyes-closed", "x": 29.19, "y": -24.89, "rotation": -88.92, "width": 34, "height": 12 }
-		},
-		"head": {
-			"head": {
-				"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 ],
-				"hull": 24,
-				"width": 103,
-				"height": 66
-			}
-		},
-		"left arm": {
-			"left arm": {
-				"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 ],
-				"hull": 9,
-				"width": 37,
-				"height": 35
-			}
-		},
-		"left foot": {
-			"left foot": {
-				"name": "goblin/left-foot",
-				"type": "mesh",
-				"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,
-				"width": 65,
-				"height": 31
-			}
-		},
-		"left hand": {
-			"left hand": {
-				"name": "goblin/left-hand",
-				"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 ],
-				"hull": 9,
-				"width": 36,
-				"height": 41
-			}
-		},
-		"left lower leg": {
-			"left lower leg": {
-				"name": "goblin/left-lower-leg",
-				"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 ],
-				"hull": 11,
-				"width": 33,
-				"height": 70
-			}
-		},
-		"left shoulder": {
-			"left shoulder": {
-				"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 ],
-				"hull": 8,
-				"width": 29,
-				"height": 44
-			}
-		},
-		"left upper leg": {
-			"left upper leg": {
-				"name": "goblin/left-upper-leg",
-				"type": "mesh",
-				"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,
-				"width": 33,
-				"height": 73
-			}
-		},
-		"neck": {
-			"neck": {
-				"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 ],
-				"hull": 10,
-				"width": 36,
-				"height": 41
-			}
-		},
-		"pelvis": {
-			"pelvis": {
-				"name": "goblin/pelvis",
-				"type": "mesh",
-				"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,
-				"width": 62,
-				"height": 43
-			}
-		},
-		"right arm": {
-			"right arm": {
-				"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 ],
-				"hull": 8,
-				"width": 23,
-				"height": 50
-			}
-		},
-		"right foot": {
-			"right foot": {
-				"name": "goblin/right-foot",
-				"type": "mesh",
-				"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,
-				"width": 63,
-				"height": 33
-			}
-		},
-		"right hand": {
-			"right hand": {
-				"name": "goblin/right-hand",
-				"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 ],
-				"hull": 11,
-				"width": 36,
-				"height": 37
-			}
-		},
-		"right hand thumb": {
-			"right hand thumb": {
-				"name": "goblin/right-hand",
-				"type": "mesh",
-				"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,
-				"width": 36,
-				"height": 37
-			}
-		},
-		"right lower leg": {
-			"right lower leg": {
-				"name": "goblin/right-lower-leg",
-				"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 ],
-				"hull": 11,
-				"width": 36,
-				"height": 76
-			}
-		},
-		"right shoulder": {
-			"right shoulder": {
-				"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 ],
-				"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,
-				"width": 39,
-				"height": 45
-			}
-		},
-		"right upper leg": {
-			"right upper leg": {
-				"name": "goblin/right-upper-leg",
-				"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 ],
-				"hull": 10,
-				"width": 34,
-				"height": 63
-			}
-		},
-		"torso": {
-			"torso": {
-				"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 ],
-				"hull": 16,
-				"width": 68,
-				"height": 96
-			}
-		},
-		"undie straps": {
-			"undie straps": {
-				"name": "goblin/undie-straps",
-				"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 ],
-				"hull": 9,
-				"width": 55,
-				"height": 19
-			}
-		},
-		"undies": {
-			"undies": {
-				"name": "goblin/undies",
-				"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 ],
-				"hull": 10,
-				"width": 36,
-				"height": 29
-			}
-		}
-	},
-	"goblingirl": {
-		"eyes": {
-			"eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 }
-		},
-		"head": {
-			"head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 }
-		},
-		"left arm": {
-			"left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 }
-		},
-		"left foot": {
-			"left foot": { "name": "goblingirl/left-foot", "x": 25.17, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 }
-		},
-		"left hand": {
-			"left hand": {
-				"name": "goblingirl/left-hand",
-				"x": 4.34,
-				"y": 2.39,
-				"scaleX": 0.896,
-				"scaleY": 0.896,
-				"rotation": 30.34,
-				"width": 35,
-				"height": 40
-			}
-		},
-		"left lower leg": {
-			"left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.6, "rotation": 105.75, "width": 33, "height": 70 }
-		},
-		"left shoulder": {
-			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 }
-		},
-		"left upper leg": {
-			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 }
-		},
-		"neck": {
-			"neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 }
-		},
-		"pelvis": {
-			"pelvis": { "name": "goblingirl/pelvis", "x": -3.87, "y": 3.18, "width": 62, "height": 43 }
-		},
-		"right arm": {
-			"right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 }
-		},
-		"right foot": {
-			"right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.52, "width": 63, "height": 33 }
-		},
-		"right hand": {
-			"right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
-		},
-		"right hand thumb": {
-			"right hand thumb": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
-		},
-		"right lower leg": {
-			"right lower leg": { "name": "goblingirl/right-lower-leg", "x": 26.15, "y": -3.27, "rotation": 111.83, "width": 36, "height": 76 }
-		},
-		"right shoulder": {
-			"right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 }
-		},
-		"right upper leg": {
-			"right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.69, "y": 2.13, "rotation": 97.49, "width": 34, "height": 63 }
-		},
-		"torso": {
-			"torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 }
-		},
-		"undie straps": {
-			"undie straps": { "name": "goblingirl/undie-straps", "x": -1.51, "y": 14.18, "width": 55, "height": 19 }
-		},
-		"undies": {
-			"undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.7, "width": 36, "height": 29 }
-		}
-	}
-},
-"animations": {
-	"walk": {
-		"slots": {
-			"eyes": {
-				"attachment": [
-					{ "time": 0.7, "name": "eyes closed" },
-					{ "time": 0.8, "name": null }
-				]
-			}
-		},
-		"bones": {
-			"left upper leg": {
-				"rotate": [
-					{ "time": 0, "angle": -26.55 },
-					{ "time": 0.1333, "angle": -8.78 },
-					{ "time": 0.2333, "angle": 9.51 },
-					{ "time": 0.3666, "angle": 30.74 },
-					{ "time": 0.5, "angle": 25.33 },
-					{ "time": 0.6333, "angle": 26.11 },
-					{ "time": 0.7333, "angle": 7.45 },
-					{ "time": 0.8666, "angle": -21.19 },
-					{ "time": 1, "angle": -26.55 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.32, "y": 1.7 },
-					{ "time": 0.3666, "x": -0.06, "y": 2.42 },
-					{ "time": 1, "x": -1.32, "y": 1.7 }
-				]
-			},
-			"right upper leg": {
-				"rotate": [
-					{ "time": 0, "angle": 42.45 },
-					{
-						"time": 0.1333,
-						"angle": 49.86,
-						"curve": [ 0.414, 0, 0.705, 0.99 ]
-					},
-					{ "time": 0.2333, "angle": 22.51 },
-					{ "time": 0.5, "angle": -16.93 },
-					{ "time": 0.6333, "angle": 1.89 },
-					{
-						"time": 0.7333,
-						"angle": 34.86,
-						"curve": [ 0.462, 0.11, 1, 1 ]
-					},
-					{
-						"time": 0.8666,
-						"angle": 58.68,
-						"curve": [ 0.5, 0.02, 1, 1 ]
-					},
-					{ "time": 1, "angle": 42.45 }
-				],
-				"translate": [
-					{ "time": 0, "x": 6.23, "y": 0 },
-					{ "time": 0.2333, "x": 2.14, "y": 2.4 },
-					{ "time": 0.5, "x": 2.44, "y": 4.8 },
-					{ "time": 1, "x": 6.23, "y": 0 }
-				]
-			},
-			"left lower leg": {
-				"rotate": [
-					{ "time": 0, "angle": -18.05 },
-					{ "time": 0.1333, "angle": -63.5 },
-					{ "time": 0.2333, "angle": -83.01 },
-					{ "time": 0.5, "angle": 5.11 },
-					{ "time": 0.6333, "angle": -28.29 },
-					{ "time": 0.7333, "angle": -27.52 },
-					{ "time": 0.8666, "angle": 3.53 },
-					{ "time": 1, "angle": -18.05 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.2333, "x": 2.55, "y": -0.47 },
-					{ "time": 0.5, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 1, "x": 0, "y": 0 }
-				]
-			},
-			"left foot": {
-				"rotate": [
-					{ "time": 0, "angle": -14.56 },
-					{ "time": 0.1333, "angle": -10.42 },
-					{ "time": 0.2333, "angle": -5.01 },
-					{ "time": 0.3, "angle": 6.67 },
-					{ "time": 0.3666, "angle": 3.87 },
-					{ "time": 0.5, "angle": -3.87 },
-					{ "time": 0.6333, "angle": 2.78 },
-					{ "time": 0.7333, "angle": -11.99 },
-					{ "time": 0.8666, "angle": -12.45 },
-					{ "time": 1, "angle": -14.56 }
-				]
-			},
-			"right shoulder": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 5.29,
-						"curve": [ 0.264, 0, 0.75, 1 ]
-					},
-					{ "time": 0.6333, "angle": 6.65 },
-					{ "time": 1, "angle": 5.29 }
-				]
-			},
-			"right arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -4.02,
-						"curve": [ 0.267, 0, 0.804, 0.99 ]
-					},
-					{
-						"time": 0.6333,
-						"angle": 19.78,
-						"curve": [ 0.307, 0, 0.787, 0.99 ]
-					},
-					{ "time": 1, "angle": -4.02 }
-				]
-			},
-			"right hand": {
-				"rotate": [
-					{ "time": 0, "angle": 8.98 },
-					{ "time": 0.6333, "angle": 0.51 },
-					{ "time": 1, "angle": 8.98 }
-				]
-			},
-			"left shoulder": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 6.25,
-						"curve": [ 0.339, 0, 0.683, 1 ]
-					},
-					{
-						"time": 0.5,
-						"angle": -11.78,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
-					},
-					{ "time": 1, "angle": 6.25 }
-				],
-				"translate": [
-					{ "time": 0, "x": 1.15, "y": 0.23 }
-				]
-			},
-			"left hand": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -21.23,
-						"curve": [ 0.295, 0, 0.755, 0.98 ]
-					},
-					{
-						"time": 0.5,
-						"angle": -27.28,
-						"curve": [ 0.241, 0, 0.75, 0.97 ]
-					},
-					{ "time": 1, "angle": -21.23 }
-				]
-			},
-			"left arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 28.37,
-						"curve": [ 0.339, 0, 0.683, 1 ]
-					},
-					{
-						"time": 0.5,
-						"angle": 60.09,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
-					},
-					{ "time": 1, "angle": 28.37 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -10.28 },
-					{
-						"time": 0.1333,
-						"angle": -15.38,
-						"curve": [ 0.545, 0, 0.818, 1 ]
-					},
-					{
-						"time": 0.3666,
-						"angle": -9.78,
-						"curve": [ 0.58, 0.17, 0.669, 0.99 ]
-					},
-					{
-						"time": 0.6333,
-						"angle": -15.75,
-						"curve": [ 0.235, 0.01, 0.795, 1 ]
-					},
-					{
-						"time": 0.8666,
-						"angle": -7.06,
-						"curve": [ 0.209, 0, 0.816, 0.98 ]
-					},
-					{ "time": 1, "angle": -10.28 }
-				],
-				"translate": [
-					{ "time": 0, "x": -3.72, "y": -0.01 }
-				]
-			},
-			"right foot": {
-				"rotate": [
-					{ "time": 0, "angle": -5.25 },
-					{ "time": 0.2333, "angle": -17.76 },
-					{ "time": 0.3666, "angle": -20.09 },
-					{ "time": 0.5, "angle": -19.73 },
-					{ "time": 0.7333, "angle": -11.68 },
-					{ "time": 0.8, "angle": 4.46 },
-					{ "time": 0.8666, "angle": 0.46 },
-					{ "time": 1, "angle": -5.25 }
-				]
-			},
-			"right lower leg": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -3.39,
-						"curve": [ 0.316, 0.01, 0.741, 0.98 ]
-					},
-					{
-						"time": 0.1333,
-						"angle": -43.21,
-						"curve": [ 0.414, 0, 0.705, 0.99 ]
-					},
-					{ "time": 0.2333, "angle": -25.98 },
-					{ "time": 0.5, "angle": -19.53 },
-					{ "time": 0.6333, "angle": -64.8 },
-					{
-						"time": 0.7333,
-						"angle": -89.54,
-						"curve": [ 0.557, 0.18, 1, 1 ]
-					},
-					{ "time": 1, "angle": -3.39 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.6333, "x": 2.18, "y": 0.21 },
-					{ "time": 1, "x": 0, "y": 0 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 1, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": -8.4 },
-					{
-						"time": 0.1333,
-						"x": 0,
-						"y": -9.35,
-						"curve": [ 0.326, 0.05, 0.674, 0.93 ]
-					},
-					{
-						"time": 0.2333,
-						"x": 0,
-						"y": -0.59,
-						"curve": [ 0.325, 0.39, 0.643, 0.7 ]
-					},
-					{ "time": 0.3666, "x": 0, "y": -3.96 },
-					{ "time": 0.5, "x": 0, "y": -8.4 },
-					{
-						"time": 0.6333,
-						"x": 0,
-						"y": -10,
-						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
-					},
-					{
-						"time": 0.7333,
-						"x": 0,
-						"y": -5.29,
-						"curve": [ 0.333, 0.36, 0.662, 0.69 ]
-					},
-					{
-						"time": 0.8,
-						"x": 0,
-						"y": -2.49,
-						"curve": [ 0.322, 0.35, 0.651, 0.68 ]
-					},
-					{ "time": 0.8666, "x": 0, "y": -3.96 },
-					{ "time": 1, "x": 0, "y": -8.4 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 3.6 },
-					{ "time": 0.1333, "angle": 17.49 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
-					{ "time": 0.5, "angle": 5.17 },
-					{ "time": 0.6333, "angle": 18.36 },
-					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
-					{ "time": 1, "angle": 3.6 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 3.6,
-						"curve": [ 0, 0, 0.704, 1.17 ]
-					},
-					{ "time": 0.1333, "angle": -0.2 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
-					{
-						"time": 0.5,
-						"angle": 5.17,
-						"curve": [ 0, 0, 0.704, 1.61 ]
-					},
-					{ "time": 0.6666, "angle": 1.1 },
-					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
-					{ "time": 1, "angle": 3.6 }
-				]
-			},
-			"pelvis": {
-				"rotate": [
-					{ "time": 0, "angle": -1.33 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0.39, "y": -0.78 }
-				]
-			},
-			"spear1": {
-				"rotate": [
-					{ "time": 0, "angle": 1.84 },
-					{ "time": 0.2, "angle": -5.38 },
-					{ "time": 0.5, "angle": 2.95 },
-					{ "time": 0.7333, "angle": -3.67 },
-					{ "time": 1, "angle": 1.84 }
-				]
-			},
-			"spear2": {
-				"rotate": [
-					{ "time": 0, "angle": 1.84 },
-					{ "time": 0.2, "angle": -5.38 },
-					{ "time": 0.5, "angle": 2.95 },
-					{ "time": 0.7333, "angle": -3.67 },
-					{ "time": 1, "angle": 1.84 }
-				]
-			},
-			"spear3": {
-				"rotate": [
-					{ "time": 0, "angle": 3.64 },
-					{ "time": 0.2, "angle": -3.59 },
-					{ "time": 0.5, "angle": 4.74 },
-					{ "time": 0.7333, "angle": -1.87 },
-					{ "time": 1, "angle": 3.64 }
-				]
-			}
-		},
-		"ffd": {
-			"default": {
-				"left hand item": {
-					"spear": [
-						{ "time": 0 }
-					]
-				},
-				"right hand item": {
-					"dagger": [
-						{
-							"time": 0,
-							"offset": 26,
-							"vertices": [ 2.34, 0.14 ],
-							"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 ],
-							"curve": [ 0.25, 0, 0.75, 1 ]
-						},
-						{
-							"time": 1,
-							"offset": 26,
-							"vertices": [ 2.34, 0.14 ]
-						}
-					]
-				}
-			},
-			"goblin": {
-				"head": {
-					"head": [
-						{
-							"time": 0,
-							"curve": [ 0.632, 0, 0.75, 1 ]
-						},
-						{
-							"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 ],
-							"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 ],
-							"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 ],
-							"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 ],
-							"curve": [ 0.25, 0, 0.75, 1 ]
-						},
-						{ "time": 1 }
-					]
-				},
-				"left foot": {
-					"left foot": [
-						{
-							"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 ]
-						},
-						{ "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 ]
-						},
-						{
-							"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 ]
-						},
-						{ "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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						}
-					]
-				},
-				"pelvis": {
-					"pelvis": [
-						{ "time": 0 },
-						{
-							"time": 0.1333,
-							"offset": 6,
-							"vertices": [ -0.68, -4.13 ]
-						},
-						{
-							"time": 0.3333,
-							"offset": 6,
-							"vertices": [ -1.04, -3.1 ]
-						},
-						{
-							"time": 0.7,
-							"offset": 6,
-							"vertices": [ -1.42, -6.3 ]
-						},
-						{
-							"time": 0.8666,
-							"offset": 6,
-							"vertices": [ -1.13, -1.79 ]
-						},
-						{ "time": 1 }
-					]
-				},
-				"right foot": {
-					"right foot": [
-						{ "time": 0 },
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{ "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 ]
-						},
-						{
-							"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 ]
-						},
-						{ "time": 0.8666 }
-					]
-				},
-				"right hand": {
-					"right hand": [
-						{
-							"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 ]
-						},
-						{ "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 ]
-						}
-					]
-				},
-				"right lower leg": {
-					"right lower leg": [
-						{ "time": 0 },
-						{
-							"time": 0.6,
-							"offset": 6,
-							"vertices": [ 1.8, -1.56 ]
-						},
-						{ "time": 1 }
-					]
-				},
-				"right upper leg": {
-					"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 ]
-						},
-						{ "time": 0.3333 },
-						{
-							"time": 0.8666,
-							"offset": 14,
-							"vertices": [ 0.13, -2.35, -1.33, -5.99, -1.35, -4.43 ]
-						},
-						{
-							"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 ]
-						}
-					]
-				},
-				"torso": {
-					"torso": [
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						}
-					]
-				},
-				"undie straps": {
-					"undie straps": [
-						{
-							"time": 0,
-							"offset": 2,
-							"vertices": [ -1.77, 0.54, -0.96, -1.03, -0.39, -0.24, -1.77, 0.54 ]
-						},
-						{
-							"time": 0.1333,
-							"offset": 2,
-							"vertices": [ -2.25, -1.03, -1.49, -4.23, -0.74, -2.84, -1.9, 0.54 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"time": 0.7,
-							"offset": 2,
-							"vertices": [ -0.91, -2.76, -0.62, -3.63, -0.84, -2.26, -2.56, 0.52 ]
-						},
-						{
-							"time": 0.8666,
-							"offset": 2,
-							"vertices": [ -2.56, 0.52, -1.58, 0.32, -1.38, 0.32, -2.56, 0.52 ]
-						},
-						{
-							"time": 1,
-							"offset": 2,
-							"vertices": [ -1.77, 0.54, -0.8, 0.53, -0.8, 0.53, -1.77, 0.54 ]
-						}
-					]
-				},
-				"undies": {
-					"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						},
-						{
-							"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 ]
-						}
-					]
-				}
-			}
-		}
-	}
-}
-}

+ 0 - 2412
spine-cocos2dx/3.2/example/Resources/common/spineboy.json

@@ -1,2412 +0,0 @@
-{
-"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": "front_bracer",
-		"parent": "front_upper_arm",
-		"length": 40.57,
-		"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" }
-],
-"slots": [
-	{ "name": "rear_upper_arm", "bone": "rear_upper_arm", "attachment": "rear_upper_arm" },
-	{ "name": "rear_bracer", "bone": "rear_bracer", "attachment": "rear_bracer" },
-	{ "name": "gun", "bone": "gun", "attachment": "gun" },
-	{ "name": "rear_foot", "bone": "rear_foot", "attachment": "rear_foot" },
-	{ "name": "rear_thigh", "bone": "rear_thigh", "attachment": "rear_thigh" },
-	{ "name": "rear_shin", "bone": "rear_shin", "attachment": "rear_shin" },
-	{ "name": "neck", "bone": "neck", "attachment": "neck" },
-	{ "name": "torso", "bone": "torso", "attachment": "torso" },
-	{ "name": "front_upper_arm", "bone": "front_upper_arm", "attachment": "front_upper_arm" },
-	{ "name": "head", "bone": "head", "attachment": "head" },
-	{ "name": "eye", "bone": "head", "attachment": "eye_indifferent" },
-	{ "name": "front_thigh", "bone": "front_thigh", "attachment": "front_thigh" },
-	{ "name": "front_foot", "bone": "front_foot", "attachment": "front_foot" },
-	{ "name": "front_shin", "bone": "front_shin", "attachment": "front_shin" },
-	{ "name": "mouth", "bone": "head", "attachment": "mouth_smile" },
-	{ "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 }
-],
-"skins": {
-	"default": {
-		"eye": {
-			"eye_indifferent": { "x": 85.72, "y": -28.18, "rotation": -70.63, "width": 93, "height": 89 },
-			"eye_surprised": { "x": 85.72, "y": -28.18, "rotation": -70.63, "width": 93, "height": 89 }
-		},
-		"front_bracer": {
-			"front_bracer": { "x": 12.03, "y": -1.67, "rotation": 79.59, "width": 58, "height": 80 }
-		},
-		"front_fist": {
-			"front_fist_closed": { "x": 35.49, "y": 6, "rotation": 67.16, "width": 75, "height": 82 },
-			"front_fist_open": { "x": 39.56, "y": 7.76, "rotation": 67.16, "width": 86, "height": 87 }
-		},
-		"front_foot": {
-			"front_foot": { "x": 29.51, "y": 7.83, "rotation": 18.68, "width": 126, "height": 69 },
-			"front_foot_bend1": { "x": 29.51, "y": 7.83, "rotation": 18.68, "width": 128, "height": 70 },
-			"front_foot_bend2": { "x": 16.07, "y": 13.83, "rotation": 18.68, "width": 108, "height": 93 }
-		},
-		"front_shin": {
-			"front_shin": { "x": 55.11, "y": -3.54, "rotation": 96.59, "width": 82, "height": 184 }
-		},
-		"front_thigh": {
-			"front_thigh": { "x": 42.47, "y": 4.44, "rotation": 84.86, "width": 48, "height": 112 }
-		},
-		"front_upper_arm": {
-			"front_upper_arm": { "x": 28.3, "y": 7.37, "rotation": 97.89, "width": 54, "height": 97 }
-		},
-		"goggles": {
-			"goggles": { "x": 97.07, "y": 6.54, "rotation": -70.63, "width": 261, "height": 166 }
-		},
-		"gun": {
-			"gun": { "x": 77.3, "y": 16.4, "rotation": 60.82, "width": 210, "height": 203 }
-		},
-		"head": {
-			"head": { "x": 128.95, "y": 0.29, "rotation": -70.63, "width": 271, "height": 298 }
-		},
-		"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 },
-			"mouth_smile": { "x": 23.68, "y": -32.23, "rotation": -70.63, "width": 93, "height": 59 }
-		},
-		"muzzle": {
-			"muzzle": { "x": 18.25, "y": 5.44, "rotation": 0.15, "width": 462, "height": 400 }
-		},
-		"neck": {
-			"neck": { "x": 9.76, "y": -3.01, "rotation": -55.22, "width": 36, "height": 41 }
-		},
-		"rear_bracer": {
-			"rear_bracer": { "x": 11.15, "y": -2.2, "rotation": 66.17, "width": 56, "height": 72 }
-		},
-		"rear_foot": {
-			"rear_foot": { "x": 31.51, "y": 3.57, "rotation": 23.07, "width": 113, "height": 60 },
-			"rear_foot_bend1": { "x": 34.39, "y": 4.8, "rotation": 23.07, "width": 117, "height": 66 },
-			"rear_foot_bend2": { "x": 30.38, "y": 12.62, "rotation": 23.07, "width": 103, "height": 83 }
-		},
-		"rear_shin": {
-			"rear_shin": { "x": 58.29, "y": -2.75, "rotation": 92.37, "width": 75, "height": 178 }
-		},
-		"rear_thigh": {
-			"rear_thigh": { "x": 33.1, "y": -4.11, "rotation": 72.54, "width": 65, "height": 104 }
-		},
-		"rear_upper_arm": {
-			"rear_upper_arm": { "x": 21.12, "y": 4.08, "rotation": 89.32, "width": 47, "height": 87 }
-		},
-		"torso": {
-			"torso": { "x": 63.61, "y": 7.12, "rotation": -94.53, "width": 98, "height": 180 }
-		}
-	}
-},
-"events": {
-	"footstep": {},
-	"headAttach": { "int": 3, "float": 4 },
-	"headBehind": { "int": 5, "float": 6, "string": "setup" },
-	"headPop": { "int": 1, "float": 2 }
-},
-"animations": {
-	"death": {
-		"slots": {
-			"eye": {
-				"attachment": [
-					{ "time": 0, "name": "eye_surprised" },
-					{ "time": 0.4666, "name": "eye_indifferent" },
-					{ "time": 2.2333, "name": "eye_surprised" },
-					{ "time": 4.5333, "name": "eye_indifferent" }
-				]
-			},
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_oooo" },
-					{ "time": 2.2333, "name": "mouth_grind" },
-					{ "time": 4.5333, "name": "mouth_oooo" }
-				]
-			}
-		},
-		"bones": {
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": -2.82 },
-					{ "time": 0.1333, "angle": -28.74 },
-					{ "time": 0.2333, "angle": 11.42 },
-					{ "time": 0.3333, "angle": -50.24 },
-					{ "time": 0.4, "angle": -72.66, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -72.66 },
-					{ "time": 0.5, "angle": -20.24 },
-					{ "time": 0.5666, "angle": -85.28, "curve": "stepped" },
-					{ "time": 0.9333, "angle": -85.28, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -85.28 },
-					{ "time": 2.5, "angle": -51.96, "curve": "stepped" },
-					{ "time": 4.5333, "angle": -51.96 },
-					{ "time": 4.6666, "angle": -85.28 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": -2.82 },
-					{ "time": 0.1333, "angle": 12.35 },
-					{ "time": 0.2333, "angle": 29.89 },
-					{ "time": 0.3, "angle": 70.36 },
-					{ "time": 0.4, "angle": -10.22, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -10.22 },
-					{ "time": 0.5, "angle": 2.92 },
-					{ "time": 0.5666, "angle": 47.94, "curve": "stepped" },
-					{ "time": 2.2333, "angle": 47.94 },
-					{ "time": 2.5, "angle": 18.5, "curve": "stepped" },
-					{ "time": 4.5333, "angle": 18.5 },
-					{ "time": 4.6666, "angle": 47.94 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -8.61 },
-					{ "time": 0.1333, "angle": 28.19 },
-					{ "time": 0.2666, "angle": -280.19 },
-					{ "time": 0.4, "angle": -237.22, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -237.22 },
-					{ "time": 0.5, "angle": 76.03, "curve": "stepped" },
-					{ "time": 0.8, "angle": 76.03, "curve": "stepped" },
-					{ "time": 0.9333, "angle": 76.03, "curve": "stepped" },
-					{ "time": 2.2333, "angle": 76.03 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 2.2333, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -38.85 },
-					{ "time": 0.1333, "angle": -299.58 },
-					{ "time": 0.2666, "angle": -244.74 },
-					{ "time": 0.4, "angle": -292.35 },
-					{ "time": 0.4333, "angle": -315.84 },
-					{ "time": 0.5, "angle": -347.94 },
-					{ "time": 0.7, "angle": -347.33, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -347.33 },
-					{ "time": 2.7, "angle": -290.68 },
-					{ "time": 2.7666, "angle": -285.1 },
-					{ "time": 4.6666, "angle": -290.68 },
-					{ "time": 4.8, "angle": 8.61 },
-					{ "time": 4.8666, "angle": 10.94 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -44.69 },
-					{ "time": 0.1333, "angle": 112.26 },
-					{ "time": 0.2666, "angle": 129.07 },
-					{ "time": 0.4, "angle": 134.94, "curve": "stepped" },
-					{ "time": 0.4333, "angle": 134.94 },
-					{ "time": 0.5666, "angle": 172.6, "curve": "stepped" },
-					{ "time": 0.9333, "angle": 172.6, "curve": "stepped" },
-					{ "time": 2.2333, "angle": 172.6 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 21.88 },
-					{ "time": 0.1333, "angle": 11.48 },
-					{ "time": 0.2666, "angle": -18.81 },
-					{ "time": 0.4, "angle": -18.92 },
-					{ "time": 0.4333, "angle": -18.28 },
-					{ "time": 0.5, "angle": 60.61 },
-					{ "time": 0.7, "angle": -18.87, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -18.87 },
-					{ "time": 2.7, "angle": -1.95, "curve": "stepped" },
-					{ "time": 4.6666, "angle": -1.95 },
-					{ "time": 4.8, "angle": 34.55 },
-					{ "time": 4.9333, "angle": -18.74 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": -2.33 },
-					{ "time": 0.2666, "angle": 26.34 },
-					{ "time": 0.7, "angle": -6.07, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -6.07 },
-					{ "time": 2.7, "angle": 5.72, "curve": "stepped" },
-					{ "time": 4.6666, "angle": 5.72 },
-					{ "time": 4.8666, "angle": -6.52 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 10.36 },
-					{ "time": 0.1333, "angle": -23.12 },
-					{ "time": 0.2666, "angle": -23.11 },
-					{ "time": 0.4, "angle": -23.16, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -23.16 },
-					{ "time": 0.5666, "angle": -23.2, "curve": "stepped" },
-					{ "time": 0.9333, "angle": -23.2, "curve": "stepped" },
-					{ "time": 2.2333, "angle": -23.2 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": -2.78 },
-					{ "time": 0.1333, "angle": -24.58 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 0.9333, "angle": 0, "curve": "stepped" },
-					{ "time": 2.2333, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.2, "x": 50.34, "y": 151.73 },
-					{ "time": 0.4, "x": 5.16, "y": -119.64, "curve": "stepped" },
-					{ "time": 0.4333, "x": 5.16, "y": -119.64 },
-					{ "time": 0.5, "x": 50.34, "y": -205.18, "curve": "stepped" },
-					{ "time": 0.8, "x": 50.34, "y": -205.18, "curve": "stepped" },
-					{ "time": 0.9333, "x": 50.34, "y": -205.18, "curve": "stepped" },
-					{ "time": 2.2333, "x": 50.34, "y": -205.18 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": 8.47 },
-					{ "time": 0.2666, "angle": 115.95 },
-					{ "time": 0.4, "angle": 180.66, "curve": "stepped" },
-					{ "time": 0.4333, "angle": 180.66 },
-					{ "time": 0.5, "angle": 155.22 },
-					{ "time": 0.6, "angle": 97.73 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": -27.37 },
-					{ "time": 0.2666, "angle": -35.1 },
-					{ "time": 0.4, "angle": -37.72, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -37.72 },
-					{ "time": 0.5, "angle": -40.06 },
-					{ "time": 0.6, "angle": 2.76 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": 70.45 },
-					{ "time": 0.2666, "angle": 155.34 },
-					{ "time": 0.4, "angle": 214.31, "curve": "stepped" },
-					{ "time": 0.4333, "angle": 214.31 },
-					{ "time": 0.5, "angle": 169.67 },
-					{ "time": 0.8, "angle": 83.27 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": 18.93 },
-					{ "time": 0.2666, "angle": -21.04 },
-					{ "time": 0.4, "angle": -29.93, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -29.93 },
-					{ "time": 0.5, "angle": -16.79 },
-					{ "time": 0.8, "angle": 7.77 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": -11.62 },
-					{ "time": 0.4, "angle": -45.59, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -45.59 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.4, "angle": -48.75, "curve": "stepped" },
-					{ "time": 0.4333, "angle": -48.75 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"gunTip": {
-				"rotate": [
-					{ "time": 0, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			}
-		}
-	},
-	"hit": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0.1666, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_grind" },
-					{ "time": 0.3333, "name": "mouth_smile" }
-				]
-			}
-		},
-		"bones": {
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": 56.42 },
-					{ "time": 0.3333, "angle": 8.89 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 35.38 },
-					{ "time": 0.2333, "angle": 24.94 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 10.21 },
-					{ "time": 0.3333, "angle": -41.3 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -310.92,
-						"curve": [ 0.38, 0.53, 0.744, 1 ]
-					},
-					{ "time": 0.3333, "angle": -112.59 }
-				],
-				"translate": [
-					{ "time": 0, "x": 7.23, "y": -13.13 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 36.99 },
-					{ "time": 0.3333, "angle": -28.64 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": 13.59 },
-					{ "time": 0.3333, "angle": 7.55 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 271.02,
-						"curve": [ 0.342, 0.36, 0.68, 0.71 ]
-					},
-					{ "time": 0.3333, "angle": -15.84 }
-				],
-				"translate": [
-					{ "time": 0.3333, "x": -0.09, "y": -0.46 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.3333, "angle": 40.03 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": 14.98 },
-					{ "time": 0.3333, "angle": 39.75 }
-				]
-			},
-			"hip": {
-				"translate": [
-					{ "time": 0, "x": -75.54, "y": -78.03 },
-					{ "time": 0.2333, "x": -36.48, "y": 12.42 },
-					{ "time": 0.3333, "x": -36.48, "y": -2.99 }
-				]
-			},
-			"front_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 90.94,
-						"curve": [ 0.227, 0.26, 0.432, 1 ]
-					},
-					{ "time": 0.3333, "angle": 32.02 }
-				],
-				"translate": [
-					{ "time": 0, "x": 7.21, "y": -4 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 40.51,
-						"curve": [ 0.295, 0.3, 0.59, 0.99 ]
-					},
-					{ "time": 0.3333, "angle": 90.76 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.96, "y": -0.32 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{ "time": 0, "angle": -96.62 },
-					{ "time": 0.3333, "angle": -15.13 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 7.99 },
-					{ "time": 0.3333, "angle": -67.54 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 5.4 },
-					{ "time": 0.3333, "angle": -16.26 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 2.67 },
-					{ "time": 0.3333, "angle": -10.31 }
-				]
-			}
-		}
-	},
-	"idle": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_open" },
-					{ "time": 1.6666, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_smile" },
-					{ "time": 1.6666, "name": "mouth_smile" }
-				]
-			}
-		},
-		"bones": {
-			"torso": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -5.61,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.8333,
-						"angle": -9.65,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -5.61 }
-				],
-				"translate": [
-					{ "time": 0, "x": -6.49, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -59.85,
-						"curve": [ 0.492, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -54.31,
-						"curve": [ 0.324, 0.11, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -59.85 }
-				],
-				"translate": [
-					{ "time": 0, "x": -7.12, "y": -8.23 },
-					{ "time": 0.6666, "x": -6.32, "y": -8.3 },
-					{ "time": 1.6666, "x": -7.12, "y": -8.23 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 62.41,
-						"curve": [ 0.504, 0.02, 0.75, 1 ]
-					},
-					{
-						"time": 0.7333,
-						"angle": 43.83,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": 62.41 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.83, "y": -16.78 },
-					{ "time": 0.6666, "x": 0.34, "y": -15.23 },
-					{ "time": 1.6666, "x": -1.83, "y": -16.78 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": 2.39 },
-					{ "time": 1.6666, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.88, "y": -4.76, "curve": "stepped" },
-					{ "time": 1.6666, "x": -1.88, "y": -4.76 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 0.64,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -4.34,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": 0.64 }
-				],
-				"translate": [
-					{ "time": 0, "x": -13.39, "y": 6.69, "curve": "stepped" },
-					{ "time": 1.6666, "x": -13.39, "y": 6.69 }
-				],
-				"scale": [
-					{
-						"time": 0,
-						"x": 0.896,
-						"y": 1,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 0.825,
-						"y": 1,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "x": 0.896, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{ "time": 0, "angle": -19.28, "curve": "stepped" },
-					{ "time": 1.6666, "angle": -19.28 }
-				],
-				"scale": [
-					{
-						"time": 0,
-						"x": 1,
-						"y": 1,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 0.994,
-						"y": 1,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 30.5,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 40.15,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": 30.5 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -23.83,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -43.77,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": -23.83 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 5.13,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 10.04,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": 5.13 }
-				],
-				"scale": [
-					{ "time": 0, "x": 0.755, "y": 1.309, "curve": "stepped" },
-					{ "time": 1.6666, "x": 0.755, "y": 1.309 }
-				]
-			},
-			"hip": {
-				"translate": [
-					{
-						"time": 0,
-						"x": -6.63,
-						"y": -23.01,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 6.27,
-						"y": -35,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "x": -6.63, "y": -23.01 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -7.34,
-						"curve": [ 0.235, 0, 0.558, 0.99 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 3.85,
-						"curve": [ 0.594, 0, 0.653, 1 ]
-					},
-					{ "time": 1.6666, "angle": -7.34 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -17.16,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 12.52,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -17.16 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -5.51,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -3.12,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -5.51 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 45.46,
-						"curve": [ 0.492, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": 41.33,
-						"curve": [ 0.32, 0.1, 0.736, 0.91 ]
-					},
-					{ "time": 1.6666, "angle": 45.46 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 0,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -15.59,
-						"curve": [ 0.732, 0, 0.769, 0.99 ]
-					},
-					{ "time": 1.6666, "angle": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -6.84,
-						"curve": [ 0.492, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -14.63,
-						"curve": [ 0.324, 0.11, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "angle": -6.84 }
-				],
-				"scale": [
-					{
-						"time": 0,
-						"x": 1,
-						"y": 1,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 0.689,
-						"y": 1.1,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 1.6666, "x": 1, "y": 1 }
-				]
-			}
-		}
-	},
-	"jump": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_open" },
-					{ "time": 0.2, "name": "front_fist_closed" },
-					{ "time": 0.6666, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_grind" }
-				]
-			},
-			"torso": {
-				"attachment": [
-					{ "time": 0, "name": "torso" }
-				]
-			}
-		},
-		"bones": {
-			"front_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 91.53,
-						"curve": [ 0.278, 0.46, 0.763, 1 ]
-					},
-					{
-						"time": 0.2,
-						"angle": -35.83,
-						"curve": [ 0.761, 0, 0.75, 1 ]
-					},
-					{ "time": 0.4333, "angle": 127.74 },
-					{
-						"time": 0.7333,
-						"angle": 48.18,
-						"curve": [ 0.227, 0.26, 0.432, 1 ]
-					},
-					{ "time": 0.8333, "angle": 25.35 },
-					{ "time": 0.9333, "angle": 45.37 },
-					{ "time": 1.0333, "angle": 38.12 },
-					{ "time": 1.1333, "angle": 25.35 },
-					{ "time": 1.3333, "angle": 91.53 }
-				],
-				"translate": [
-					{ "time": 0, "x": -2.56, "y": 5.77 },
-					{ "time": 0.4333, "x": 8.3, "y": 7.98 },
-					{ "time": 0.7333, "x": 7.21, "y": -4 },
-					{ "time": 1.3333, "x": -2.56, "y": 5.77 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -42.63 },
-					{ "time": 0.2, "angle": -5.74 },
-					{ "time": 0.4333, "angle": -50.76 },
-					{ "time": 0.7333, "angle": 1.89 },
-					{ "time": 0.8333, "angle": 11.58 },
-					{ "time": 0.9666, "angle": -1.89 },
-					{ "time": 1.1333, "angle": 11.58 },
-					{ "time": 1.3333, "angle": -42.63 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": -26.32 },
-					{ "time": 0.2, "angle": 121.44 },
-					{ "time": 0.4333, "angle": 70.54 },
-					{
-						"time": 0.7333,
-						"angle": 79.89,
-						"curve": [ 0.295, 0.3, 0.59, 0.99 ]
-					},
-					{ "time": 0.8333, "angle": 99.12 },
-					{ "time": 0.9333, "angle": 74.05 },
-					{ "time": 1.0333, "angle": 98.04 },
-					{ "time": 1.1333, "angle": 99.12 },
-					{ "time": 1.3333, "angle": -26.32 }
-				],
-				"translate": [
-					{ "time": 0, "x": -0.56, "y": -0.32 },
-					{ "time": 0.4333, "x": -8.5, "y": 10.58 },
-					{ "time": 0.7333, "x": -1.96, "y": -0.32 },
-					{ "time": 1.3333, "x": -0.56, "y": -0.32 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": -78.69 },
-					{ "time": 0.4333, "angle": -55.56 },
-					{ "time": 0.7333, "angle": -62.84 },
-					{ "time": 0.8333, "angle": -80.74 },
-					{ "time": 0.9333, "angle": -41.12 },
-					{ "time": 1.0333, "angle": -77.4 },
-					{ "time": 1.1333, "angle": -80.74 },
-					{ "time": 1.3333, "angle": -78.69 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.7333, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -22.61 },
-					{ "time": 0.2, "angle": -246.68 },
-					{
-						"time": 0.6,
-						"angle": 11.28,
-						"curve": [ 0.246, 0, 0.633, 0.53 ]
-					},
-					{
-						"time": 0.7333,
-						"angle": -57.45,
-						"curve": [ 0.38, 0.53, 0.744, 1 ]
-					},
-					{ "time": 0.8666, "angle": -112.59 },
-					{ "time": 0.9333, "angle": -102.17 },
-					{ "time": 1.0333, "angle": -108.61 },
-					{ "time": 1.1333, "angle": -112.59 },
-					{ "time": 1.3333, "angle": -22.61 }
-				],
-				"translate": [
-					{ "time": 0, "x": 6.08, "y": 7.15 },
-					{ "time": 0.2, "x": 7.23, "y": -13.13, "curve": "stepped" },
-					{ "time": 0.7333, "x": 7.23, "y": -13.13 },
-					{ "time": 1.3333, "x": 6.08, "y": 7.15 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 66.46 },
-					{ "time": 0.2, "angle": 42.39 },
-					{ "time": 0.4333, "angle": 26.06 },
-					{ "time": 0.7333, "angle": 13.28 },
-					{ "time": 0.8666, "angle": -28.64 },
-					{ "time": 0.9333, "angle": -22.31 },
-					{ "time": 1.0333, "angle": -35.39 },
-					{ "time": 1.1333, "angle": -28.64 },
-					{ "time": 1.3333, "angle": 66.46 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": -28.43 },
-					{ "time": 0.4333, "angle": -45.6 },
-					{ "time": 0.7333, "angle": -53.66 },
-					{ "time": 0.8666, "angle": 7.55 },
-					{ "time": 0.9333, "angle": 31.15 },
-					{ "time": 1.0333, "angle": -32.58 },
-					{ "time": 1.1333, "angle": 7.55 },
-					{ "time": 1.3333, "angle": -28.43 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": 39.68 },
-					{ "time": 0.2, "angle": 276.57 },
-					{ "time": 0.3, "angle": 17.73 },
-					{ "time": 0.4333, "angle": 83.38 },
-					{
-						"time": 0.6,
-						"angle": -4.71,
-						"curve": [ 0.246, 0, 0.633, 0.53 ]
-					},
-					{
-						"time": 0.7333,
-						"angle": -69.63,
-						"curve": [ 0.342, 0.36, 0.68, 0.71 ]
-					},
-					{
-						"time": 0.7666,
-						"angle": 321.47,
-						"curve": [ 0.333, 0.33, 0.667, 0.66 ]
-					},
-					{
-						"time": 0.8,
-						"angle": 33.7,
-						"curve": [ 0.358, 0.64, 0.693, 1 ]
-					},
-					{ "time": 0.8666, "angle": 34.56 },
-					{ "time": 1.0333, "angle": 71.96 },
-					{ "time": 1.1333, "angle": 34.56 },
-					{ "time": 1.3333, "angle": 39.68 }
-				],
-				"translate": [
-					{ "time": 0, "x": -3.1, "y": -4.86 },
-					{ "time": 0.2, "x": 23.33, "y": 49.07 },
-					{ "time": 0.4333, "x": 20.78, "y": 40.21 },
-					{ "time": 1.3333, "x": -3.1, "y": -4.86 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 29.66 },
-					{ "time": 0.2, "angle": 45.06 },
-					{ "time": 0.4333, "angle": -4.34 },
-					{ "time": 0.7666, "angle": 61.68 },
-					{ "time": 0.8, "angle": 82.59 },
-					{ "time": 0.8666, "angle": 80.06 },
-					{ "time": 1.0333, "angle": 57.56 },
-					{ "time": 1.1333, "angle": 80.06 },
-					{ "time": 1.3333, "angle": 29.66 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 24.9 },
-					{ "time": 0.2, "angle": 16.31 },
-					{ "time": 0.4333, "angle": 7.44 },
-					{ "time": 0.7333, "angle": -20.35 },
-					{ "time": 0.8333, "angle": -0.69, "curve": "stepped" },
-					{ "time": 1.1333, "angle": -0.69 },
-					{ "time": 1.3333, "angle": 24.9 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 24.92 },
-					{ "time": 0.2, "angle": 10.36 },
-					{ "time": 0.4333, "angle": 28.65 },
-					{ "time": 0.7333, "angle": -2.65 },
-					{ "time": 0.8333, "angle": -28.94, "curve": "stepped" },
-					{ "time": 1.1333, "angle": -28.94 },
-					{ "time": 1.3333, "angle": 24.92 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": -34.51,
-						"y": -78.62,
-						"curve": [ 0.232, 1, 0.75, 1 ]
-					},
-					{
-						"time": 0.2,
-						"x": -34.51,
-						"y": 182.5,
-						"curve": [ 0.232, 0.48, 0.598, 0.79 ]
-					},
-					{
-						"time": 0.7666,
-						"x": -34.51,
-						"y": 596.22,
-						"curve": [ 0.329, 0.17, 0.66, 0.21 ]
-					},
-					{ "time": 1.1333, "x": -34.51, "y": 2.49 },
-					{ "time": 1.3333, "x": -34.51, "y": -78.62 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -90.62,
-						"curve": [ 0.416, 0.54, 0.743, 1 ]
-					},
-					{
-						"time": 0.2,
-						"angle": -10.52,
-						"curve": [ 0.644, 0, 0.75, 1 ]
-					},
-					{ "time": 0.4333, "angle": -127.72 },
-					{ "time": 0.7333, "angle": -19.91 },
-					{ "time": 0.8333, "angle": -5.16 },
-					{ "time": 0.9333, "angle": -35.06 },
-					{ "time": 1.0333, "angle": -43.97 },
-					{ "time": 1.1333, "angle": -5.16 },
-					{ "time": 1.3333, "angle": -90.62 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": -0.79 },
-					{ "time": 0.0333, "angle": 16.27 },
-					{ "time": 0.0666, "angle": 23.52 },
-					{ "time": 0.1, "angle": 21.02 },
-					{ "time": 0.1333, "angle": 10.92 },
-					{ "time": 0.2, "angle": -38.45 },
-					{ "time": 0.4333, "angle": 6.62 },
-					{ "time": 0.7333, "angle": -11.51 },
-					{ "time": 1.0333, "angle": -22.91 },
-					{ "time": 1.3333, "angle": -0.79 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": -12.77 },
-					{ "time": 0.2, "angle": 17.05 },
-					{ "time": 0.4333, "angle": 19.45 },
-					{ "time": 0.7333, "angle": 2.67 },
-					{ "time": 1.0333, "angle": -28.49 },
-					{ "time": 1.3333, "angle": -12.77 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": 6.18 },
-					{ "time": 0.2, "angle": 30.81 },
-					{ "time": 0.4333, "angle": 13.25 },
-					{ "time": 0.7333, "angle": 14.98 },
-					{ "time": 0.7666, "angle": 25.64 },
-					{ "time": 0.8, "angle": 20.62 },
-					{ "time": 0.8666, "angle": 64.52 },
-					{ "time": 1.0333, "angle": 8.59 },
-					{ "time": 1.1333, "angle": 64.52 },
-					{ "time": 1.3333, "angle": 6.18 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 }
-				]
-			}
-		}
-	},
-	"run": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_closed" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_grind" }
-				]
-			},
-			"torso": {
-				"attachment": [
-					{ "time": 0, "name": "torso" }
-				]
-			}
-		},
-		"bones": {
-			"front_thigh": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 42.05,
-						"curve": [ 0.195, 0.86, 0.75, 1 ]
-					},
-					{ "time": 0.0666, "angle": 46.07 },
-					{ "time": 0.1333, "angle": -20.28 },
-					{ "time": 0.2, "angle": -27.23 },
-					{ "time": 0.2666, "angle": -47.16 },
-					{ "time": 0.3333, "angle": -39.79 },
-					{ "time": 0.4, "angle": -25.86 },
-					{ "time": 0.4666, "angle": 14.35 },
-					{ "time": 0.5333, "angle": 55.62 },
-					{ "time": 0.6, "angle": 69.65 },
-					{ "time": 0.6666, "angle": 86.4 },
-					{ "time": 0.7333, "angle": 65.87 },
-					{ "time": 0.8, "angle": 42.05 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.0333, "x": -5.79, "y": 11.15 },
-					{ "time": 0.0666, "x": -5.13, "y": 11.55 },
-					{ "time": 0.1333, "x": -7.7, "y": 8.98 },
-					{ "time": 0.5333, "x": -1.26, "y": 3.83 },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -39.7 },
-					{ "time": 0.2, "angle": -57.29 },
-					{ "time": 0.4, "angle": -39.7 },
-					{ "time": 0.6, "angle": -57.29 },
-					{ "time": 0.8, "angle": -39.7 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": -56.59 },
-					{ "time": 0.0666, "angle": -21.57 },
-					{ "time": 0.1333, "angle": 27.95 },
-					{ "time": 0.2, "angle": 42.42 },
-					{ "time": 0.2666, "angle": 62.37 },
-					{ "time": 0.3333, "angle": 45.42 },
-					{ "time": 0.4, "angle": 15.67 },
-					{ "time": 0.4666, "angle": 28.22 },
-					{ "time": 0.5333, "angle": -38.62 },
-					{ "time": 0.6, "angle": -53.26 },
-					{ "time": 0.6666, "angle": -79.31 },
-					{ "time": 0.7333, "angle": -86.47 },
-					{ "time": 0.8, "angle": -56.59 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.4, "x": -6.76, "y": -3.86 },
-					{ "time": 0.4333, "x": -15.85, "y": 7.28 },
-					{ "time": 0.4666, "x": -13.04, "y": 4.04 },
-					{ "time": 0.5, "x": -10.24, "y": 7.11 },
-					{ "time": 0.5333, "x": -9.01, "y": -5.15 },
-					{ "time": 0.6666, "x": -23.18, "y": -2.57 },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": -74 },
-					{ "time": 0.0666, "angle": -83.38 },
-					{ "time": 0.1333, "angle": -106.69 },
-					{ "time": 0.2, "angle": -66.01 },
-					{ "time": 0.2666, "angle": -55.22 },
-					{ "time": 0.3333, "angle": -24.8 },
-					{
-						"time": 0.4,
-						"angle": 18.44,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.4666, "angle": -56.65 },
-					{
-						"time": 0.5333,
-						"angle": -11.94,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.6666, "angle": -41.26 },
-					{ "time": 0.7333, "angle": -43.6 },
-					{ "time": 0.8, "angle": -74 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -89.36 },
-					{ "time": 0.0666, "angle": -95.67 },
-					{ "time": 0.1333, "angle": -22 },
-					{ "time": 0.2, "angle": -316.04 },
-					{ "time": 0.2666, "angle": -274.94 },
-					{ "time": 0.3333, "angle": -273.74 },
-					{ "time": 0.4, "angle": -272.09 },
-					{ "time": 0.4666, "angle": -264.89 },
-					{ "time": 0.5333, "angle": -320.09 },
-					{ "time": 0.6, "angle": -50.83 },
-					{ "time": 0.6666, "angle": -81.72 },
-					{ "time": 0.7333, "angle": -83.92 },
-					{ "time": 0.8, "angle": -89.36 }
-				],
-				"translate": [
-					{ "time": 0, "x": 6.24, "y": 10.05 },
-					{ "time": 0.2666, "x": 4.95, "y": -13.13 },
-					{ "time": 0.6, "x": -2.43, "y": 1.94 },
-					{ "time": 0.8, "x": 6.24, "y": 10.05 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 33.43 },
-					{ "time": 0.0666, "angle": 20.53 },
-					{ "time": 0.1333, "angle": 15.26 },
-					{ "time": 0.2, "angle": 19.28 },
-					{ "time": 0.2666, "angle": 22.62 },
-					{ "time": 0.3333, "angle": 37.29 },
-					{ "time": 0.4, "angle": 41.53 },
-					{ "time": 0.4666, "angle": 31.73 },
-					{ "time": 0.5333, "angle": 67.45 },
-					{ "time": 0.6666, "angle": 39.77 },
-					{ "time": 0.7333, "angle": 30.95 },
-					{ "time": 0.8, "angle": 33.43 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": -19.75 },
-					{ "time": 0.0666, "angle": -37.11 },
-					{ "time": 0.1333, "angle": -50.79 },
-					{ "time": 0.2666, "angle": -12.69 },
-					{ "time": 0.3333, "angle": 3.01 },
-					{ "time": 0.4333, "angle": 12.05 },
-					{ "time": 0.5333, "angle": 13.25 },
-					{ "time": 0.8, "angle": -19.75 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": 68.68 },
-					{ "time": 0.0666, "angle": 73.89 },
-					{ "time": 0.1333, "angle": -9.64 },
-					{ "time": 0.2, "angle": 284.27 },
-					{ "time": 0.2666, "angle": 283.29 },
-					{ "time": 0.3333, "angle": 278.28 },
-					{ "time": 0.4, "angle": 271.02 },
-					{ "time": 0.4666, "angle": 263.2 },
-					{ "time": 0.5333, "angle": 314.25 },
-					{ "time": 0.6, "angle": 16.83 },
-					{ "time": 0.6666, "angle": 70.35 },
-					{ "time": 0.7333, "angle": 73.53 },
-					{ "time": 0.8, "angle": 68.68 }
-				],
-				"translate": [
-					{ "time": 0, "x": -2.57, "y": -8.89 },
-					{ "time": 0.1333, "x": -4.68, "y": 7.2 },
-					{ "time": 0.2, "x": 21.73, "y": 51.17 },
-					{ "time": 0.6, "x": 4.33, "y": 2.05 },
-					{ "time": 0.8, "x": -2.57, "y": -8.89 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 31.04 },
-					{ "time": 0.0666, "angle": 28.28 },
-					{ "time": 0.1333, "angle": 49.36 },
-					{ "time": 0.2, "angle": 59.37 },
-					{ "time": 0.2666, "angle": 8.56 },
-					{ "time": 0.3333, "angle": 9.38 },
-					{ "time": 0.4, "angle": 11.51 },
-					{ "time": 0.4666, "angle": 7.22 },
-					{ "time": 0.5333, "angle": -18.44 },
-					{ "time": 0.6, "angle": 11.44 },
-					{ "time": 0.6666, "angle": 9.99 },
-					{ "time": 0.7333, "angle": 8.28 },
-					{ "time": 0.8, "angle": 31.04 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 11.03 },
-					{ "time": 0.2, "angle": 13.58 },
-					{ "time": 0.4, "angle": 11.03 },
-					{ "time": 0.6, "angle": 13.58 },
-					{ "time": 0.8, "angle": 11.03 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 11.03 },
-					{ "time": 0.1, "angle": 12.34 },
-					{ "time": 0.2, "angle": 25.55 },
-					{ "time": 0.4, "angle": 11.03 },
-					{ "time": 0.5, "angle": 12.34 },
-					{ "time": 0.6, "angle": 25.55 },
-					{ "time": 0.8, "angle": 11.03 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": -62.47, "y": -23.1 },
-					{
-						"time": 0.0666,
-						"x": -62.47,
-						"y": -38.51,
-						"curve": [ 0.244, 0.04, 0.75, 1 ]
-					},
-					{
-						"time": 0.2666,
-						"x": -62.47,
-						"y": 22.28,
-						"curve": [ 0.17, 0.52, 0.75, 1 ]
-					},
-					{ "time": 0.4, "x": -62.47, "y": -23.1 },
-					{ "time": 0.4333, "x": -62.47, "y": -24.59 },
-					{
-						"time": 0.4666,
-						"x": -62.47,
-						"y": -43.29,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.6666, "x": -62.47, "y": 22.28 },
-					{ "time": 0.8, "x": -62.47, "y": -23.1 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 0,
-						"curve": [ 0.481, 0.01, 0.75, 1 ]
-					},
-					{ "time": 0.0666, "angle": -64.42 },
-					{
-						"time": 0.1333,
-						"angle": -20.59,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.2666, "angle": -62.51 },
-					{ "time": 0.3333, "angle": -79.74 },
-					{ "time": 0.4, "angle": -78.28 },
-					{
-						"time": 0.4666,
-						"angle": -118.96,
-						"curve": [ 0.93, 0, 0.952, 0.95 ]
-					},
-					{ "time": 0.6, "angle": -88.95 },
-					{ "time": 0.6666, "angle": -79.09 },
-					{ "time": 0.7333, "angle": -47.77 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{
-						"time": 0.0333,
-						"angle": -21.13,
-						"curve": [ 0.121, 0.23, 0.75, 1 ]
-					},
-					{ "time": 0.0666, "angle": 17.64 },
-					{ "time": 0.1, "angle": 29.92 },
-					{ "time": 0.1333, "angle": 16.44 },
-					{ "time": 0.2, "angle": -29.22 },
-					{ "time": 0.2666, "angle": -1.61 },
-					{ "time": 0.3333, "angle": -10.22 },
-					{ "time": 0.4666, "angle": -15.99 },
-					{ "time": 0.6, "angle": 9.03 },
-					{ "time": 0.7333, "angle": 17.32 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.0666, "angle": -12.04 },
-					{ "time": 0.1333, "angle": -0.87 },
-					{ "time": 0.2, "angle": 25.81 },
-					{ "time": 0.2666, "angle": 4.71 },
-					{
-						"time": 0.4,
-						"angle": 18.09,
-						"curve": [ 0.281, 0.73, 0.75, 1 ]
-					},
-					{ "time": 0.4333, "angle": -1.7 },
-					{ "time": 0.4666, "angle": 27.12 },
-					{ "time": 0.5, "angle": 38.83 },
-					{ "time": 0.5333, "angle": 30.76 },
-					{ "time": 0.5666, "angle": -20.49 },
-					{ "time": 0.6, "angle": -30.8 },
-					{ "time": 0.6666, "angle": -1.31 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.1333, "angle": 24.72 },
-					{ "time": 0.5, "angle": -11.87 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			}
-		},
-		"events": [
-			{ "time": 0, "name": "footstep" },
-			{ "time": 0.4, "name": "footstep", "int": 1 }
-		]
-	},
-	"shoot": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0.1333, "name": "front_fist_closed" },
-					{ "time": 0.4, "name": "front_fist_open" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0.1333, "name": "mouth_grind" }
-				]
-			},
-			"muzzle": {
-				"attachment": [
-					{ "time": 0.1333, "name": "muzzle" },
-					{ "time": 0.2666, "name": null }
-				],
-				"color": [
-					{
-						"time": 0.1333,
-						"color": "ffffff00",
-						"curve": [ 0.118, 0.99, 0.75, 1 ]
-					},
-					{
-						"time": 0.1666,
-						"color": "ffffffff",
-						"curve": [ 0.821, 0, 0.909, 0.89 ]
-					},
-					{ "time": 0.2666, "color": "ffffff00" }
-				]
-			}
-		},
-		"bones": {
-			"front_fist": {
-				"scale": [
-					{ "time": 0.1333, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.4, "x": 1, "y": 1 }
-				]
-			},
-			"gunTip": {
-				"translate": [
-					{ "time": 0.1333, "x": 0, "y": 0 },
-					{ "time": 0.2, "x": 20.93, "y": 1.57 }
-				],
-				"scale": [
-					{ "time": 0.1333, "x": 1, "y": 1 },
-					{ "time": 0.2, "x": 1.247, "y": 1.516 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{ "time": 0, "angle": 1.9 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": 7.95,
-						"y": 5.84,
-						"curve": [ 0, 0.3, 0.678, 1 ]
-					},
-					{ "time": 0.3, "x": -9.3, "y": -1.41 },
-					{ "time": 0.4, "x": 0, "y": 0 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": -30.47 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": 0,
-						"y": 0,
-						"curve": [ 0, 0.3, 0.678, 1 ]
-					},
-					{ "time": 0.3, "x": -5.99, "y": -3.71 },
-					{ "time": 0.4, "x": 0, "y": 0 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": 62.3 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": 0,
-						"y": 0,
-						"curve": [ 0, 0.3, 0.678, 1 ]
-					},
-					{ "time": 0.3, "x": 2.81, "y": 11.41 },
-					{ "time": 0.4, "x": 0, "y": 0 }
-				]
-			}
-		}
-	},
-	"test": {
-		"slots": {
-			"front_foot": {
-				"color": [
-					{ "time": 0.6666, "color": "ffffffff" },
-					{ "time": 1.3333, "color": "ff0700ff" }
-				]
-			},
-			"gun": {
-				"color": [
-					{ "time": 0, "color": "ffffffff", "curve": "stepped" },
-					{ "time": 0.6666, "color": "ffffffff" },
-					{ "time": 1.3333, "color": "32ff00ff" }
-				]
-			},
-			"rear_foot": {
-				"color": [
-					{ "time": 0.6666, "color": "ffffffff" },
-					{ "time": 1.3333, "color": "ff0700ff" }
-				]
-			}
-		},
-		"bones": {
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.3333, "angle": -20.72 },
-					{ "time": 0.6666, "angle": -32.41 },
-					{ "time": 1, "angle": -5.3 },
-					{ "time": 1.3333, "angle": 24.96 },
-					{ "time": 1.6666, "angle": 15.61 },
-					{ "time": 2, "angle": 0 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": 0,
-						"y": 0,
-						"curve": [ 0.172, 0.37, 0.574, 0.73 ]
-					},
-					{
-						"time": 0.1666,
-						"x": 144.19,
-						"y": -77.59,
-						"curve": [ 0.372, 0.61, 0.765, 1 ]
-					},
-					{
-						"time": 0.3333,
-						"x": 217.61,
-						"y": -192.63,
-						"curve": [ 0.282, 0, 0.624, 0.31 ]
-					},
-					{
-						"time": 0.5,
-						"x": 181.21,
-						"y": -365.66,
-						"curve": [ 0.313, 0.21, 0.654, 0.54 ]
-					},
-					{
-						"time": 0.6666,
-						"x": 20.09,
-						"y": -500.4,
-						"curve": [ 0.147, 0.27, 0.75, 1 ]
-					},
-					{ "time": 0.8333, "x": -194.24, "y": -341.84 },
-					{ "time": 1, "x": -307.93, "y": -114 },
-					{
-						"time": 1.1666,
-						"x": -330.38,
-						"y": 121.42,
-						"curve": [ 0.25, 0, 0.764, 0.48 ]
-					},
-					{
-						"time": 1.3333,
-						"x": -240.42,
-						"y": 335.66,
-						"curve": [ 0.229, 0.37, 0.58, 0.73 ]
-					},
-					{
-						"time": 1.5,
-						"x": -56.12,
-						"y": 288.06,
-						"curve": [ 0.296, 0.6, 0.641, 1 ]
-					},
-					{
-						"time": 1.6666,
-						"x": 87.63,
-						"y": 191.33,
-						"curve": [ 0.238, 0, 0.626, 0.39 ]
-					},
-					{
-						"time": 1.8333,
-						"x": 60.62,
-						"y": 95.14,
-						"curve": [ 0.41, 0.26, 0.803, 0.62 ]
-					},
-					{ "time": 2, "x": 0, "y": 0 }
-				]
-			}
-		},
-		"draworder": [
-			{
-				"time": 0.6666,
-				"offsets": [
-					{ "slot": "head", "offset": -9 },
-					{ "slot": "eye", "offset": -9 },
-					{ "slot": "mouth", "offset": -12 },
-					{ "slot": "goggles", "offset": -12 }
-				]
-			},
-			{ "time": 1.3333 }
-		],
-		"events": [
-			{ "time": 0, "name": "headPop", "int": 0, "float": 0, "string": "pop.wav" },
-			{ "time": 1, "name": "headBehind", "int": 7, "float": 8, "string": "animate" },
-			{ "time": 2, "name": "headAttach", "int": 0, "float": 0, "string": "attach.wav" }
-		]
-	},
-	"walk": {
-		"slots": {
-			"front_fist": {
-				"attachment": [
-					{ "time": 0, "name": "front_fist_closed" }
-				]
-			},
-			"mouth": {
-				"attachment": [
-					{ "time": 0, "name": "mouth_smile" }
-				]
-			},
-			"torso": {
-				"attachment": [
-					{ "time": 0, "name": "torso" }
-				]
-			}
-		},
-		"bones": {
-			"front_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": 15.79 },
-					{ "time": 0.1, "angle": 27.39 },
-					{ "time": 0.2, "angle": -7.94 },
-					{ "time": 0.3, "angle": -16.94 },
-					{ "time": 0.4, "angle": -28.62 },
-					{ "time": 0.5, "angle": -19.3 },
-					{ "time": 0.6, "angle": -3.08 },
-					{ "time": 0.7, "angle": 29.51 },
-					{ "time": 0.8, "angle": 15.79 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.4, "x": -1.18, "y": 0.54 },
-					{ "time": 0.5, "x": 0.11, "y": 0.41 },
-					{ "time": 0.6, "x": 9.48, "y": 0.27 },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.4, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 5.12 },
-					{ "time": 0.1, "angle": -20.87 },
-					{ "time": 0.2, "angle": 13.37 },
-					{ "time": 0.3, "angle": 15.98 },
-					{ "time": 0.4, "angle": 5.94 },
-					{ "time": 0.5, "angle": -26.76 },
-					{ "time": 0.7, "angle": -55.44 },
-					{ "time": 0.8, "angle": 5.12 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_thigh": {
-				"rotate": [
-					{ "time": 0, "angle": -34.38 },
-					{ "time": 0.1, "angle": -30.32 },
-					{ "time": 0.2, "angle": -37.22 },
-					{ "time": 0.3, "angle": 20.73 },
-					{ "time": 0.4, "angle": 8.69 },
-					{ "time": 0.5, "angle": 12.16 },
-					{ "time": 0.6, "angle": -24.62 },
-					{ "time": 0.7, "angle": -27.26 },
-					{ "time": 0.8, "angle": -34.38 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.4, "x": 4.08, "y": -9.53 },
-					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.7, "x": -21.14, "y": -9.6 },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_shin": {
-				"rotate": [
-					{ "time": 0, "angle": 14.26 },
-					{ "time": 0.1, "angle": -17.3 },
-					{ "time": 0.2, "angle": -12.67 },
-					{ "time": 0.3, "angle": -58.89 },
-					{ "time": 0.4, "angle": 15.95 },
-					{ "time": 0.5, "angle": -9 },
-					{ "time": 0.6, "angle": 26.06 },
-					{ "time": 0.7, "angle": 21.85 },
-					{ "time": 0.8, "angle": 14.26 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.1, "x": 0.951, "y": 1 },
-					{ "time": 0.5, "x": 0.975, "y": 1 },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 10.13 },
-					{ "time": 0.1, "angle": 12.27 },
-					{ "time": 0.2, "angle": -2.94 },
-					{ "time": 0.3, "angle": 6.29 },
-					{ "time": 0.4, "angle": 13.45 },
-					{ "time": 0.5, "angle": -3.57 },
-					{ "time": 0.6, "angle": -0.97 },
-					{ "time": 0.7, "angle": 2.97 },
-					{ "time": 0.8, "angle": 10.13 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": -23.74 },
-					{ "time": 0.4, "angle": -320.57 },
-					{ "time": 0.8, "angle": -23.74 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_upper_arm": {
-				"rotate": [
-					{ "time": 0, "angle": 11.62 },
-					{ "time": 0.1, "angle": 19.36 },
-					{ "time": 0.4, "angle": 345.26 },
-					{ "time": 0.5, "angle": 343.44 },
-					{ "time": 0.8, "angle": 11.62 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -12.11 },
-					{ "time": 0.1666, "angle": -17.16 },
-					{ "time": 0.4, "angle": -12.11 },
-					{ "time": 0.5666, "angle": -15.81 },
-					{ "time": 0.8, "angle": -12.11 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 1.41 },
-					{ "time": 0.2333, "angle": -3.04 },
-					{ "time": 0.4, "angle": 1.41 },
-					{ "time": 0.6333, "angle": -3.04 },
-					{ "time": 0.8, "angle": 1.41 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{ "time": 0, "angle": 6.97 },
-					{ "time": 0.1666, "angle": 8.02 },
-					{ "time": 0.2666, "angle": 12.65 },
-					{ "time": 0.4, "angle": 6.97 },
-					{ "time": 0.5666, "angle": 8.02 },
-					{ "time": 0.6666, "angle": 12.65 },
-					{ "time": 0.8, "angle": 6.97 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.4, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{
-						"time": 0,
-						"x": -23.93,
-						"y": 3.22,
-						"curve": [ 0.518, 0.03, 0.807, 0.61 ]
-					},
-					{
-						"time": 0.1,
-						"x": -23.93,
-						"y": -9.24,
-						"curve": [ 0.135, 0.33, 0.601, 0.99 ]
-					},
-					{
-						"time": 0.2,
-						"x": -23.93,
-						"y": 4.35,
-						"curve": [ 0.204, 0.68, 0.75, 1 ]
-					},
-					{
-						"time": 0.3,
-						"x": -23.93,
-						"y": 2.38,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.4,
-						"x": -23.93,
-						"y": -2.5,
-						"curve": [ 0.692, 0.01, 0.75, 1 ]
-					},
-					{
-						"time": 0.5,
-						"x": -23.93,
-						"y": -10.32,
-						"curve": [ 0.235, 0.77, 0.75, 1 ]
-					},
-					{
-						"time": 0.6,
-						"x": -23.93,
-						"y": 4.35,
-						"curve": [ 0.287, 0.37, 0.718, 0.76 ]
-					},
-					{
-						"time": 0.7,
-						"x": -23.93,
-						"y": 10.34,
-						"curve": [ 0.615, 0, 0.75, 1 ]
-					},
-					{ "time": 0.8, "x": -23.93, "y": 3.22 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 0 },
-					{ "time": 0.4, "angle": 20.59 },
-					{ "time": 0.8, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_foot": {
-				"rotate": [
-					{ "time": 0, "angle": 12.49 },
-					{ "time": 0.1, "angle": -8.34 },
-					{ "time": 0.2, "angle": -6.17 },
-					{ "time": 0.3, "angle": -0.75 },
-					{ "time": 0.3333, "angle": 3.89 },
-					{ "time": 0.4, "angle": 10.22 },
-					{ "time": 0.5, "angle": 11.44 },
-					{ "time": 0.6, "angle": -0.33 },
-					{ "time": 0.7, "angle": 0.15 },
-					{ "time": 0.8, "angle": 12.49 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"rear_bracer": {
-				"rotate": [
-					{ "time": 0, "angle": 3.58 },
-					{ "time": 0.1, "angle": 5.51 },
-					{ "time": 0.4, "angle": -22.77 },
-					{ "time": 0.5, "angle": -9.65 },
-					{ "time": 0.8, "angle": 3.58 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"front_fist": {
-				"rotate": [
-					{ "time": 0, "angle": -15.22 },
-					{ "time": 0.1, "angle": -51.4 },
-					{ "time": 0.4, "angle": -39.4 },
-					{ "time": 0.5, "angle": 19.26 },
-					{ "time": 0.8, "angle": -15.22 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			},
-			"gun": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -24.06,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.1,
-						"angle": -10.94,
-						"curve": [ 0.381, 0.54, 0.742, 1 ]
-					},
-					{
-						"time": 0.4,
-						"angle": 25.34,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{
-						"time": 0.6666,
-						"angle": -27.47,
-						"curve": [ 0.25, 0, 0.75, 1 ]
-					},
-					{ "time": 0.8, "angle": -24.06 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.8, "x": 0, "y": 0 }
-				],
-				"scale": [
-					{ "time": 0, "x": 1, "y": 1, "curve": "stepped" },
-					{ "time": 0.8, "x": 1, "y": 1 }
-				]
-			}
-		}
-	}
-}
-}

二进制
spine-cocos2dx/3.2/example/Resources/common/sprite.png


+ 0 - 292
spine-cocos2dx/3.2/example/Resources/ipad-retina/goblins-ffd.atlas

@@ -1,292 +0,0 @@
-
-goblins-ffd.png
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-dagger
-  rotate: false
-  xy: 2, 28
-  size: 26, 108
-  orig: 26, 108
-  offset: 0, 0
-  index: -1
-goblin/eyes-closed
-  rotate: false
-  xy: 137, 29
-  size: 34, 12
-  orig: 34, 12
-  offset: 0, 0
-  index: -1
-goblin/head
-  rotate: false
-  xy: 26, 357
-  size: 103, 66
-  orig: 103, 66
-  offset: 0, 0
-  index: -1
-goblin/left-arm
-  rotate: false
-  xy: 30, 28
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblin/left-foot
-  rotate: false
-  xy: 134, 260
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblin/left-hand
-  rotate: false
-  xy: 69, 25
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/left-lower-leg
-  rotate: false
-  xy: 134, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblin/left-shoulder
-  rotate: false
-  xy: 137, 43
-  size: 29, 44
-  orig: 29, 44
-  offset: 0, 0
-  index: -1
-goblin/left-upper-leg
-  rotate: false
-  xy: 30, 65
-  size: 33, 73
-  orig: 33, 73
-  offset: 0, 0
-  index: -1
-goblin/neck
-  rotate: false
-  xy: 201, 387
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-goblin/pelvis
-  rotate: false
-  xy: 26, 140
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblin/right-arm
-  rotate: false
-  xy: 171, 84
-  size: 23, 50
-  orig: 23, 50
-  offset: 0, 0
-  index: -1
-goblin/right-foot
-  rotate: false
-  xy: 134, 225
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblin/right-hand
-  rotate: false
-  xy: 204, 258
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblin/right-lower-leg
-  rotate: false
-  xy: 201, 430
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblin/right-shoulder
-  rotate: false
-  xy: 130, 89
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblin/right-upper-leg
-  rotate: false
-  xy: 98, 214
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblin/torso
-  rotate: false
-  xy: 131, 410
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblin/undie-straps
-  rotate: false
-  xy: 2, 7
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblin/undies
-  rotate: false
-  xy: 199, 227
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-goblingirl/eyes-closed
-  rotate: false
-  xy: 59, 2
-  size: 37, 21
-  orig: 37, 21
-  offset: 0, 0
-  index: -1
-goblingirl/head
-  rotate: false
-  xy: 26, 425
-  size: 103, 81
-  orig: 103, 81
-  offset: 0, 0
-  index: -1
-goblingirl/left-arm
-  rotate: false
-  xy: 201, 190
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
-goblingirl/left-foot
-  rotate: false
-  xy: 134, 192
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
-goblingirl/left-hand
-  rotate: false
-  xy: 196, 109
-  size: 35, 40
-  orig: 35, 40
-  offset: 0, 0
-  index: -1
-goblingirl/left-lower-leg
-  rotate: false
-  xy: 169, 293
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/left-shoulder
-  rotate: false
-  xy: 107, 30
-  size: 28, 46
-  orig: 28, 46
-  offset: 0, 0
-  index: -1
-goblingirl/left-upper-leg
-  rotate: false
-  xy: 65, 68
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
-goblingirl/neck
-  rotate: false
-  xy: 204, 297
-  size: 35, 41
-  orig: 35, 41
-  offset: 0, 0
-  index: -1
-goblingirl/pelvis
-  rotate: false
-  xy: 131, 365
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
-goblingirl/right-arm
-  rotate: false
-  xy: 100, 97
-  size: 28, 50
-  orig: 28, 50
-  offset: 0, 0
-  index: -1
-goblingirl/right-foot
-  rotate: false
-  xy: 134, 157
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
-goblingirl/right-hand
-  rotate: false
-  xy: 199, 151
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
-goblingirl/right-lower-leg
-  rotate: false
-  xy: 96, 279
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
-goblingirl/right-shoulder
-  rotate: false
-  xy: 204, 340
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
-goblingirl/right-upper-leg
-  rotate: false
-  xy: 98, 149
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
-goblingirl/torso
-  rotate: false
-  xy: 26, 259
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
-goblingirl/undie-straps
-  rotate: false
-  xy: 134, 136
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
-goblingirl/undies
-  rotate: false
-  xy: 196, 78
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
-shield
-  rotate: false
-  xy: 26, 185
-  size: 70, 72
-  orig: 70, 72
-  offset: 0, 0
-  index: -1
-spear
-  rotate: false
-  xy: 2, 138
-  size: 22, 368
-  orig: 22, 368
-  offset: 0, 0
-  index: -1

二进制
spine-cocos2dx/3.2/example/Resources/ipad-retina/goblins-ffd.png


部分文件因为文件数量过多而无法显示