浏览代码

[c] Ported 3.6 changes, two color timeline, changed updateWorldVertices to computeWorldVertices, point attachment, transform constraint local and relative mode. Does not actually render two color tinted slots yet. Also updated example exports

badlogic 8 年之前
父节点
当前提交
fe8eae4b8e
共有 100 个文件被更改,包括 6356 次插入6029 次删除
  1. 249 256
      examples/alien/export/alien.json
  2. 二进制
      examples/alien/export/alien.skel
  3. 132 132
      examples/dragon/export/dragon.json
  4. 二进制
      examples/dragon/export/dragon.skel
  5. 218 225
      examples/goblins/export/goblins-mesh.json
  6. 二进制
      examples/goblins/export/goblins-mesh.skel
  7. 140 147
      examples/goblins/export/goblins.json
  8. 二进制
      examples/goblins/export/goblins.skel
  9. 30 37
      examples/hero/export/hero-mesh.json
  10. 二进制
      examples/hero/export/hero-mesh.skel
  11. 235 242
      examples/hero/export/hero.json
  12. 二进制
      examples/hero/export/hero.skel
  13. 141 148
      examples/powerup/export/powerup.json
  14. 二进制
      examples/powerup/export/powerup.skel
  15. 102 109
      examples/raptor/export/raptor.json
  16. 二进制
      examples/raptor/export/raptor.skel
  17. 292 299
      examples/speedy/export/speedy.json
  18. 二进制
      examples/speedy/export/speedy.skel
  19. 306 313
      examples/spineboy-old/export/spineboy-old.json
  20. 二进制
      examples/spineboy-old/export/spineboy-old.skel
  21. 49 56
      examples/spineboy/export/spineboy-hover.json
  22. 二进制
      examples/spineboy/export/spineboy-hover.skel
  23. 45 45
      examples/spineboy/export/spineboy-mesh.json
  24. 二进制
      examples/spineboy/export/spineboy-mesh.skel
  25. 236 243
      examples/spineboy/export/spineboy.json
  26. 二进制
      examples/spineboy/export/spineboy.skel
  27. 64 71
      examples/spinosaurus/export/spinosaurus.json
  28. 二进制
      examples/spinosaurus/export/spinosaurus.skel
  29. 56 71
      examples/stretchyman/export/stretchyman.json
  30. 二进制
      examples/stretchyman/export/stretchyman.skel
  31. 27 36
      examples/tank/export/tank.json
  32. 二进制
      examples/tank/export/tank.skel
  33. 二进制
      examples/tank/tank.spine
  34. 34 41
      examples/test/export/test.json
  35. 二进制
      examples/test/export/test.skel
  36. 16 23
      examples/vine/export/vine.json
  37. 二进制
      examples/vine/export/vine.skel
  38. 236 243
      spine-as3/spine-as3-example/src/spineboy.json
  39. 32 1
      spine-c/spine-c/include/spine/Animation.h
  40. 2 1
      spine-c/spine-c/include/spine/Attachment.h
  41. 6 6
      spine-c/spine-c/include/spine/Bone.h
  42. 0 2
      spine-c/spine-c/include/spine/BoundingBoxAttachment.h
  43. 72 0
      spine-c/spine-c/include/spine/Color.h
  44. 1 3
      spine-c/spine-c/include/spine/MeshAttachment.h
  45. 0 2
      spine-c/spine-c/include/spine/PathAttachment.h
  46. 64 0
      spine-c/spine-c/include/spine/PointAttachment.h
  47. 2 2
      spine-c/spine-c/include/spine/RegionAttachment.h
  48. 2 2
      spine-c/spine-c/include/spine/Skeleton.h
  49. 4 2
      spine-c/spine-c/include/spine/Slot.h
  50. 5 2
      spine-c/spine-c/include/spine/SlotData.h
  51. 5 1
      spine-c/spine-c/include/spine/TransformConstraintData.h
  52. 1 3
      spine-c/spine-c/include/spine/VertexAttachment.h
  53. 1 0
      spine-c/spine-c/include/spine/extension.h
  54. 1 0
      spine-c/spine-c/include/spine/spine.h
  55. 101 16
      spine-c/spine-c/src/spine/Animation.c
  56. 2 0
      spine-c/spine-c/src/spine/AtlasAttachmentLoader.c
  57. 24 23
      spine-c/spine-c/src/spine/Bone.c
  58. 0 4
      spine-c/spine-c/src/spine/BoundingBoxAttachment.c
  59. 84 0
      spine-c/spine-c/src/spine/Color.c
  60. 1 8
      spine-c/spine-c/src/spine/MeshAttachment.c
  61. 0 8
      spine-c/spine-c/src/spine/PathAttachment.c
  62. 11 11
      spine-c/spine-c/src/spine/PathConstraint.c
  63. 60 0
      spine-c/spine-c/src/spine/PointAttachment.c
  64. 18 14
      spine-c/spine-c/src/spine/RegionAttachment.c
  65. 35 17
      spine-c/spine-c/src/spine/Skeleton.c
  66. 25 4
      spine-c/spine-c/src/spine/SkeletonBinary.c
  67. 1 1
      spine-c/spine-c/src/spine/SkeletonBounds.c
  68. 63 20
      spine-c/spine-c/src/spine/SkeletonJson.c
  69. 5 4
      spine-c/spine-c/src/spine/Slot.c
  70. 2 4
      spine-c/spine-c/src/spine/SlotData.c
  71. 163 11
      spine-c/spine-c/src/spine/TransformConstraint.c
  72. 4 8
      spine-c/spine-c/src/spine/VertexAttachment.c
  73. 218 225
      spine-cocos2d-objc/Resources/goblins-mesh.json
  74. 102 109
      spine-cocos2d-objc/Resources/raptor.json
  75. 236 243
      spine-cocos2d-objc/Resources/spineboy.json
  76. 27 36
      spine-cocos2d-objc/Resources/tank.json
  77. 218 225
      spine-cocos2dx/example/Resources/common/goblins-mesh.json
  78. 102 109
      spine-cocos2dx/example/Resources/common/raptor.json
  79. 236 243
      spine-cocos2dx/example/Resources/common/spineboy.json
  80. 27 36
      spine-cocos2dx/example/Resources/common/tank.json
  81. 218 225
      spine-corona/data/goblins-mesh.json
  82. 102 109
      spine-corona/data/raptor.json
  83. 236 243
      spine-corona/data/spineboy.json
  84. 56 71
      spine-corona/data/stretchyman.json
  85. 27 36
      spine-corona/data/tank.json
  86. 34 41
      spine-corona/data/test.json
  87. 16 23
      spine-corona/data/vine.json
  88. 218 225
      spine-libgdx/spine-libgdx-tests/assets/goblins/goblins-mesh.json
  89. 二进制
      spine-libgdx/spine-libgdx-tests/assets/goblins/goblins-mesh.skel
  90. 140 147
      spine-libgdx/spine-libgdx-tests/assets/goblins/goblins.json
  91. 二进制
      spine-libgdx/spine-libgdx-tests/assets/goblins/goblins.skel
  92. 102 109
      spine-libgdx/spine-libgdx-tests/assets/raptor/raptor.json
  93. 二进制
      spine-libgdx/spine-libgdx-tests/assets/raptor/raptor.skel
  94. 306 313
      spine-libgdx/spine-libgdx-tests/assets/spineboy-old/spineboy-old.json
  95. 二进制
      spine-libgdx/spine-libgdx-tests/assets/spineboy-old/spineboy-old.skel
  96. 49 56
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-hover.json
  97. 二进制
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-hover.skel
  98. 45 45
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-mesh.json
  99. 二进制
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-mesh.skel
  100. 236 243
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy.json

文件差异内容过多而无法显示
+ 249 - 256
examples/alien/export/alien.json


二进制
examples/alien/export/alien.skel


+ 132 - 132
examples/dragon/export/dragon.json

@@ -1,39 +1,39 @@
 {
 {
-"skeleton": { "hash": "Mc0suer5LoUZv7DvFA3mLFATKFU", "spine": "3.5.03-beta", "width": 897, "height": 716.36, "fps": 30, "images": "./images/" },
+"skeleton": { "hash": "wKRjA+djIs9K05d/19sZhwmP3Ow", "spine": "3.6.05-beta", "width": 897, "height": 716.36, "images": "./images/" },
 "bones": [
 "bones": [
 	{ "name": "root", "y": -176.12 },
 	{ "name": "root", "y": -176.12 },
 	{ "name": "COG", "parent": "root", "y": 176.12 },
 	{ "name": "COG", "parent": "root", "y": 176.12 },
-	{ "name": "chest", "parent": "COG", "length": 31.24, "rotation": 161.7, "x": 52.52, "y": 15.34 },
-	{ "name": "L_front_thigh", "parent": "chest", "length": 67.42, "rotation": 138.94, "x": -45.58, "y": 7.92 },
-	{ "name": "L_front_leg", "parent": "L_front_thigh", "length": 51.57, "rotation": 43.36, "x": 67.42, "y": 0.02 },
-	{ "name": "L_front_toe1", "parent": "L_front_leg", "length": 51.44, "rotation": -98, "x": 45.53, "y": 2.43 },
-	{ "name": "L_front_toe2", "parent": "L_front_leg", "length": 61.97, "rotation": -55.26, "x": 51.57, "y": -0.12 },
-	{ "name": "L_front_toe3", "parent": "L_front_leg", "length": 45.65, "rotation": -11.13, "x": 54.19, "y": 0.6, "scaleX": 1.134 },
-	{ "name": "L_front_toe4", "parent": "L_front_leg", "length": 53.47, "rotation": 19.42, "x": 50.6, "y": 7.08, "scaleX": 1.134 },
-	{ "name": "back", "parent": "COG", "length": 115.37, "rotation": 151.83, "x": 16.03, "y": 27.94 },
-	{ "name": "R_rear_thigh", "parent": "back", "length": 123.46, "rotation": 104.87, "x": 65.31, "y": 59.89 },
-	{ "name": "L_rear_thigh", "parent": "R_rear_thigh", "length": 88.05, "rotation": 28.35, "x": -8.59, "y": 30.18 },
+	{ "name": "chest", "parent": "COG", "length": 31.24, "rotation": 161.7, "x": 52.53, "y": 15.35 },
+	{ "name": "L_front_thigh", "parent": "chest", "length": 67.42, "rotation": 138.94, "x": -45.59, "y": 7.93 },
+	{ "name": "L_front_leg", "parent": "L_front_thigh", "length": 51.58, "rotation": 43.36, "x": 67.42, "y": 0.03 },
+	{ "name": "L_front_toe1", "parent": "L_front_leg", "length": 51.45, "rotation": -98.01, "x": 45.54, "y": 2.43 },
+	{ "name": "L_front_toe2", "parent": "L_front_leg", "length": 61.98, "rotation": -55.26, "x": 51.58, "y": -0.13 },
+	{ "name": "L_front_toe3", "parent": "L_front_leg", "length": 45.65, "rotation": -11.14, "x": 54.19, "y": 0.6, "scaleX": 1.135 },
+	{ "name": "L_front_toe4", "parent": "L_front_leg", "length": 53.47, "rotation": 19.43, "x": 50.61, "y": 7.09, "scaleX": 1.135 },
+	{ "name": "back", "parent": "COG", "length": 115.38, "rotation": 151.83, "x": 16.04, "y": 27.94 },
+	{ "name": "R_rear_thigh", "parent": "back", "length": 123.47, "rotation": 104.88, "x": 65.31, "y": 59.89 },
+	{ "name": "L_rear_thigh", "parent": "R_rear_thigh", "length": 88.06, "rotation": 28.35, "x": -8.59, "y": 30.19 },
 	{ "name": "L_rear_leg", "parent": "L_rear_thigh", "length": 103.74, "rotation": -122.41, "x": 96.04, "y": -0.97 },
 	{ "name": "L_rear_leg", "parent": "L_rear_thigh", "length": 103.74, "rotation": -122.41, "x": 96.04, "y": -0.97 },
-	{ "name": "L_wing", "parent": "chest", "length": 301.12, "rotation": -75.51, "x": -7.24, "y": -24.65 },
-	{ "name": "R_front_thigh", "parent": "chest", "length": 81.63, "rotation": 67.96, "x": -10.89, "y": 28.25 },
-	{ "name": "R_front_leg", "parent": "R_front_thigh", "length": 66.52, "rotation": 92.7, "x": 83.04, "y": -0.3 },
-	{ "name": "R_front_toe1", "parent": "R_front_leg", "length": 46.65, "rotation": 8.59, "x": 70.03, "y": 5.31 },
-	{ "name": "R_front_toe2", "parent": "R_front_leg", "length": 53.66, "rotation": -35.02, "x": 66.52, "y": 0.33 },
-	{ "name": "R_front_toe3", "parent": "R_front_leg", "length": 58.38, "rotation": -74.67, "x": 62.1, "y": -0.79 },
-	{ "name": "R_rear_leg", "parent": "R_rear_thigh", "length": 91.06, "rotation": -129.04, "x": 123.46, "y": -0.26 },
-	{ "name": "R_rear_toe1", "parent": "R_rear_leg", "length": 94.99, "rotation": 141.98, "x": 90.06, "y": 2.12 },
+	{ "name": "L_wing", "parent": "chest", "length": 301.12, "rotation": -75.51, "x": -7.25, "y": -24.66 },
+	{ "name": "R_front_thigh", "parent": "chest", "length": 81.64, "rotation": 67.97, "x": -10.89, "y": 28.25 },
+	{ "name": "R_front_leg", "parent": "R_front_thigh", "length": 66.53, "rotation": 92.7, "x": 83.05, "y": -0.31 },
+	{ "name": "R_front_toe1", "parent": "R_front_leg", "length": 46.66, "rotation": 8.59, "x": 70.03, "y": 5.31 },
+	{ "name": "R_front_toe2", "parent": "R_front_leg", "length": 53.67, "rotation": -35.02, "x": 66.53, "y": 0.34 },
+	{ "name": "R_front_toe3", "parent": "R_front_leg", "length": 58.39, "rotation": -74.67, "x": 62.1, "y": -0.79 },
+	{ "name": "R_rear_leg", "parent": "R_rear_thigh", "length": 91.06, "rotation": -129.04, "x": 123.47, "y": -0.27 },
+	{ "name": "R_rear_toe1", "parent": "R_rear_leg", "length": 95, "rotation": 141.98, "x": 90.07, "y": 2.12 },
 	{ "name": "R_rear_toe2", "parent": "R_rear_leg", "length": 99.29, "rotation": 125.32, "x": 89.6, "y": 1.52 },
 	{ "name": "R_rear_toe2", "parent": "R_rear_leg", "length": 99.29, "rotation": 125.32, "x": 89.6, "y": 1.52 },
-	{ "name": "R_rear_toe3", "parent": "R_rear_leg", "length": 103.45, "rotation": 112.26, "x": 91.06, "y": -0.35 },
-	{ "name": "neck", "parent": "COG", "length": 41.36, "rotation": 39.05, "x": 64.75, "y": 11.98 },
-	{ "name": "head", "parent": "neck", "length": 188.83, "rotation": 8.06, "x": 69.96, "y": 2.49 },
-	{ "name": "R_wing", "parent": "head", "length": 359.5, "rotation": 83.21, "x": -74.68, "y": 20.9 },
-	{ "name": "chin", "parent": "neck", "length": 153.15, "rotation": -69.07, "x": 64.62, "y": -6.99 },
-	{ "name": "tail1", "parent": "back", "length": 65.65, "rotation": 44.31, "x": 115.37, "y": -0.19 },
-	{ "name": "tail2", "parent": "tail1", "length": 54.5, "rotation": 12, "x": 65.65, "y": 0.22 },
+	{ "name": "R_rear_toe3", "parent": "R_rear_leg", "length": 103.46, "rotation": 112.27, "x": 91.06, "y": -0.35 },
+	{ "name": "neck", "parent": "COG", "length": 41.37, "rotation": 39.06, "x": 64.76, "y": 11.98 },
+	{ "name": "head", "parent": "neck", "length": 188.84, "rotation": 8.07, "x": 69.96, "y": 2.5 },
+	{ "name": "R_wing", "parent": "head", "length": 359.5, "rotation": 83.21, "x": -74.68, "y": 20.91 },
+	{ "name": "chin", "parent": "neck", "length": 153.16, "rotation": -69.07, "x": 64.63, "y": -6.99 },
+	{ "name": "tail1", "parent": "back", "length": 65.65, "rotation": 44.32, "x": 115.38, "y": -0.2 },
+	{ "name": "tail2", "parent": "tail1", "length": 54.5, "rotation": 12, "x": 65.65, "y": 0.23 },
 	{ "name": "tail3", "parent": "tail2", "length": 41.78, "rotation": 1.8, "x": 54.5, "y": 0.37 },
 	{ "name": "tail3", "parent": "tail2", "length": 41.78, "rotation": 1.8, "x": 54.5, "y": 0.37 },
 	{ "name": "tail4", "parent": "tail3", "length": 34.19, "rotation": -1.8, "x": 41.78, "y": 0.16 },
 	{ "name": "tail4", "parent": "tail3", "length": 34.19, "rotation": -1.8, "x": 41.78, "y": 0.16 },
-	{ "name": "tail5", "parent": "tail4", "length": 32.32, "rotation": -3.15, "x": 34.19, "y": -0.19 },
-	{ "name": "tail6", "parent": "tail5", "length": 80.08, "rotation": -29.55, "x": 32.32, "y": -0.23 }
+	{ "name": "tail5", "parent": "tail4", "length": 32.33, "rotation": -3.15, "x": 34.19, "y": -0.19 },
+	{ "name": "tail6", "parent": "tail5", "length": 80.08, "rotation": -29.55, "x": 32.33, "y": -0.23 }
 ],
 ],
 "slots": [
 "slots": [
 	{ "name": "L_rear_leg", "bone": "L_rear_leg", "attachment": "L_rear_leg" },
 	{ "name": "L_rear_leg", "bone": "L_rear_leg", "attachment": "L_rear_leg" },
@@ -71,113 +71,113 @@
 "skins": {
 "skins": {
 	"default": {
 	"default": {
 		"L_front_leg": {
 		"L_front_leg": {
-			"L_front_leg": { "x": 14.68, "y": 0.48, "rotation": 15.99, "width": 84, "height": 57 }
+			"L_front_leg": { "x": 14.69, "y": 0.49, "rotation": 16, "width": 84, "height": 57 }
 		},
 		},
 		"L_front_thigh": {
 		"L_front_thigh": {
-			"L_front_thigh": { "x": 27.66, "y": -11.58, "rotation": 58.66, "width": 84, "height": 72 }
+			"L_front_thigh": { "x": 27.66, "y": -11.59, "rotation": 58.66, "width": 84, "height": 72 }
 		},
 		},
 		"L_front_toe1": {
 		"L_front_toe1": {
-			"front_toeA": { "x": 31.92, "y": 0.61, "rotation": 109.55, "width": 29, "height": 50 }
+			"front_toeA": { "x": 31.93, "y": 0.61, "rotation": 109.56, "width": 29, "height": 50 }
 		},
 		},
 		"L_front_toe2": {
 		"L_front_toe2": {
-			"front_toeB": { "x": 26.83, "y": -4.94, "rotation": 109.51, "width": 56, "height": 57 }
+			"front_toeB": { "x": 26.84, "y": -4.95, "rotation": 109.51, "width": 56, "height": 57 }
 		},
 		},
 		"L_front_toe3": {
 		"L_front_toe3": {
-			"front_toeB": { "x": 18.21, "y": -7.21, "scaleX": 0.881, "scaleY": 0.94, "rotation": 99.71, "width": 56, "height": 57 }
+			"front_toeB": { "x": 18.22, "y": -7.22, "scaleX": 0.881, "scaleY": 0.941, "rotation": 99.71, "width": 56, "height": 57 }
 		},
 		},
 		"L_front_toe4": {
 		"L_front_toe4": {
-			"front_toeB": { "x": 23.21, "y": -11.68, "scaleX": 0.881, "rotation": 79.89, "width": 56, "height": 57 }
+			"front_toeB": { "x": 23.21, "y": -11.69, "scaleX": 0.881, "rotation": 79.89, "width": 56, "height": 57 }
 		},
 		},
 		"L_rear_leg": {
 		"L_rear_leg": {
-			"L_rear_leg": { "x": 67.29, "y": 12.62, "rotation": -162.65, "width": 206, "height": 177 }
+			"L_rear_leg": { "x": 67.29, "y": 12.63, "rotation": -162.65, "width": 206, "height": 177 }
 		},
 		},
 		"L_rear_thigh": {
 		"L_rear_thigh": {
-			"L_rear_thigh": { "x": 56.03, "y": 27.38, "rotation": 74.93, "width": 91, "height": 149 }
+			"L_rear_thigh": { "x": 56.03, "y": 27.39, "rotation": 74.94, "width": 91, "height": 149 }
 		},
 		},
 		"L_wing": {
 		"L_wing": {
 			"L_wing01": { "x": 129.21, "y": -45.49, "rotation": -83.7, "width": 191, "height": 256 },
 			"L_wing01": { "x": 129.21, "y": -45.49, "rotation": -83.7, "width": 191, "height": 256 },
-			"L_wing02": { "x": 126.37, "y": -31.69, "rotation": -86.18, "width": 179, "height": 269 },
-			"L_wing03": { "x": 110.26, "y": -90.89, "rotation": -86.18, "width": 186, "height": 207 },
-			"L_wing04": { "x": -61.61, "y": -83.26, "rotation": -86.18, "width": 188, "height": 135 },
-			"L_wing05": { "x": -90.01, "y": -78.14, "rotation": -86.18, "width": 218, "height": 213 },
-			"L_wing06": { "x": -143.76, "y": -83.71, "rotation": -86.18, "width": 192, "height": 331 },
-			"L_wing07": { "x": -133.04, "y": -33.89, "rotation": -86.18, "width": 159, "height": 255 },
-			"L_wing08": { "x": 50.15, "y": -15.71, "rotation": -86.18, "width": 164, "height": 181 },
-			"L_wing09": { "x": 85.94, "y": -11.32, "rotation": -86.18, "width": 204, "height": 167 }
+			"L_wing02": { "x": 126.38, "y": -31.69, "rotation": -86.19, "width": 179, "height": 269 },
+			"L_wing03": { "x": 110.27, "y": -90.89, "rotation": -86.19, "width": 186, "height": 207 },
+			"L_wing04": { "x": -61.62, "y": -83.27, "rotation": -86.19, "width": 188, "height": 135 },
+			"L_wing05": { "x": -90.02, "y": -78.14, "rotation": -86.19, "width": 218, "height": 213 },
+			"L_wing06": { "x": -143.77, "y": -83.72, "rotation": -86.19, "width": 192, "height": 331 },
+			"L_wing07": { "x": -133.05, "y": -33.9, "rotation": -86.19, "width": 159, "height": 255 },
+			"L_wing08": { "x": 50.15, "y": -15.71, "rotation": -86.19, "width": 164, "height": 181 },
+			"L_wing09": { "x": 85.94, "y": -11.33, "rotation": -86.19, "width": 204, "height": 167 }
 		},
 		},
 		"R_front_leg": {
 		"R_front_leg": {
-			"R_front_leg": { "x": 17.79, "y": 4.22, "rotation": 37.62, "width": 101, "height": 89 }
+			"R_front_leg": { "x": 17.8, "y": 4.23, "rotation": 37.63, "width": 101, "height": 89 }
 		},
 		},
 		"R_front_thigh": {
 		"R_front_thigh": {
-			"R_front_thigh": { "x": 35.28, "y": 2.11, "rotation": 130.33, "width": 108, "height": 108 }
+			"R_front_thigh": { "x": 35.29, "y": 2.11, "rotation": 130.33, "width": 108, "height": 108 }
 		},
 		},
 		"R_front_toe1": {
 		"R_front_toe1": {
-			"front_toeB": { "x": 24.49, "y": -2.61, "rotation": 104.18, "width": 56, "height": 57 }
+			"front_toeB": { "x": 24.5, "y": -2.61, "rotation": 104.18, "width": 56, "height": 57 }
 		},
 		},
 		"R_front_toe2": {
 		"R_front_toe2": {
-			"front_toeB": { "x": 26.39, "y": 1.16, "rotation": 104.57, "width": 56, "height": 57 }
+			"front_toeB": { "x": 26.39, "y": 1.17, "rotation": 104.58, "width": 56, "height": 57 }
 		},
 		},
 		"R_front_toe3": {
 		"R_front_toe3": {
-			"front_toeB": { "x": 30.66, "y": -0.06, "rotation": 112.29, "width": 56, "height": 57 }
+			"front_toeB": { "x": 30.67, "y": -0.07, "rotation": 112.3, "width": 56, "height": 57 }
 		},
 		},
 		"R_rear_leg": {
 		"R_rear_leg": {
-			"R_rear_leg": { "x": 60.87, "y": -5.72, "rotation": -127.66, "width": 116, "height": 100 }
+			"R_rear_leg": { "x": 60.88, "y": -5.73, "rotation": -127.67, "width": 116, "height": 100 }
 		},
 		},
 		"R_rear_thigh": {
 		"R_rear_thigh": {
 			"R_rear_thigh": { "x": 53.25, "y": 12.58, "rotation": 103.29, "width": 91, "height": 149 }
 			"R_rear_thigh": { "x": 53.25, "y": 12.58, "rotation": 103.29, "width": 91, "height": 149 }
 		},
 		},
 		"R_rear_toe1": {
 		"R_rear_toe1": {
-			"rear-toe": { "x": 54.75, "y": -5.72, "rotation": 134.79, "width": 109, "height": 77 }
+			"rear-toe": { "x": 54.76, "y": -5.72, "rotation": 134.79, "width": 109, "height": 77 }
 		},
 		},
 		"R_rear_toe2": {
 		"R_rear_toe2": {
-			"rear-toe": { "x": 57.02, "y": -7.22, "rotation": 134.42, "width": 109, "height": 77 }
+			"rear-toe": { "x": 57.03, "y": -7.23, "rotation": 134.43, "width": 109, "height": 77 }
 		},
 		},
 		"R_rear_toe3": {
 		"R_rear_toe3": {
 			"rear-toe": { "x": 47.46, "y": -7.64, "rotation": 134.34, "width": 109, "height": 77 }
 			"rear-toe": { "x": 47.46, "y": -7.64, "rotation": 134.34, "width": 109, "height": 77 }
 		},
 		},
 		"R_wing": {
 		"R_wing": {
-			"R_wing01": { "x": 170.08, "y": -23.67, "rotation": -130.33, "width": 219, "height": 310 },
-			"R_wing02": { "x": 171.14, "y": -19.33, "rotation": -130.33, "width": 203, "height": 305 },
-			"R_wing03": { "x": 166.46, "y": 29.23, "rotation": -130.33, "width": 272, "height": 247 },
-			"R_wing04": { "x": 42.94, "y": 134.05, "rotation": -130.33, "width": 279, "height": 144 },
-			"R_wing05": { "x": -8.83, "y": 142.59, "rotation": -130.33, "width": 251, "height": 229 },
-			"R_wing06": { "x": -123.33, "y": 111.22, "rotation": -130.33, "width": 200, "height": 366 },
-			"R_wing07": { "x": -40.17, "y": 118.03, "rotation": -130.33, "width": 200, "height": 263 },
-			"R_wing08": { "x": 48.01, "y": 28.76, "rotation": -130.33, "width": 234, "height": 254 },
-			"R_wing09": { "x": 128.1, "y": 21.12, "rotation": -130.33, "width": 248, "height": 204 }
+			"R_wing01": { "x": 170.08, "y": -23.68, "rotation": -130.34, "width": 219, "height": 310 },
+			"R_wing02": { "x": 171.15, "y": -19.33, "rotation": -130.34, "width": 203, "height": 305 },
+			"R_wing03": { "x": 166.46, "y": 29.24, "rotation": -130.34, "width": 272, "height": 247 },
+			"R_wing04": { "x": 42.94, "y": 134.06, "rotation": -130.34, "width": 279, "height": 144 },
+			"R_wing05": { "x": -8.84, "y": 142.59, "rotation": -130.34, "width": 251, "height": 229 },
+			"R_wing06": { "x": -123.33, "y": 111.22, "rotation": -130.34, "width": 200, "height": 366 },
+			"R_wing07": { "x": -40.17, "y": 118.03, "rotation": -130.34, "width": 200, "height": 263 },
+			"R_wing08": { "x": 48.02, "y": 28.76, "rotation": -130.34, "width": 234, "height": 254 },
+			"R_wing09": { "x": 128.1, "y": 21.13, "rotation": -130.34, "width": 248, "height": 204 }
 		},
 		},
 		"back": {
 		"back": {
-			"back": { "x": 35.84, "y": 19.99, "rotation": -151.83, "width": 190, "height": 185 }
+			"back": { "x": 35.85, "y": 19.99, "rotation": -151.83, "width": 190, "height": 185 }
 		},
 		},
 		"chest": {
 		"chest": {
-			"chest": { "x": -14.6, "y": 24.78, "rotation": -161.7, "width": 136, "height": 122 }
+			"chest": { "x": -14.6, "y": 24.79, "rotation": -161.7, "width": 136, "height": 122 }
 		},
 		},
 		"chin": {
 		"chin": {
 			"chin": { "x": 66.55, "y": 7.32, "rotation": 30.01, "width": 214, "height": 146 }
 			"chin": { "x": 66.55, "y": 7.32, "rotation": 30.01, "width": 214, "height": 146 }
 		},
 		},
 		"head": {
 		"head": {
-			"head": { "x": 76.68, "y": 32.21, "rotation": -47.12, "width": 296, "height": 260 }
+			"head": { "x": 76.69, "y": 32.21, "rotation": -47.13, "width": 296, "height": 260 }
 		},
 		},
 		"logo": {
 		"logo": {
 			"logo": { "y": -176.72, "width": 897, "height": 92 }
 			"logo": { "y": -176.72, "width": 897, "height": 92 }
 		},
 		},
 		"tail1": {
 		"tail1": {
-			"tail01": { "x": 22.59, "y": -4.5, "rotation": 163.85, "width": 120, "height": 153 }
+			"tail01": { "x": 22.6, "y": -4.5, "rotation": 163.85, "width": 120, "height": 153 }
 		},
 		},
 		"tail2": {
 		"tail2": {
-			"tail02": { "x": 18.11, "y": -1.75, "rotation": 151.84, "width": 95, "height": 120 }
+			"tail02": { "x": 18.12, "y": -1.75, "rotation": 151.85, "width": 95, "height": 120 }
 		},
 		},
 		"tail3": {
 		"tail3": {
-			"tail03": { "x": 16.94, "y": -2, "rotation": 150.04, "width": 73, "height": 92 }
+			"tail03": { "x": 16.94, "y": -2.01, "rotation": 150.04, "width": 73, "height": 92 }
 		},
 		},
 		"tail4": {
 		"tail4": {
-			"tail04": { "x": 15.34, "y": -2.17, "rotation": 151.84, "width": 56, "height": 71 }
+			"tail04": { "x": 15.35, "y": -2.18, "rotation": 151.85, "width": 56, "height": 71 }
 		},
 		},
 		"tail5": {
 		"tail5": {
-			"tail05": { "x": 15.05, "y": -3.57, "rotation": 155, "width": 52, "height": 59 }
+			"tail05": { "x": 15.06, "y": -3.57, "rotation": 155, "width": 52, "height": 59 }
 		},
 		},
 		"tail6": {
 		"tail6": {
-			"tail06": { "x": 28.02, "y": -16.83, "rotation": -175.44, "width": 95, "height": 68 }
+			"tail06": { "x": 28.02, "y": -16.83, "rotation": -175.45, "width": 95, "height": 68 }
 		}
 		}
 	}
 	}
 },
 },
@@ -187,45 +187,45 @@
 			"L_wing": {
 			"L_wing": {
 				"attachment": [
 				"attachment": [
 					{ "time": 0, "name": "L_wing01" },
 					{ "time": 0, "name": "L_wing01" },
-					{ "time": 0.0666, "name": "L_wing02" },
+					{ "time": 0.0667, "name": "L_wing02" },
 					{ "time": 0.1333, "name": "L_wing03" },
 					{ "time": 0.1333, "name": "L_wing03" },
 					{ "time": 0.2, "name": "L_wing04" },
 					{ "time": 0.2, "name": "L_wing04" },
-					{ "time": 0.2666, "name": "L_wing05" },
+					{ "time": 0.2667, "name": "L_wing05" },
 					{ "time": 0.3333, "name": "L_wing06" },
 					{ "time": 0.3333, "name": "L_wing06" },
 					{ "time": 0.4, "name": "L_wing07" },
 					{ "time": 0.4, "name": "L_wing07" },
-					{ "time": 0.4666, "name": "L_wing08" },
+					{ "time": 0.4667, "name": "L_wing08" },
 					{ "time": 0.5333, "name": "L_wing09" },
 					{ "time": 0.5333, "name": "L_wing09" },
 					{ "time": 0.6, "name": "L_wing01" },
 					{ "time": 0.6, "name": "L_wing01" },
 					{ "time": 0.7333, "name": "L_wing02" },
 					{ "time": 0.7333, "name": "L_wing02" },
 					{ "time": 0.8, "name": "L_wing03" },
 					{ "time": 0.8, "name": "L_wing03" },
 					{ "time": 0.8333, "name": "L_wing04" },
 					{ "time": 0.8333, "name": "L_wing04" },
-					{ "time": 0.8666, "name": "L_wing05" },
-					{ "time": 0.8999, "name": "L_wing06" },
+					{ "time": 0.8667, "name": "L_wing05" },
+					{ "time": 0.9, "name": "L_wing06" },
 					{ "time": 0.9333, "name": "L_wing07" },
 					{ "time": 0.9333, "name": "L_wing07" },
-					{ "time": 0.9666, "name": "L_wing08" },
+					{ "time": 0.9667, "name": "L_wing08" },
 					{ "time": 1, "name": "L_wing01" }
 					{ "time": 1, "name": "L_wing01" }
 				]
 				]
 			},
 			},
 			"R_wing": {
 			"R_wing": {
 				"attachment": [
 				"attachment": [
 					{ "time": 0, "name": "R_wing01" },
 					{ "time": 0, "name": "R_wing01" },
-					{ "time": 0.0666, "name": "R_wing02" },
+					{ "time": 0.0667, "name": "R_wing02" },
 					{ "time": 0.1333, "name": "R_wing03" },
 					{ "time": 0.1333, "name": "R_wing03" },
 					{ "time": 0.2, "name": "R_wing04" },
 					{ "time": 0.2, "name": "R_wing04" },
-					{ "time": 0.2666, "name": "R_wing05" },
+					{ "time": 0.2667, "name": "R_wing05" },
 					{ "time": 0.3333, "name": "R_wing06" },
 					{ "time": 0.3333, "name": "R_wing06" },
 					{ "time": 0.4, "name": "R_wing07" },
 					{ "time": 0.4, "name": "R_wing07" },
-					{ "time": 0.4666, "name": "R_wing08" },
+					{ "time": 0.4667, "name": "R_wing08" },
 					{ "time": 0.5333, "name": "R_wing09" },
 					{ "time": 0.5333, "name": "R_wing09" },
 					{ "time": 0.6, "name": "R_wing01" },
 					{ "time": 0.6, "name": "R_wing01" },
 					{ "time": 0.7333, "name": "R_wing02" },
 					{ "time": 0.7333, "name": "R_wing02" },
-					{ "time": 0.7666, "name": "R_wing02" },
+					{ "time": 0.7667, "name": "R_wing02" },
 					{ "time": 0.8, "name": "R_wing03" },
 					{ "time": 0.8, "name": "R_wing03" },
 					{ "time": 0.8333, "name": "R_wing04" },
 					{ "time": 0.8333, "name": "R_wing04" },
-					{ "time": 0.8666, "name": "R_wing05" },
-					{ "time": 0.8999, "name": "R_wing06" },
+					{ "time": 0.8667, "name": "R_wing05" },
+					{ "time": 0.9, "name": "R_wing06" },
 					{ "time": 0.9333, "name": "R_wing07" },
 					{ "time": 0.9333, "name": "R_wing07" },
-					{ "time": 0.9666, "name": "R_wing08" },
+					{ "time": 0.9667, "name": "R_wing08" },
 					{ "time": 1, "name": "R_wing01" }
 					{ "time": 1, "name": "R_wing01" }
 				]
 				]
 			}
 			}
@@ -234,9 +234,9 @@
 			"back": {
 			"back": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 17.39 },
+					{ "time": 0.1667, "angle": 17.39 },
 					{ "time": 0.5, "angle": 0 },
 					{ "time": 0.5, "angle": 0 },
-					{ "time": 0.8333, "angle": 7 },
+					{ "time": 0.8333, "angle": 7.01 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -253,9 +253,9 @@
 			"neck": {
 			"neck": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -8.18 },
+					{ "time": 0.1667, "angle": -8.18 },
 					{ "time": 0.3333, "angle": -23.16 },
 					{ "time": 0.3333, "angle": -23.16 },
-					{ "time": 0.5, "angle": -18.01 },
+					{ "time": 0.5, "angle": -18.02 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -289,10 +289,10 @@
 			"tail1": {
 			"tail1": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -2.42 },
-					{ "time": 0.3333, "angle": -26.2 },
-					{ "time": 0.5, "angle": -29.65 },
-					{ "time": 0.6666, "angle": -23.15 },
+					{ "time": 0.1667, "angle": -2.42 },
+					{ "time": 0.3333, "angle": -26.21 },
+					{ "time": 0.5, "angle": -29.66 },
+					{ "time": 0.6667, "angle": -23.15 },
 					{ "time": 0.8333, "angle": -55.46 },
 					{ "time": 0.8333, "angle": -55.46 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
@@ -327,10 +327,10 @@
 			"tail2": {
 			"tail2": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -1.12 },
+					{ "time": 0.1667, "angle": -1.13 },
 					{ "time": 0.3333, "angle": 10.48 },
 					{ "time": 0.3333, "angle": 10.48 },
 					{ "time": 0.5, "angle": 7.89 },
 					{ "time": 0.5, "angle": 7.89 },
-					{ "time": 0.8333, "angle": -10.38 },
+					{ "time": 0.8333, "angle": -10.39 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -347,10 +347,10 @@
 			"tail3": {
 			"tail3": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 8.24 },
+					{ "time": 0.1667, "angle": 8.25 },
 					{ "time": 0.3333, "angle": 15.21 },
 					{ "time": 0.3333, "angle": 15.21 },
-					{ "time": 0.5, "angle": 14.84 },
-					{ "time": 0.8333, "angle": -18.9 },
+					{ "time": 0.5, "angle": 14.85 },
+					{ "time": 0.8333, "angle": -18.91 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -367,7 +367,7 @@
 			"tail4": {
 			"tail4": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 17.46 },
+					{ "time": 0.1667, "angle": 17.47 },
 					{ "time": 0.3333, "angle": 22.15 },
 					{ "time": 0.3333, "angle": 22.15 },
 					{ "time": 0.5, "angle": 22.76 },
 					{ "time": 0.5, "angle": 22.76 },
 					{ "time": 0.8333, "angle": -4.37 },
 					{ "time": 0.8333, "angle": -4.37 },
@@ -387,10 +387,10 @@
 			"tail5": {
 			"tail5": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 7.4 },
-					{ "time": 0.3333, "angle": 28.5 },
+					{ "time": 0.1667, "angle": 7.4 },
+					{ "time": 0.3333, "angle": 28.51 },
 					{ "time": 0.5, "angle": 21.33 },
 					{ "time": 0.5, "angle": 21.33 },
-					{ "time": 0.8333, "angle": -1.27 },
+					{ "time": 0.8333, "angle": -1.28 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -407,7 +407,7 @@
 			"tail6": {
 			"tail6": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 45.99 },
+					{ "time": 0.1667, "angle": 46 },
 					{ "time": 0.4, "angle": 43.53 },
 					{ "time": 0.4, "angle": 43.53 },
 					{ "time": 0.5, "angle": 61.79 },
 					{ "time": 0.5, "angle": 61.79 },
 					{ "time": 0.8333, "angle": 13.28 },
 					{ "time": 0.8333, "angle": 13.28 },
@@ -427,8 +427,8 @@
 			"R_rear_leg": {
 			"R_rear_leg": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -14.21 },
-					{ "time": 0.5, "angle": 47.17 },
+					{ "time": 0.1667, "angle": -14.22 },
+					{ "time": 0.5, "angle": 47.18 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -498,9 +498,9 @@
 					{
 					{
 						"time": 0,
 						"time": 0,
 						"angle": 0,
 						"angle": 0,
-						"curve": [ 0.408, 1.36, 0.675, 1.43 ]
+						"curve": [ 0.408, 1.37, 0.675, 1.43 ]
 					},
 					},
-					{ "time": 0.5, "angle": 1.03 },
+					{ "time": 0.5, "angle": 1.04 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -519,11 +519,11 @@
 					{
 					{
 						"time": 0,
 						"time": 0,
 						"angle": 0,
 						"angle": 0,
-						"curve": [ 0.416, 1.15, 0.494, 1.27 ]
+						"curve": [ 0.417, 1.15, 0.494, 1.28 ]
 					},
 					},
 					{ "time": 0.3333, "angle": -5.15 },
 					{ "time": 0.3333, "angle": -5.15 },
-					{ "time": 0.5, "angle": 9.79 },
-					{ "time": 0.6666, "angle": 18.94 },
+					{ "time": 0.5, "angle": 9.8 },
+					{ "time": 0.6667, "angle": 18.95 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -540,7 +540,7 @@
 			"L_front_thigh": {
 			"L_front_thigh": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -19.18 },
+					{ "time": 0.1667, "angle": -19.19 },
 					{ "time": 0.3333, "angle": -32.02 },
 					{ "time": 0.3333, "angle": -32.02 },
 					{ "time": 0.5, "angle": -19.62 },
 					{ "time": 0.5, "angle": -19.62 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
@@ -559,7 +559,7 @@
 			"R_front_thigh": {
 			"R_front_thigh": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -12.96 },
+					{ "time": 0.1667, "angle": -12.96 },
 					{ "time": 0.5, "angle": 16.2 },
 					{ "time": 0.5, "angle": 16.2 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
@@ -577,7 +577,7 @@
 			"L_front_leg": {
 			"L_front_leg": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 37.77 },
+					{ "time": 0.1667, "angle": 37.77 },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
@@ -595,7 +595,7 @@
 			"L_front_toe1": {
 			"L_front_toe1": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -16.08 },
+					{ "time": 0.1667, "angle": -16.09 },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
@@ -623,14 +623,14 @@
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.5, "x": 1.33, "y": 1.029 },
+					{ "time": 0.5, "x": 1.331, "y": 1.029 },
 					{ "time": 1, "x": 1, "y": 1 }
 					{ "time": 1, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"L_front_toe4": {
 			"L_front_toe4": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.5, "angle": 26.51 },
+					{ "time": 0.5, "angle": 26.52 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -640,7 +640,7 @@
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.5, "x": 1.21, "y": 0.993 },
+					{ "time": 0.5, "x": 1.211, "y": 0.993 },
 					{ "time": 1, "x": 1, "y": 1 }
 					{ "time": 1, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
@@ -657,14 +657,14 @@
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.5, "x": 1.354, "y": 1.007 },
+					{ "time": 0.5, "x": 1.355, "y": 1.008 },
 					{ "time": 1, "x": 1, "y": 1 }
 					{ "time": 1, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"R_front_leg": {
 			"R_front_leg": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 26.07 },
+					{ "time": 0.1667, "angle": 26.07 },
 					{ "time": 0.5, "angle": -21.6 },
 					{ "time": 0.5, "angle": -21.6 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
@@ -682,8 +682,8 @@
 			"R_front_toe1": {
 			"R_front_toe1": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 29.23 },
-					{ "time": 0.5, "angle": 34.83 },
+					{ "time": 0.1667, "angle": 29.24 },
+					{ "time": 0.5, "angle": 34.84 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -700,7 +700,7 @@
 			"R_front_toe2": {
 			"R_front_toe2": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 24.89 },
+					{ "time": 0.1667, "angle": 24.9 },
 					{ "time": 0.5, "angle": 23.16 },
 					{ "time": 0.5, "angle": 23.16 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
@@ -711,14 +711,14 @@
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.5, "x": 1.407, "y": 1.057 },
+					{ "time": 0.5, "x": 1.407, "y": 1.058 },
 					{ "time": 1, "x": 1, "y": 1 }
 					{ "time": 1, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"R_front_toe3": {
 			"R_front_toe3": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 11.01 },
+					{ "time": 0.1667, "angle": 11.01 },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
@@ -729,15 +729,15 @@
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.5, "x": 1.329, "y": 1.181 },
+					{ "time": 0.5, "x": 1.33, "y": 1.182 },
 					{ "time": 1, "x": 1, "y": 1 }
 					{ "time": 1, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"L_rear_leg": {
 			"L_rear_leg": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.3666, "angle": 25.19 },
-					{ "time": 0.6666, "angle": -15.65 },
+					{ "time": 0.3667, "angle": 25.19 },
+					{ "time": 0.6667, "angle": -15.65 },
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
@@ -752,13 +752,13 @@
 					{
 					{
 						"time": 0,
 						"time": 0,
 						"angle": 0,
 						"angle": 0,
-						"curve": [ 0.456, 0.2, 0.422, 1.06 ]
+						"curve": [ 0.457, 0.2, 0.422, 1.07 ]
 					},
 					},
 					{ "time": 0.3333, "angle": 23.93 },
 					{ "time": 0.3333, "angle": 23.93 },
 					{
 					{
-						"time": 0.6666,
-						"angle": 337.79,
-						"curve": [ 0.41, 0, 0.887, 0.75 ]
+						"time": 0.6667,
+						"angle": 337.8,
+						"curve": [ 0.411, 0, 0.888, 0.75 ]
 					},
 					},
 					{ "time": 1, "angle": 0 }
 					{ "time": 1, "angle": 0 }
 				],
 				],
@@ -767,13 +767,13 @@
 						"time": 0,
 						"time": 0,
 						"x": 0,
 						"x": 0,
 						"y": 0,
 						"y": 0,
-						"curve": [ 0.33, 1, 0.816, 1.33 ]
+						"curve": [ 0.33, 1, 0.816, 1.34 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
-						"x": 0,
+						"x": -0.01,
 						"y": 113.01,
 						"y": 113.01,
-						"curve": [ 0.396, 0, 0.709, 2.03 ]
+						"curve": [ 0.397, 0, 0.71, 2.03 ]
 					},
 					},
 					{ "time": 1, "x": 0, "y": 0 }
 					{ "time": 1, "x": 0, "y": 0 }
 				]
 				]

二进制
examples/dragon/export/dragon.skel


文件差异内容过多而无法显示
+ 218 - 225
examples/goblins/export/goblins-mesh.json


二进制
examples/goblins/export/goblins-mesh.skel


+ 140 - 147
examples/goblins/export/goblins.json

@@ -1,31 +1,24 @@
 {
 {
-"skeleton": {
-	"hash": "9Twfw0ImCCb/C3Vx15ucH1FZP6U",
-	"spine": "3.5.03-beta",
-	"width": 234.01,
-	"height": 354.84,
-	"fps": 30,
-	"images": "./images/"
-},
+"skeleton": { "hash": "r5YD0f6538Hmy0yaaam0Wp73fd8", "spine": "3.6.05-beta", "width": 234.01, "height": 354.84, "images": "./images/" },
 "bones": [
 "bones": [
 	{ "name": "root" },
 	{ "name": "root" },
-	{ "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 },
-	{ "name": "torso", "parent": "hip", "length": 85.82, "rotation": 93.92, "x": -6.42, "y": 1.97 },
-	{ "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.51, "x": 81.67, "y": -6.34 },
-	{ "name": "head", "parent": "neck", "length": 68.28, "rotation": -13.92, "x": 20.93, "y": 11.59 },
-	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.04, "y": -20.38 },
-	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.16, "x": 37.85, "y": -2.34 },
-	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "rotation": -89.09, "x": 14.45, "y": 2.81 },
-	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "rotation": -16.65, "x": 56.34, "y": 0.98 },
+	{ "name": "hip", "parent": "root", "x": 0.65, "y": 114.41 },
+	{ "name": "torso", "parent": "hip", "length": 85.83, "rotation": 93.93, "x": -6.42, "y": 1.98 },
+	{ "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.52, "x": 81.68, "y": -6.35 },
+	{ "name": "head", "parent": "neck", "length": 68.29, "rotation": -13.92, "x": 20.94, "y": 11.59 },
+	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.05, "y": -20.39 },
+	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.17, "x": 37.86, "y": -2.35 },
+	{ "name": "left upper leg", "parent": "hip", "length": 50.4, "rotation": -89.1, "x": 14.45, "y": 2.81 },
+	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.9, "rotation": -16.66, "x": 56.34, "y": 0.99 },
 	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 },
 	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 },
-	{ "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.07 },
-	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 },
-	{ "name": "right shoulder", "parent": "torso", "length": 37.24, "rotation": 133.88, "x": 76.02, "y": 18.14 },
-	{ "name": "right arm", "parent": "right shoulder", "length": 36.74, "rotation": 36.32, "x": 37.6, "y": 0.31 },
-	{ "name": "right upper leg", "parent": "hip", "length": 42.45, "rotation": -97.49, "x": -20.07, "y": -6.83 },
-	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "rotation": -14.34, "x": 42.99, "y": -0.61 },
-	{ "name": "right foot", "parent": "right lower leg", "length": 45.45, "rotation": 110.3, "x": 64.88, "y": 0.04 },
-	{ "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.35, "x": 36.9, "y": 0.34 }
+	{ "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.08 },
+	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.58 },
+	{ "name": "right shoulder", "parent": "torso", "length": 37.25, "rotation": 133.89, "x": 76.02, "y": 18.15 },
+	{ "name": "right arm", "parent": "right shoulder", "length": 36.75, "rotation": 36.33, "x": 37.61, "y": 0.31 },
+	{ "name": "right upper leg", "parent": "hip", "length": 42.46, "rotation": -97.5, "x": -20.08, "y": -6.84 },
+	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.53, "rotation": -14.34, "x": 43, "y": -0.62 },
+	{ "name": "right foot", "parent": "right lower leg", "length": 45.46, "rotation": 110.31, "x": 64.89, "y": 0.04 },
+	{ "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.36, "x": 36.9, "y": 0.35 }
 ],
 ],
 "slots": [
 "slots": [
 	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
 	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
@@ -54,22 +47,22 @@
 "skins": {
 "skins": {
 	"default": {
 	"default": {
 		"left hand item": {
 		"left hand item": {
-			"dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 },
-			"spear": { "x": -4.55, "y": 39.2, "rotation": 13.04, "width": 22, "height": 368 }
+			"dagger": { "x": 7.88, "y": -23.46, "rotation": 10.48, "width": 26, "height": 108 },
+			"spear": { "x": -4.56, "y": 39.2, "rotation": 13.05, "width": 22, "height": 368 }
 		},
 		},
 		"right hand item": {
 		"right hand item": {
-			"dagger": { "x": 6.51, "y": -24.15, "rotation": -8.06, "width": 26, "height": 108 }
+			"dagger": { "x": 6.52, "y": -24.16, "rotation": -8.06, "width": 26, "height": 108 }
 		},
 		},
 		"right hand item top": {
 		"right hand item top": {
-			"shield": { "rotation": 93.49, "width": 70, "height": 72 }
+			"shield": { "rotation": 93.5, "width": 70, "height": 72 }
 		}
 		}
 	},
 	},
 	"goblin": {
 	"goblin": {
 		"eyes": {
 		"eyes": {
-			"eyes closed": { "name": "goblin/eyes-closed", "x": 32.21, "y": -21.27, "rotation": -88.92, "width": 34, "height": 12 }
+			"eyes closed": { "name": "goblin/eyes-closed", "x": 32.22, "y": -21.27, "rotation": -88.93, "width": 34, "height": 12 }
 		},
 		},
 		"head": {
 		"head": {
-			"head": { "name": "goblin/head", "x": 25.73, "y": 2.33, "rotation": -92.29, "width": 103, "height": 66 }
+			"head": { "name": "goblin/head", "x": 25.74, "y": 2.33, "rotation": -92.29, "width": 103, "height": 66 }
 		},
 		},
 		"left arm": {
 		"left arm": {
 			"left arm": {
 			"left arm": {
@@ -78,13 +71,13 @@
 				"y": -1.69,
 				"y": -1.69,
 				"scaleX": 1.057,
 				"scaleX": 1.057,
 				"scaleY": 1.057,
 				"scaleY": 1.057,
-				"rotation": 33.84,
+				"rotation": 33.85,
 				"width": 37,
 				"width": 37,
 				"height": 35
 				"height": 35
 			}
 			}
 		},
 		},
 		"left foot": {
 		"left foot": {
-			"left foot": { "name": "goblin/left-foot", "x": 24.85, "y": 8.74, "rotation": 3.32, "width": 65, "height": 31 }
+			"left foot": { "name": "goblin/left-foot", "x": 24.85, "y": 8.75, "rotation": 3.32, "width": 65, "height": 31 }
 		},
 		},
 		"left hand": {
 		"left hand": {
 			"left hand": {
 			"left hand": {
@@ -99,60 +92,60 @@
 			}
 			}
 		},
 		},
 		"left lower leg": {
 		"left lower leg": {
-			"left lower leg": { "name": "goblin/left-lower-leg", "x": 23.58, "y": -2.06, "rotation": 105.75, "width": 33, "height": 70 }
+			"left lower leg": { "name": "goblin/left-lower-leg", "x": 23.59, "y": -2.07, "rotation": 105.76, "width": 33, "height": 70 }
 		},
 		},
 		"left shoulder": {
 		"left shoulder": {
-			"left shoulder": { "name": "goblin/left-shoulder", "x": 15.56, "y": -2.26, "rotation": 62.01, "width": 29, "height": 44 }
+			"left shoulder": { "name": "goblin/left-shoulder", "x": 15.56, "y": -2.27, "rotation": 62.01, "width": 29, "height": 44 }
 		},
 		},
 		"left upper leg": {
 		"left upper leg": {
-			"left upper leg": { "name": "goblin/left-upper-leg", "x": 29.68, "y": -3.87, "rotation": 89.09, "width": 33, "height": 73 }
+			"left upper leg": { "name": "goblin/left-upper-leg", "x": 29.69, "y": -3.87, "rotation": 89.1, "width": 33, "height": 73 }
 		},
 		},
 		"neck": {
 		"neck": {
-			"neck": { "name": "goblin/neck", "x": 10.1, "y": 0.42, "rotation": -93.69, "width": 36, "height": 41 }
+			"neck": { "name": "goblin/neck", "x": 10.1, "y": 0.42, "rotation": -93.7, "width": 36, "height": 41 }
 		},
 		},
 		"pelvis": {
 		"pelvis": {
-			"pelvis": { "name": "goblin/pelvis", "x": -5.61, "y": 0.76, "width": 62, "height": 43 }
+			"pelvis": { "name": "goblin/pelvis", "x": -5.62, "y": 0.77, "width": 62, "height": 43 }
 		},
 		},
 		"right arm": {
 		"right arm": {
 			"right arm": { "name": "goblin/right-arm", "x": 16.44, "y": -1.04, "rotation": 94.32, "width": 23, "height": 50 }
 			"right arm": { "name": "goblin/right-arm", "x": 16.44, "y": -1.04, "rotation": 94.32, "width": 23, "height": 50 }
 		},
 		},
 		"right foot": {
 		"right foot": {
-			"right foot": { "name": "goblin/right-foot", "x": 23.56, "y": 9.8, "rotation": 1.52, "width": 63, "height": 33 }
+			"right foot": { "name": "goblin/right-foot", "x": 23.57, "y": 9.8, "rotation": 1.53, "width": 63, "height": 33 }
 		},
 		},
 		"right hand": {
 		"right hand": {
-			"right hand": { "name": "goblin/right-hand", "x": 7.88, "y": 2.78, "rotation": 91.96, "width": 36, "height": 37 }
+			"right hand": { "name": "goblin/right-hand", "x": 7.89, "y": 2.78, "rotation": 91.96, "width": 36, "height": 37 }
 		},
 		},
 		"right lower leg": {
 		"right lower leg": {
-			"right lower leg": { "name": "goblin/right-lower-leg", "x": 25.68, "y": -3.15, "rotation": 111.83, "width": 36, "height": 76 }
+			"right lower leg": { "name": "goblin/right-lower-leg", "x": 25.68, "y": -3.16, "rotation": 111.84, "width": 36, "height": 76 }
 		},
 		},
 		"right shoulder": {
 		"right shoulder": {
 			"right shoulder": { "name": "goblin/right-shoulder", "x": 15.68, "y": -1.03, "rotation": 130.65, "width": 39, "height": 45 }
 			"right shoulder": { "name": "goblin/right-shoulder", "x": 15.68, "y": -1.03, "rotation": 130.65, "width": 39, "height": 45 }
 		},
 		},
 		"right upper leg": {
 		"right upper leg": {
-			"right upper leg": { "name": "goblin/right-upper-leg", "x": 20.35, "y": 1.47, "rotation": 97.49, "width": 34, "height": 63 }
+			"right upper leg": { "name": "goblin/right-upper-leg", "x": 20.35, "y": 1.48, "rotation": 97.5, "width": 34, "height": 63 }
 		},
 		},
 		"torso": {
 		"torso": {
-			"torso": { "name": "goblin/torso", "x": 38.09, "y": -3.87, "rotation": -94.95, "width": 68, "height": 96 }
+			"torso": { "name": "goblin/torso", "x": 38.1, "y": -3.87, "rotation": -94.95, "width": 68, "height": 96 }
 		},
 		},
 		"undie straps": {
 		"undie straps": {
-			"undie straps": { "name": "goblin/undie-straps", "x": -3.87, "y": 13.1, "scaleX": 1.089, "width": 55, "height": 19 }
+			"undie straps": { "name": "goblin/undie-straps", "x": -3.88, "y": 13.11, "scaleX": 1.09, "width": 55, "height": 19 }
 		},
 		},
 		"undies": {
 		"undies": {
-			"undies": { "name": "goblin/undies", "x": 6.3, "y": 0.12, "rotation": 0.91, "width": 36, "height": 29 }
+			"undies": { "name": "goblin/undies", "x": 6.3, "y": 0.13, "rotation": 0.92, "width": 36, "height": 29 }
 		}
 		}
 	},
 	},
 	"goblingirl": {
 	"goblingirl": {
 		"eyes": {
 		"eyes": {
-			"eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 }
+			"eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.55, "rotation": -87.05, "width": 37, "height": 21 }
 		},
 		},
 		"head": {
 		"head": {
-			"head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 }
+			"head": { "name": "goblingirl/head", "x": 27.72, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 }
 		},
 		},
 		"left arm": {
 		"left arm": {
-			"left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 }
+			"left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.43, "rotation": 33.05, "width": 37, "height": 35 }
 		},
 		},
 		"left foot": {
 		"left foot": {
-			"left foot": { "name": "goblingirl/left-foot", "x": 25.17, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 }
+			"left foot": { "name": "goblingirl/left-foot", "x": 25.18, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 }
 		},
 		},
 		"left hand": {
 		"left hand": {
 			"left hand": {
 			"left hand": {
@@ -161,52 +154,52 @@
 				"y": 2.39,
 				"y": 2.39,
 				"scaleX": 0.896,
 				"scaleX": 0.896,
 				"scaleY": 0.896,
 				"scaleY": 0.896,
-				"rotation": 30.34,
+				"rotation": 30.35,
 				"width": 35,
 				"width": 35,
 				"height": 40
 				"height": 40
 			}
 			}
 		},
 		},
 		"left lower leg": {
 		"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 lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.61, "rotation": 105.76, "width": 33, "height": 70 }
 		},
 		},
 		"left shoulder": {
 		"left shoulder": {
-			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 }
+			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.81, "y": -0.43, "rotation": 61.22, "width": 28, "height": 46 }
 		},
 		},
 		"left upper leg": {
 		"left upper leg": {
-			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 }
+			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.22, "y": -2.95, "rotation": 89.1, "width": 33, "height": 70 }
 		},
 		},
 		"neck": {
 		"neck": {
-			"neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 }
+			"neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.15, "rotation": -98.86, "width": 35, "height": 41 }
 		},
 		},
 		"pelvis": {
 		"pelvis": {
-			"pelvis": { "name": "goblingirl/pelvis", "x": -3.87, "y": 3.18, "width": 62, "height": 43 }
+			"pelvis": { "name": "goblingirl/pelvis", "x": -3.88, "y": 3.19, "width": 62, "height": 43 }
 		},
 		},
 		"right arm": {
 		"right arm": {
-			"right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 }
+			"right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.53, "width": 28, "height": 50 }
 		},
 		},
 		"right foot": {
 		"right foot": {
-			"right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.52, "width": 63, "height": 33 }
+			"right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.53, "width": 63, "height": 33 }
 		},
 		},
 		"right hand": {
 		"right hand": {
-			"right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
+			"right hand": { "name": "goblingirl/right-hand", "x": 7.22, "y": 3.44, "rotation": 91.17, "width": 36, "height": 37 }
 		},
 		},
 		"right lower leg": {
 		"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 lower leg": { "name": "goblingirl/right-lower-leg", "x": 26.15, "y": -3.28, "rotation": 111.84, "width": 36, "height": 76 }
 		},
 		},
 		"right shoulder": {
 		"right shoulder": {
-			"right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 }
+			"right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.46, "rotation": 129.85, "width": 39, "height": 45 }
 		},
 		},
 		"right upper leg": {
 		"right upper leg": {
-			"right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.69, "y": 2.13, "rotation": 97.49, "width": 34, "height": 63 }
+			"right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.7, "y": 2.13, "rotation": 97.5, "width": 34, "height": 63 }
 		},
 		},
 		"torso": {
 		"torso": {
-			"torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 }
+			"torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.75, "width": 68, "height": 96 }
 		},
 		},
 		"undie straps": {
 		"undie straps": {
-			"undie straps": { "name": "goblingirl/undie-straps", "x": -1.51, "y": 14.18, "width": 55, "height": 19 }
+			"undie straps": { "name": "goblingirl/undie-straps", "x": -1.52, "y": 14.19, "width": 55, "height": 19 }
 		},
 		},
 		"undies": {
 		"undies": {
-			"undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.7, "width": 36, "height": 29 }
+			"undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.71, "width": 36, "height": 29 }
 		}
 		}
 	}
 	}
 },
 },
@@ -215,7 +208,7 @@
 		"slots": {
 		"slots": {
 			"eyes": {
 			"eyes": {
 				"attachment": [
 				"attachment": [
-					{ "time": 0.6999, "name": "eyes closed" },
+					{ "time": 0.7, "name": "eyes closed" },
 					{ "time": 0.8, "name": null }
 					{ "time": 0.8, "name": null }
 				]
 				]
 			}
 			}
@@ -223,62 +216,62 @@
 		"bones": {
 		"bones": {
 			"left upper leg": {
 			"left upper leg": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": -26.55 },
-					{ "time": 0.1333, "angle": -8.78 },
+					{ "time": 0, "angle": -26.56 },
+					{ "time": 0.1333, "angle": -8.79 },
 					{ "time": 0.2333, "angle": 9.51 },
 					{ "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.7 },
-					{ "time": 0.8666, "angle": -21.19 },
-					{ "time": 1, "angle": -26.55 }
+					{ "time": 0.3667, "angle": 30.74 },
+					{ "time": 0.5, "angle": 25.34 },
+					{ "time": 0.6333, "angle": 26.12 },
+					{ "time": 0.7333, "angle": -7.71 },
+					{ "time": 0.8667, "angle": -21.19 },
+					{ "time": 1, "angle": -26.56 }
 				],
 				],
 				"translate": [
 				"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 }
+					{ "time": 0, "x": -1.32, "y": 1.71 },
+					{ "time": 0.3667, "x": -0.06, "y": 2.43 },
+					{ "time": 1, "x": -1.32, "y": 1.71 }
 				]
 				]
 			},
 			},
 			"right upper leg": {
 			"right upper leg": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 42.45 },
 					{ "time": 0, "angle": 42.45 },
-					{ "time": 0.1333, "angle": 52.1 },
-					{ "time": 0.2333, "angle": 8.53 },
-					{ "time": 0.5, "angle": -16.93 },
-					{ "time": 0.6333, "angle": 1.89 },
+					{ "time": 0.1333, "angle": 52.11 },
+					{ "time": 0.2333, "angle": 8.54 },
+					{ "time": 0.5, "angle": -16.94 },
+					{ "time": 0.6333, "angle": 1.9 },
 					{
 					{
 						"time": 0.7333,
 						"time": 0.7333,
 						"angle": 28.06,
 						"angle": 28.06,
-						"curve": [ 0.462, 0.11, 1, 1 ]
+						"curve": [ 0.463, 0.12, 1, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.8666,
-						"angle": 58.68,
+						"time": 0.8667,
+						"angle": 58.69,
 						"curve": [ 0.5, 0.02, 1, 1 ]
 						"curve": [ 0.5, 0.02, 1, 1 ]
 					},
 					},
 					{ "time": 1, "angle": 42.45 }
 					{ "time": 1, "angle": 42.45 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0, "x": 6.23, "y": 0 },
+					{ "time": 0, "x": 6.24, "y": 0 },
 					{ "time": 0.2333, "x": 2.14, "y": 2.4 },
 					{ "time": 0.2333, "x": 2.14, "y": 2.4 },
 					{ "time": 0.5, "x": 2.44, "y": 4.8 },
 					{ "time": 0.5, "x": 2.44, "y": 4.8 },
-					{ "time": 1, "x": 6.23, "y": 0 }
+					{ "time": 1, "x": 6.24, "y": 0 }
 				]
 				]
 			},
 			},
 			"left lower leg": {
 			"left lower leg": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": -22.98 },
 					{ "time": 0, "angle": -22.98 },
-					{ "time": 0.1333, "angle": -63.5 },
+					{ "time": 0.1333, "angle": -63.51 },
 					{ "time": 0.2333, "angle": -73.76 },
 					{ "time": 0.2333, "angle": -73.76 },
-					{ "time": 0.5, "angle": 5.11 },
-					{ "time": 0.6333, "angle": -28.29 },
+					{ "time": 0.5, "angle": 5.12 },
+					{ "time": 0.6333, "angle": -28.3 },
 					{ "time": 0.7333, "angle": 4.08 },
 					{ "time": 0.7333, "angle": 4.08 },
-					{ "time": 0.8666, "angle": 3.53 },
+					{ "time": 0.8667, "angle": 3.53 },
 					{ "time": 1, "angle": -22.98 }
 					{ "time": 1, "angle": -22.98 }
 				],
 				],
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.2333, "x": 2.55, "y": -0.47 },
+					{ "time": 0.2333, "x": 2.56, "y": -0.47 },
 					{ "time": 0.5, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0.5, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 1, "x": 0, "y": 0 }
 					{ "time": 1, "x": 0, "y": 0 }
 				]
 				]
@@ -288,11 +281,11 @@
 					{ "time": 0, "angle": -3.69 },
 					{ "time": 0, "angle": -3.69 },
 					{ "time": 0.1333, "angle": -10.42 },
 					{ "time": 0.1333, "angle": -10.42 },
 					{ "time": 0.2333, "angle": -5.01 },
 					{ "time": 0.2333, "angle": -5.01 },
-					{ "time": 0.3666, "angle": 3.87 },
-					{ "time": 0.5, "angle": -3.87 },
+					{ "time": 0.3667, "angle": 3.87 },
+					{ "time": 0.5, "angle": -3.88 },
 					{ "time": 0.6333, "angle": 2.78 },
 					{ "time": 0.6333, "angle": 2.78 },
 					{ "time": 0.7333, "angle": 1.68 },
 					{ "time": 0.7333, "angle": 1.68 },
-					{ "time": 0.8666, "angle": -8.54 },
+					{ "time": 0.8667, "angle": -8.54 },
 					{ "time": 1, "angle": -3.69 }
 					{ "time": 1, "angle": -3.69 }
 				]
 				]
 			},
 			},
@@ -311,70 +304,70 @@
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": -4.02,
-						"curve": [ 0.267, 0, 0.804, 0.99 ]
+						"angle": -4.03,
+						"curve": [ 0.267, 0.01, 0.805, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 0.6333,
 						"time": 0.6333,
-						"angle": 19.78,
+						"angle": 19.79,
 						"curve": [ 0.307, 0, 0.787, 0.99 ]
 						"curve": [ 0.307, 0, 0.787, 0.99 ]
 					},
 					},
-					{ "time": 1, "angle": -4.02 }
+					{ "time": 1, "angle": -4.03 }
 				]
 				]
 			},
 			},
 			"right hand": {
 			"right hand": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": 8.98 },
+					{ "time": 0, "angle": 8.99 },
 					{ "time": 0.6333, "angle": 0.51 },
 					{ "time": 0.6333, "angle": 0.51 },
-					{ "time": 1, "angle": 8.98 }
+					{ "time": 1, "angle": 8.99 }
 				]
 				]
 			},
 			},
 			"left shoulder": {
 			"left shoulder": {
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": 6.25,
-						"curve": [ 0.339, 0, 0.683, 1 ]
+						"angle": 6.26,
+						"curve": [ 0.339, 0, 0.684, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
-						"angle": -11.78,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
+						"angle": -11.79,
+						"curve": [ 0.282, 0, 0.687, 0.99 ]
 					},
 					},
-					{ "time": 1, "angle": 6.25 }
+					{ "time": 1, "angle": 6.26 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0, "x": 1.15, "y": 0.23 }
+					{ "time": 0, "x": 1.15, "y": 0.24 }
 				]
 				]
 			},
 			},
 			"left hand": {
 			"left hand": {
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": -21.23,
-						"curve": [ 0.295, 0, 0.755, 0.98 ]
+						"angle": -21.24,
+						"curve": [ 0.296, 0, 0.756, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
 						"angle": -27.28,
 						"angle": -27.28,
 						"curve": [ 0.241, 0, 0.75, 0.97 ]
 						"curve": [ 0.241, 0, 0.75, 0.97 ]
 					},
 					},
-					{ "time": 1, "angle": -21.23 }
+					{ "time": 1, "angle": -21.24 }
 				]
 				]
 			},
 			},
 			"left arm": {
 			"left arm": {
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": 28.37,
-						"curve": [ 0.339, 0, 0.683, 1 ]
+						"angle": 28.38,
+						"curve": [ 0.339, 0, 0.684, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
 						"angle": 60.09,
 						"angle": 60.09,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
+						"curve": [ 0.282, 0, 0.687, 0.99 ]
 					},
 					},
-					{ "time": 1, "angle": 28.37 }
+					{ "time": 1, "angle": 28.38 }
 				]
 				]
 			},
 			},
 			"torso": {
 			"torso": {
@@ -382,38 +375,38 @@
 					{ "time": 0, "angle": -10.28 },
 					{ "time": 0, "angle": -10.28 },
 					{
 					{
 						"time": 0.1333,
 						"time": 0.1333,
-						"angle": -15.38,
-						"curve": [ 0.545, 0, 0.818, 1 ]
+						"angle": -15.39,
+						"curve": [ 0.546, 0.01, 0.819, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.3666,
+						"time": 0.3667,
 						"angle": -9.78,
 						"angle": -9.78,
-						"curve": [ 0.58, 0.17, 0.669, 0.99 ]
+						"curve": [ 0.58, 0.17, 0.67, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 0.6333,
 						"time": 0.6333,
 						"angle": -15.75,
 						"angle": -15.75,
-						"curve": [ 0.235, 0.01, 0.795, 1 ]
+						"curve": [ 0.236, 0.01, 0.796, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.8666,
-						"angle": -7.06,
-						"curve": [ 0.209, 0, 0.816, 0.98 ]
+						"time": 0.8667,
+						"angle": -7.07,
+						"curve": [ 0.21, 0, 0.816, 0.99 ]
 					},
 					},
 					{ "time": 1, "angle": -10.28 }
 					{ "time": 1, "angle": -10.28 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0, "x": -1.29, "y": 1.68 }
+					{ "time": 0, "x": -1.29, "y": 1.69 }
 				]
 				]
 			},
 			},
 			"right foot": {
 			"right foot": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": -5.25 },
 					{ "time": 0, "angle": -5.25 },
 					{ "time": 0.2333, "angle": -1.91 },
 					{ "time": 0.2333, "angle": -1.91 },
-					{ "time": 0.3666, "angle": -6.45 },
-					{ "time": 0.5, "angle": -5.39 },
-					{ "time": 0.7333, "angle": -11.68 },
-					{ "time": 0.8666, "angle": 0.46 },
+					{ "time": 0.3667, "angle": -6.45 },
+					{ "time": 0.5, "angle": -5.4 },
+					{ "time": 0.7333, "angle": -11.69 },
+					{ "time": 0.8667, "angle": 0.46 },
 					{ "time": 1, "angle": -5.25 }
 					{ "time": 1, "angle": -5.25 }
 				]
 				]
 			},
 			},
@@ -422,12 +415,12 @@
 					{
 					{
 						"time": 0,
 						"time": 0,
 						"angle": -3.39,
 						"angle": -3.39,
-						"curve": [ 0.316, 0.01, 0.741, 0.98 ]
+						"curve": [ 0.316, 0.02, 0.741, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 0.1333,
 						"time": 0.1333,
 						"angle": -45.53,
 						"angle": -45.53,
-						"curve": [ 0.229, 0, 0.738, 0.97 ]
+						"curve": [ 0.23, 0, 0.739, 0.97 ]
 					},
 					},
 					{ "time": 0.2333, "angle": -4.83 },
 					{ "time": 0.2333, "angle": -4.83 },
 					{ "time": 0.5, "angle": -19.53 },
 					{ "time": 0.5, "angle": -19.53 },
@@ -442,7 +435,7 @@
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0.5, "x": 0, "y": 0 },
 					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.6333, "x": 2.18, "y": 0.21 },
+					{ "time": 0.6333, "x": 2.19, "y": 0.21 },
 					{ "time": 1, "x": 0, "y": 0 }
 					{ "time": 1, "x": 0, "y": 0 }
 				]
 				]
 			},
 			},
@@ -456,31 +449,31 @@
 					{
 					{
 						"time": 0.1333,
 						"time": 0.1333,
 						"x": 0,
 						"x": 0,
-						"y": -7.05,
-						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
+						"y": -7.06,
+						"curve": [ 0.359, 0.47, 0.647, 0.75 ]
 					},
 					},
-					{ "time": 0.3666, "x": 0, "y": 6.78 },
-					{ "time": 0.5, "x": 0, "y": -6.13 },
+					{ "time": 0.3667, "x": 0, "y": 6.78 },
+					{ "time": 0.5, "x": 0, "y": -6.14 },
 					{
 					{
 						"time": 0.6333,
 						"time": 0.6333,
 						"x": 0,
 						"x": 0,
-						"y": -7.05,
-						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
+						"y": -7.06,
+						"curve": [ 0.359, 0.47, 0.647, 0.75 ]
 					},
 					},
-					{ "time": 0.8666, "x": 0, "y": 6.78 },
+					{ "time": 0.8667, "x": 0, "y": 6.78 },
 					{ "time": 1, "x": 0, "y": -4.16 }
 					{ "time": 1, "x": 0, "y": -4.16 }
 				]
 				]
 			},
 			},
 			"neck": {
 			"neck": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 3.6 },
 					{ "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.1333, "angle": 17.5 },
+					{ "time": 0.2333, "angle": 6.11 },
+					{ "time": 0.3667, "angle": 3.46 },
+					{ "time": 0.5, "angle": 5.18 },
 					{ "time": 0.6333, "angle": 18.36 },
 					{ "time": 0.6333, "angle": 18.36 },
 					{ "time": 0.7333, "angle": 6.09 },
 					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
+					{ "time": 0.8667, "angle": 2.29 },
 					{ "time": 1, "angle": 3.6 }
 					{ "time": 1, "angle": 3.6 }
 				]
 				]
 			},
 			},
@@ -489,19 +482,19 @@
 					{
 					{
 						"time": 0,
 						"time": 0,
 						"angle": 3.6,
 						"angle": 3.6,
-						"curve": [ 0, 0, 0.704, 1.17 ]
+						"curve": [ 0, 0, 0.704, 1.18 ]
 					},
 					},
-					{ "time": 0.1333, "angle": -0.2 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
+					{ "time": 0.1333, "angle": -0.21 },
+					{ "time": 0.2333, "angle": 6.11 },
+					{ "time": 0.3667, "angle": 3.46 },
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
-						"angle": 5.17,
-						"curve": [ 0, 0, 0.704, 1.61 ]
+						"angle": 5.18,
+						"curve": [ 0, 0, 0.704, 1.62 ]
 					},
 					},
-					{ "time": 0.6666, "angle": 1.1 },
+					{ "time": 0.6667, "angle": 1.11 },
 					{ "time": 0.7333, "angle": 6.09 },
 					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
+					{ "time": 0.8667, "angle": 2.29 },
 					{ "time": 1, "angle": 3.6 }
 					{ "time": 1, "angle": 3.6 }
 				]
 				]
 			}
 			}

二进制
examples/goblins/export/goblins.skel


文件差异内容过多而无法显示
+ 30 - 37
examples/hero/export/hero-mesh.json


二进制
examples/hero/export/hero-mesh.skel


文件差异内容过多而无法显示
+ 235 - 242
examples/hero/export/hero.json


二进制
examples/hero/export/hero.skel


+ 141 - 148
examples/powerup/export/powerup.json

@@ -1,30 +1,23 @@
 {
 {
-"skeleton": {
-	"hash": "DRH0bKbb0s4lzWxWdYTHHpv4S4I",
-	"spine": "3.5.03-beta",
-	"width": 413.18,
-	"height": 195.71,
-	"fps": 30,
-	"images": "./images/"
-},
+"skeleton": { "hash": "d01ShNZ08gDOIyqc2CGlBzHUKrA", "spine": "3.6.05-beta", "width": 413.19, "height": 195.71, "images": "./images/" },
 "bones": [
 "bones": [
 	{ "name": "root" },
 	{ "name": "root" },
 	{ "name": "powerup", "parent": "root", "x": 1.48, "y": 134.02 },
 	{ "name": "powerup", "parent": "root", "x": 1.48, "y": 134.02 },
-	{ "name": "tokenRoot", "parent": "powerup", "x": -0.47, "y": 56.13 },
+	{ "name": "tokenRoot", "parent": "powerup", "x": -0.47, "y": 56.14 },
 	{ "name": "left wing", "parent": "tokenRoot", "x": -91.06, "y": 7.8 },
 	{ "name": "left wing", "parent": "tokenRoot", "x": -91.06, "y": 7.8 },
 	{ "name": "right wing", "parent": "tokenRoot", "x": 86.82, "y": 7.12 },
 	{ "name": "right wing", "parent": "tokenRoot", "x": 86.82, "y": 7.12 },
-	{ "name": "stars", "parent": "root", "x": 1.22, "y": 191.25 },
+	{ "name": "stars", "parent": "root", "x": 1.23, "y": 191.25 },
 	{ "name": "star", "parent": "stars", "x": 2.84, "y": 4.76 },
 	{ "name": "star", "parent": "stars", "x": 2.84, "y": 4.76 },
-	{ "name": "star1", "parent": "stars", "x": -2.19, "y": -2.04 },
-	{ "name": "star2", "parent": "stars", "x": -1.36, "y": -4.16 },
+	{ "name": "star1", "parent": "stars", "x": -2.2, "y": -2.04 },
+	{ "name": "star2", "parent": "stars", "x": -1.37, "y": -4.16 },
 	{ "name": "star3", "parent": "stars", "x": -0.84, "y": -3.78 },
 	{ "name": "star3", "parent": "stars", "x": -0.84, "y": -3.78 },
-	{ "name": "star4", "parent": "stars", "x": 10.08, "y": 14.52 },
-	{ "name": "star5", "parent": "stars", "x": 11.5, "y": -12.28 },
-	{ "name": "star6", "parent": "stars", "x": -20.73, "y": -23.44 },
-	{ "name": "star7", "parent": "stars", "x": -5.85, "y": -35.84 },
+	{ "name": "star4", "parent": "stars", "x": 10.09, "y": 14.53 },
+	{ "name": "star5", "parent": "stars", "x": 11.5, "y": -12.29 },
+	{ "name": "star6", "parent": "stars", "x": -20.74, "y": -23.45 },
+	{ "name": "star7", "parent": "stars", "x": -5.86, "y": -35.85 },
 	{ "name": "star8", "parent": "stars", "x": 8.41, "y": -10.05 },
 	{ "name": "star8", "parent": "stars", "x": 8.41, "y": -10.05 },
 	{ "name": "star9", "parent": "stars", "x": -1.62, "y": -7.34 },
 	{ "name": "star9", "parent": "stars", "x": -1.62, "y": -7.34 },
-	{ "name": "token", "parent": "tokenRoot", "x": -1.18, "y": -1.81, "scaleX": 0.771, "scaleY": 0.771 }
+	{ "name": "token", "parent": "tokenRoot", "x": -1.19, "y": -1.81, "scaleX": 0.771, "scaleY": 0.771 }
 ],
 ],
 "slots": [
 "slots": [
 	{ "name": "right wing", "bone": "right wing", "attachment": "wing" },
 	{ "name": "right wing", "bone": "right wing", "attachment": "wing" },
@@ -44,10 +37,10 @@
 "skins": {
 "skins": {
 	"default": {
 	"default": {
 		"left wing": {
 		"left wing": {
-			"wing": { "x": -48.74, "y": 42.16, "scaleX": -1, "width": 137, "height": 150 }
+			"wing": { "x": -48.75, "y": 42.16, "scaleX": -1, "width": 137, "height": 150 }
 		},
 		},
 		"right wing": {
 		"right wing": {
-			"wing": { "x": 49.55, "y": 42.32, "width": 137, "height": 150 }
+			"wing": { "x": 49.56, "y": 42.32, "width": 137, "height": 150 }
 		},
 		},
 		"star": {
 		"star": {
 			"star": { "width": 76, "height": 72 }
 			"star": { "width": 76, "height": 72 }
@@ -80,7 +73,7 @@
 			"star": { "width": 76, "height": 72 }
 			"star": { "width": 76, "height": 72 }
 		},
 		},
 		"token": {
 		"token": {
-			"token": { "x": 1.18, "y": 1.81, "width": 123, "height": 122 }
+			"token": { "x": 1.19, "y": 1.81, "width": 123, "height": 122 }
 		}
 		}
 	}
 	}
 },
 },
@@ -91,12 +84,12 @@
 				"color": [
 				"color": [
 					{ "time": 0, "color": "ffffff00" },
 					{ "time": 0, "color": "ffffff00" },
 					{ "time": 0.5333, "color": "ffffffff" },
 					{ "time": 0.5333, "color": "ffffffff" },
-					{ "time": 0.6666, "color": "ffffff00" }
+					{ "time": 0.6667, "color": "ffffff00" }
 				]
 				]
 			},
 			},
 			"star1": {
 			"star1": {
 				"color": [
 				"color": [
-					{ "time": 0.2666, "color": "fff9f600" },
+					{ "time": 0.2667, "color": "fff9f600" },
 					{ "time": 0.8, "color": "ffffffff" },
 					{ "time": 0.8, "color": "ffffffff" },
 					{ "time": 0.9333, "color": "fff0f200" }
 					{ "time": 0.9333, "color": "fff0f200" }
 				]
 				]
@@ -104,14 +97,14 @@
 			"star2": {
 			"star2": {
 				"color": [
 				"color": [
 					{ "time": 0.1333, "color": "ffffff00" },
 					{ "time": 0.1333, "color": "ffffff00" },
-					{ "time": 0.6666, "color": "ffffffff" },
+					{ "time": 0.6667, "color": "ffffffff" },
 					{ "time": 0.8, "color": "ffffff00" }
 					{ "time": 0.8, "color": "ffffff00" }
 				]
 				]
 			},
 			},
 			"star3": {
 			"star3": {
 				"color": [
 				"color": [
 					{ "time": 0.4333, "color": "ffffff00" },
 					{ "time": 0.4333, "color": "ffffff00" },
-					{ "time": 0.9666, "color": "ffffffff" },
+					{ "time": 0.9667, "color": "ffffffff" },
 					{ "time": 1.1, "color": "ffffff00" }
 					{ "time": 1.1, "color": "ffffff00" }
 				]
 				]
 			},
 			},
@@ -119,7 +112,7 @@
 				"color": [
 				"color": [
 					{ "time": 0.6, "color": "ffffff00" },
 					{ "time": 0.6, "color": "ffffff00" },
 					{ "time": 1.1333, "color": "ffffffff" },
 					{ "time": 1.1333, "color": "ffffffff" },
-					{ "time": 1.2666, "color": "ffffff00" }
+					{ "time": 1.2667, "color": "ffffff00" }
 				]
 				]
 			},
 			},
 			"star5": {
 			"star5": {
@@ -135,7 +128,7 @@
 				"color": [
 				"color": [
 					{ "time": 0, "color": "ffffff2f" },
 					{ "time": 0, "color": "ffffff2f" },
 					{ "time": 0.4333, "color": "ffffffff" },
 					{ "time": 0.4333, "color": "ffffffff" },
-					{ "time": 0.5666, "color": "ffffff00", "curve": "stepped" },
+					{ "time": 0.5667, "color": "ffffff00", "curve": "stepped" },
 					{ "time": 1.2333, "color": "ffffff00" },
 					{ "time": 1.2333, "color": "ffffff00" },
 					{ "time": 1.3333, "color": "ffffff2f" }
 					{ "time": 1.3333, "color": "ffffff2f" }
 				]
 				]
@@ -143,15 +136,15 @@
 			"star7": {
 			"star7": {
 				"color": [
 				"color": [
 					{ "time": 0.6333, "color": "ffffff00" },
 					{ "time": 0.6333, "color": "ffffff00" },
-					{ "time": 1.1666, "color": "ffffffff" },
-					{ "time": 1.2999, "color": "ffffff00" }
+					{ "time": 1.1667, "color": "ffffffff" },
+					{ "time": 1.3, "color": "ffffff00" }
 				]
 				]
 			},
 			},
 			"star8": {
 			"star8": {
 				"color": [
 				"color": [
 					{ "time": 0, "color": "ffffffbf" },
 					{ "time": 0, "color": "ffffffbf" },
 					{ "time": 0.1333, "color": "ffffffff" },
 					{ "time": 0.1333, "color": "ffffffff" },
-					{ "time": 0.2666, "color": "ffffff00", "curve": "stepped" },
+					{ "time": 0.2667, "color": "ffffff00", "curve": "stepped" },
 					{ "time": 0.9333, "color": "ffffff00" },
 					{ "time": 0.9333, "color": "ffffff00" },
 					{ "time": 1.3333, "color": "ffffffbf" }
 					{ "time": 1.3333, "color": "ffffffbf" }
 				]
 				]
@@ -170,24 +163,24 @@
 				"translate": [
 				"translate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"x": -18.55,
+						"x": -18.56,
 						"y": 0,
 						"y": 0,
-						"curve": [ 0.385, 0, 0.689, 0.95 ]
+						"curve": [ 0.385, 0.01, 0.69, 0.96 ]
 					},
 					},
 					{
 					{
 						"time": 0.3333,
 						"time": 0.3333,
 						"x": 0,
 						"x": 0,
-						"y": -34.69,
-						"curve": [ 0.235, 0.66, 1, 1 ]
+						"y": -34.7,
+						"curve": [ 0.236, 0.67, 1, 1 ]
 					},
 					},
-					{ "time": 0.6666, "x": 22.04, "y": 0 },
+					{ "time": 0.6667, "x": 22.04, "y": 0 },
 					{
 					{
 						"time": 1,
 						"time": 1,
 						"x": 0,
 						"x": 0,
-						"y": -34.69,
-						"curve": [ 0.235, 0.66, 1, 1 ]
+						"y": -34.7,
+						"curve": [ 0.236, 0.67, 1, 1 ]
 					},
 					},
-					{ "time": 1.3333, "x": -18.55, "y": 0 }
+					{ "time": 1.3333, "x": -18.56, "y": 0 }
 				]
 				]
 			},
 			},
 			"left wing": {
 			"left wing": {
@@ -195,258 +188,258 @@
 					{
 					{
 						"time": 0,
 						"time": 0,
 						"angle": 45.23,
 						"angle": 45.23,
-						"curve": [ 0.393, 0, 0.629, 1 ]
+						"curve": [ 0.394, 0, 0.629, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.1666,
-						"angle": -38.74,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"time": 0.1667,
+						"angle": -38.75,
+						"curve": [ 0.164, 0.91, 1, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.3333,
 						"time": 0.3333,
 						"angle": 45.23,
 						"angle": 45.23,
-						"curve": [ 0.393, 0, 0.629, 1 ]
+						"curve": [ 0.394, 0, 0.629, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
-						"angle": -38.74,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"angle": -38.75,
+						"curve": [ 0.164, 0.91, 1, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.6666,
+						"time": 0.6667,
 						"angle": 45.23,
 						"angle": 45.23,
-						"curve": [ 0.393, 0, 0.629, 1 ]
+						"curve": [ 0.394, 0, 0.629, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.8333,
 						"time": 0.8333,
-						"angle": -38.74,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"angle": -38.75,
+						"curve": [ 0.164, 0.91, 1, 1 ]
 					},
 					},
 					{
 					{
 						"time": 1,
 						"time": 1,
 						"angle": 45.23,
 						"angle": 45.23,
-						"curve": [ 0.393, 0, 0.629, 1 ]
+						"curve": [ 0.394, 0, 0.629, 1 ]
 					},
 					},
 					{
 					{
-						"time": 1.1666,
-						"angle": -38.74,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"time": 1.1667,
+						"angle": -38.75,
+						"curve": [ 0.164, 0.91, 1, 1 ]
 					},
 					},
 					{ "time": 1.3333, "angle": 45.23 }
 					{ "time": 1.3333, "angle": 45.23 }
 				],
 				],
 				"scale": [
 				"scale": [
-					{ "time": 0, "x": 1.098, "y": 1 },
-					{ "time": 0.1666, "x": 1, "y": 0.826 },
-					{ "time": 0.3333, "x": 1.098, "y": 1 },
-					{ "time": 0.5, "x": 1, "y": 0.826 },
-					{ "time": 0.6666, "x": 1.098, "y": 1 },
-					{ "time": 0.8333, "x": 1, "y": 0.826 },
-					{ "time": 1, "x": 1.098, "y": 1 },
-					{ "time": 1.1666, "x": 1, "y": 0.826 },
-					{ "time": 1.3333, "x": 1.098, "y": 1 }
+					{ "time": 0, "x": 1.099, "y": 1 },
+					{ "time": 0.1667, "x": 1, "y": 0.827 },
+					{ "time": 0.3333, "x": 1.099, "y": 1 },
+					{ "time": 0.5, "x": 1, "y": 0.827 },
+					{ "time": 0.6667, "x": 1.099, "y": 1 },
+					{ "time": 0.8333, "x": 1, "y": 0.827 },
+					{ "time": 1, "x": 1.099, "y": 1 },
+					{ "time": 1.1667, "x": 1, "y": 0.827 },
+					{ "time": 1.3333, "x": 1.099, "y": 1 }
 				]
 				]
 			},
 			},
 			"right wing": {
 			"right wing": {
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": -39.45,
-						"curve": [ 0.327, 0, 0.637, 1 ]
+						"angle": -39.46,
+						"curve": [ 0.328, 0, 0.638, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.1666,
-						"angle": 37.67,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"time": 0.1667,
+						"angle": 37.68,
+						"curve": [ 0.164, 0.91, 1, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.3333,
 						"time": 0.3333,
-						"angle": -39.45,
-						"curve": [ 0.327, 0, 0.637, 1 ]
+						"angle": -39.46,
+						"curve": [ 0.328, 0, 0.638, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
-						"angle": 37.67,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"angle": 37.68,
+						"curve": [ 0.164, 0.91, 1, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.6666,
-						"angle": -39.45,
-						"curve": [ 0.327, 0, 0.637, 1 ]
+						"time": 0.6667,
+						"angle": -39.46,
+						"curve": [ 0.328, 0, 0.638, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.8333,
 						"time": 0.8333,
-						"angle": 37.67,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"angle": 37.68,
+						"curve": [ 0.164, 0.91, 1, 1 ]
 					},
 					},
 					{
 					{
 						"time": 1,
 						"time": 1,
-						"angle": -39.45,
-						"curve": [ 0.327, 0, 0.637, 1 ]
+						"angle": -39.46,
+						"curve": [ 0.328, 0, 0.638, 1 ]
 					},
 					},
 					{
 					{
-						"time": 1.1666,
-						"angle": 37.67,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"time": 1.1667,
+						"angle": 37.68,
+						"curve": [ 0.164, 0.91, 1, 1 ]
 					},
 					},
-					{ "time": 1.3333, "angle": -39.45 }
+					{ "time": 1.3333, "angle": -39.46 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1.09, "y": 1 },
 					{ "time": 0, "x": 1.09, "y": 1 },
-					{ "time": 0.1666, "x": 1, "y": 0.819 },
+					{ "time": 0.1667, "x": 1, "y": 0.82 },
 					{ "time": 0.3333, "x": 1.09, "y": 1 },
 					{ "time": 0.3333, "x": 1.09, "y": 1 },
-					{ "time": 0.5, "x": 1, "y": 0.819 },
-					{ "time": 0.6666, "x": 1.09, "y": 1 },
-					{ "time": 0.8333, "x": 1, "y": 0.819 },
+					{ "time": 0.5, "x": 1, "y": 0.82 },
+					{ "time": 0.6667, "x": 1.09, "y": 1 },
+					{ "time": 0.8333, "x": 1, "y": 0.82 },
 					{ "time": 1, "x": 1.09, "y": 1 },
 					{ "time": 1, "x": 1.09, "y": 1 },
-					{ "time": 1.1666, "x": 1, "y": 0.819 },
+					{ "time": 1.1667, "x": 1, "y": 0.82 },
 					{ "time": 1.3333, "x": 1.09, "y": 1 }
 					{ "time": 1.3333, "x": 1.09, "y": 1 }
 				]
 				]
 			},
 			},
 			"tokenRoot": {
 			"tokenRoot": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": 11.29 },
-					{ "time": 0.3333, "angle": 2.5 },
-					{ "time": 0.6666, "angle": -12.5 },
+					{ "time": 0, "angle": 11.3 },
+					{ "time": 0.3333, "angle": 2.51 },
+					{ "time": 0.6667, "angle": -12.5 },
 					{ "time": 1, "angle": 0.63 },
 					{ "time": 1, "angle": 0.63 },
-					{ "time": 1.3333, "angle": 11.29 }
+					{ "time": 1.3333, "angle": 11.3 }
 				]
 				]
 			},
 			},
 			"token": {
 			"token": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": -0.5 },
 					{ "time": 0, "angle": -0.5 },
-					{ "time": 0.6666, "angle": 5.86 },
+					{ "time": 0.6667, "angle": 5.87 },
 					{ "time": 1.3333, "angle": -0.5 }
 					{ "time": 1.3333, "angle": -0.5 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1.181, "y": 1.181 },
 					{ "time": 0, "x": 1.181, "y": 1.181 },
 					{ "time": 0.3333, "x": 1, "y": 1 },
 					{ "time": 0.3333, "x": 1, "y": 1 },
-					{ "time": 0.6666, "x": 1.181, "y": 1.181 },
+					{ "time": 0.6667, "x": 1.181, "y": 1.181 },
 					{ "time": 1, "x": 1, "y": 1 },
 					{ "time": 1, "x": 1, "y": 1 },
 					{ "time": 1.3333, "x": 1.181, "y": 1.181 }
 					{ "time": 1.3333, "x": 1.181, "y": 1.181 }
 				]
 				]
 			},
 			},
 			"star": {
 			"star": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": 28.25 },
-					{ "time": 0.6666, "angle": -42.08 }
+					{ "time": 0, "angle": 28.26 },
+					{ "time": 0.6667, "angle": -42.08 }
 				],
 				],
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.6666, "x": 86.68, "y": 68.32 }
+					{ "time": 0.6667, "x": 86.68, "y": 68.32 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 0.439, "y": 0.439 },
 					{ "time": 0, "x": 0.439, "y": 0.439 },
-					{ "time": 0.6666, "x": 1, "y": 1 }
+					{ "time": 0.6667, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"star1": {
 			"star1": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0.2666, "angle": 13.37 },
+					{ "time": 0.2667, "angle": 13.37 },
 					{ "time": 0.9333, "angle": 89.61 }
 					{ "time": 0.9333, "angle": 89.61 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0.2666, "x": -12.15, "y": -2.27 },
+					{ "time": 0.2667, "x": -12.16, "y": -2.28 },
 					{ "time": 0.9333, "x": -76.4, "y": 67.76 }
 					{ "time": 0.9333, "x": -76.4, "y": 67.76 }
 				],
 				],
 				"scale": [
 				"scale": [
-					{ "time": 0.2666, "x": 0.391, "y": 0.391 },
-					{ "time": 0.9333, "x": 0.815, "y": 0.815 }
+					{ "time": 0.2667, "x": 0.392, "y": 0.392 },
+					{ "time": 0.9333, "x": 0.816, "y": 0.816 }
 				]
 				]
 			},
 			},
 			"star2": {
 			"star2": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0.1333, "angle": -42.67 },
+					{ "time": 0.1333, "angle": -42.68 },
 					{ "time": 0.8, "angle": 88.41 }
 					{ "time": 0.8, "angle": 88.41 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0.1333, "x": -18.32, "y": -18.91 },
-					{ "time": 0.8, "x": -57.85, "y": -97.4 }
+					{ "time": 0.1333, "x": -18.33, "y": -18.92 },
+					{ "time": 0.8, "x": -57.86, "y": -97.4 }
 				],
 				],
 				"scale": [
 				"scale": [
-					{ "time": 0.1333, "x": 0.211, "y": 0.211 },
-					{ "time": 0.8, "x": 0.652, "y": 0.652 }
+					{ "time": 0.1333, "x": 0.212, "y": 0.212 },
+					{ "time": 0.8, "x": 0.653, "y": 0.653 }
 				]
 				]
 			},
 			},
 			"star3": {
 			"star3": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0.4333, "angle": 57.71 },
+					{ "time": 0.4333, "angle": 57.72 },
 					{ "time": 1.1, "angle": -105.15 }
 					{ "time": 1.1, "angle": -105.15 }
 				],
 				],
 				"translate": [
 				"translate": [
 					{ "time": 0.4333, "x": 36.1, "y": -40.52 },
 					{ "time": 0.4333, "x": 36.1, "y": -40.52 },
-					{ "time": 1.1, "x": 69, "y": -78.3 }
+					{ "time": 1.1, "x": 69.01, "y": -78.31 }
 				],
 				],
 				"scale": [
 				"scale": [
-					{ "time": 0.4333, "x": 0.24, "y": 0.24 },
+					{ "time": 0.4333, "x": 0.241, "y": 0.241 },
 					{ "time": 1.1, "x": 0.776, "y": 0.776 }
 					{ "time": 1.1, "x": 0.776, "y": 0.776 }
 				]
 				]
 			},
 			},
 			"star4": {
 			"star4": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0.6, "angle": 37.65 },
-					{ "time": 1.2666, "angle": -102.15 }
+					{ "time": 0.6, "angle": 37.66 },
+					{ "time": 1.2667, "angle": -102.16 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0.6, "x": 8.65, "y": -12.98 },
-					{ "time": 1.2666, "x": -0.99, "y": 82.82 }
+					{ "time": 0.6, "x": 8.66, "y": -12.98 },
+					{ "time": 1.2667, "x": -0.99, "y": 82.82 }
 				],
 				],
 				"scale": [
 				"scale": [
-					{ "time": 0.6, "x": 0.275, "y": 0.275 },
-					{ "time": 1.2666, "x": 1.081, "y": 1.081 }
+					{ "time": 0.6, "x": 0.276, "y": 0.276 },
+					{ "time": 1.2667, "x": 1.081, "y": 1.081 }
 				]
 				]
 			},
 			},
 			"star5": {
 			"star5": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": 18.27 },
+					{ "time": 0, "angle": 18.28 },
 					{ "time": 0.3333, "angle": 83.73, "curve": "stepped" },
 					{ "time": 0.3333, "angle": 83.73, "curve": "stepped" },
-					{ "time": 1, "angle": -47.17 },
-					{ "time": 1.3333, "angle": 18.27 }
+					{ "time": 1, "angle": -47.18 },
+					{ "time": 1.3333, "angle": 18.28 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0, "x": -67.73, "y": -7.78 },
-					{ "time": 0.3333, "x": -102.83, "y": -22.36, "curve": "stepped" },
-					{ "time": 1, "x": -32.63, "y": 6.8 },
-					{ "time": 1.3333, "x": -67.73, "y": -7.78 }
+					{ "time": 0, "x": -67.74, "y": -7.78 },
+					{ "time": 0.3333, "x": -102.84, "y": -22.36, "curve": "stepped" },
+					{ "time": 1, "x": -32.64, "y": 6.8 },
+					{ "time": 1.3333, "x": -67.74, "y": -7.78 }
 				],
 				],
 				"scale": [
 				"scale": [
-					{ "time": 0, "x": 0.565, "y": 0.565 },
+					{ "time": 0, "x": 0.566, "y": 0.566 },
 					{ "time": 0.3333, "x": 0.791, "y": 0.791, "curve": "stepped" },
 					{ "time": 0.3333, "x": 0.791, "y": 0.791, "curve": "stepped" },
-					{ "time": 1, "x": 0.34, "y": 0.34 },
-					{ "time": 1.3333, "x": 0.565, "y": 0.565 }
+					{ "time": 1, "x": 0.341, "y": 0.341 },
+					{ "time": 1.3333, "x": 0.566, "y": 0.566 }
 				]
 				]
 			},
 			},
 			"star6": {
 			"star6": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": 25.23 },
-					{ "time": 0.5666, "angle": -73.06, "curve": "stepped" },
-					{ "time": 1.2333, "angle": 42.58 },
-					{ "time": 1.3333, "angle": 25.23 }
+					{ "time": 0, "angle": 25.24 },
+					{ "time": 0.5667, "angle": -73.07, "curve": "stepped" },
+					{ "time": 1.2333, "angle": 42.59 },
+					{ "time": 1.3333, "angle": 25.24 }
 				],
 				],
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 4.55, "y": -14.21 },
 					{ "time": 0, "x": 4.55, "y": -14.21 },
-					{ "time": 0.5666, "x": 30.36, "y": -94.75, "curve": "stepped" },
+					{ "time": 0.5667, "x": 30.36, "y": -94.76, "curve": "stepped" },
 					{ "time": 1.2333, "x": 0, "y": 0 },
 					{ "time": 1.2333, "x": 0, "y": 0 },
 					{ "time": 1.3333, "x": 4.55, "y": -14.21 }
 					{ "time": 1.3333, "x": 4.55, "y": -14.21 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 0.337, "y": 0.337 },
 					{ "time": 0, "x": 0.337, "y": 0.337 },
-					{ "time": 0.5666, "x": 0.955, "y": 0.955, "curve": "stepped" },
-					{ "time": 1.2333, "x": 0.227, "y": 0.227 },
+					{ "time": 0.5667, "x": 0.956, "y": 0.956, "curve": "stepped" },
+					{ "time": 1.2333, "x": 0.228, "y": 0.228 },
 					{ "time": 1.3333, "x": 0.337, "y": 0.337 }
 					{ "time": 1.3333, "x": 0.337, "y": 0.337 }
 				]
 				]
 			},
 			},
 			"star7": {
 			"star7": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0.6333, "angle": 41.11 },
-					{ "time": 1.2999, "angle": -89.84 }
+					{ "time": 0.6333, "angle": 41.12 },
+					{ "time": 1.3, "angle": -89.85 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0.6333, "x": 20.27, "y": 32.75 },
-					{ "time": 1.2999, "x": -67.79, "y": -68.56 }
+					{ "time": 0.6333, "x": 20.28, "y": 32.76 },
+					{ "time": 1.3, "x": -67.8, "y": -68.56 }
 				],
 				],
 				"scale": [
 				"scale": [
-					{ "time": 0.6333, "x": 0.258, "y": 0.258 },
-					{ "time": 1.2999, "x": 0.999, "y": 0.999 }
+					{ "time": 0.6333, "x": 0.259, "y": 0.259 },
+					{ "time": 1.3, "x": 0.999, "y": 0.999 }
 				]
 				]
 			},
 			},
 			"star9": {
 			"star9": {
@@ -458,33 +451,33 @@
 				],
 				],
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": -78.75, "y": 77.18 },
 					{ "time": 0, "x": -78.75, "y": 77.18 },
-					{ "time": 0.1333, "x": -98.44, "y": 96.47, "curve": "stepped" },
+					{ "time": 0.1333, "x": -98.44, "y": 96.48, "curve": "stepped" },
 					{ "time": 0.8, "x": 0, "y": 0 },
 					{ "time": 0.8, "x": 0, "y": 0 },
 					{ "time": 1.3333, "x": -78.75, "y": 77.18 }
 					{ "time": 1.3333, "x": -78.75, "y": 77.18 }
 				],
 				],
 				"scale": [
 				"scale": [
-					{ "time": 0, "x": 0.772, "y": 0.772 },
+					{ "time": 0, "x": 0.773, "y": 0.773 },
 					{ "time": 0.1333, "x": 0.91, "y": 0.91, "curve": "stepped" },
 					{ "time": 0.1333, "x": 0.91, "y": 0.91, "curve": "stepped" },
-					{ "time": 0.8, "x": 0.221, "y": 0.221 },
-					{ "time": 1.3333, "x": 0.772, "y": 0.772 }
+					{ "time": 0.8, "x": 0.222, "y": 0.222 },
+					{ "time": 1.3333, "x": 0.773, "y": 0.773 }
 				]
 				]
 			},
 			},
 			"star8": {
 			"star8": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": -60.17 },
-					{ "time": 0.2666, "angle": -109.83, "curve": "stepped" },
+					{ "time": 0, "angle": -60.18 },
+					{ "time": 0.2667, "angle": -109.84, "curve": "stepped" },
 					{ "time": 0.9333, "angle": 14.31 },
 					{ "time": 0.9333, "angle": 14.31 },
-					{ "time": 1.3333, "angle": -60.17 }
+					{ "time": 1.3333, "angle": -60.18 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0, "x": 44.63, "y": -41.66 },
-					{ "time": 0.2666, "x": 74.39, "y": -69.43, "curve": "stepped" },
+					{ "time": 0, "x": 44.64, "y": -41.66 },
+					{ "time": 0.2667, "x": 74.4, "y": -69.44, "curve": "stepped" },
 					{ "time": 0.9333, "x": 0, "y": 0 },
 					{ "time": 0.9333, "x": 0, "y": 0 },
-					{ "time": 1.3333, "x": 44.63, "y": -41.66 }
+					{ "time": 1.3333, "x": 44.64, "y": -41.66 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 0.452, "y": 0.452 },
 					{ "time": 0, "x": 0.452, "y": 0.452 },
-					{ "time": 0.2666, "x": 0.672, "y": 0.672, "curve": "stepped" },
+					{ "time": 0.2667, "x": 0.672, "y": 0.672, "curve": "stepped" },
 					{ "time": 0.9333, "x": 0.123, "y": 0.123 },
 					{ "time": 0.9333, "x": 0.123, "y": 0.123 },
 					{ "time": 1.3333, "x": 0.452, "y": 0.452 }
 					{ "time": 1.3333, "x": 0.452, "y": 0.452 }
 				]
 				]

二进制
examples/powerup/export/powerup.skel


文件差异内容过多而无法显示
+ 102 - 109
examples/raptor/export/raptor.json


二进制
examples/raptor/export/raptor.skel


文件差异内容过多而无法显示
+ 292 - 299
examples/speedy/export/speedy.json


二进制
examples/speedy/export/speedy.skel


文件差异内容过多而无法显示
+ 306 - 313
examples/spineboy-old/export/spineboy-old.json


二进制
examples/spineboy-old/export/spineboy-old.skel


文件差异内容过多而无法显示
+ 49 - 56
examples/spineboy/export/spineboy-hover.json


二进制
examples/spineboy/export/spineboy-hover.skel


文件差异内容过多而无法显示
+ 45 - 45
examples/spineboy/export/spineboy-mesh.json


二进制
examples/spineboy/export/spineboy-mesh.skel


文件差异内容过多而无法显示
+ 236 - 243
examples/spineboy/export/spineboy.json


二进制
examples/spineboy/export/spineboy.skel


+ 64 - 71
examples/spinosaurus/export/spinosaurus.json

@@ -1,18 +1,11 @@
 {
 {
-"skeleton": {
-	"hash": "vfzL8SvUQWTNRil1kGbSbWF5R60",
-	"spine": "3.5.03-beta",
-	"width": 1680,
-	"height": 1782.27,
-	"fps": 30,
-	"images": "./images/"
-},
+"skeleton": { "hash": "/FQ62MLXDzS93xb3LzhPr1aQxX8", "spine": "3.6.05-beta", "width": 1680, "height": 1782.28, "images": "./images/" },
 "bones": [
 "bones": [
-	{ "name": "root", "y": -526.31 },
-	{ "name": "leaves", "parent": "root", "x": -0.16, "y": 1310.1 },
-	{ "name": "logo", "parent": "root", "y": 1332.02 },
+	{ "name": "root", "y": -526.32 },
+	{ "name": "leaves", "parent": "root", "x": -0.17, "y": 1310.1 },
+	{ "name": "logo", "parent": "root", "y": 1332.03 },
 	{ "name": "play", "parent": "root", "x": 3.02, "y": -83.61 },
 	{ "name": "play", "parent": "root", "x": 3.02, "y": -83.61 },
-	{ "name": "quit", "parent": "root", "x": -2.85, "y": -201.21 },
+	{ "name": "quit", "parent": "root", "x": -2.86, "y": -201.21 },
 	{ "name": "settings", "parent": "root", "x": 3.02, "y": -144.37 }
 	{ "name": "settings", "parent": "root", "x": 3.02, "y": -144.37 }
 ],
 ],
 "slots": [
 "slots": [
@@ -29,7 +22,7 @@
 			"leaves": { "y": -28.54, "width": 1042, "height": 522 }
 			"leaves": { "y": -28.54, "width": 1042, "height": 522 }
 		},
 		},
 		"logo": {
 		"logo": {
-			"logo": { "y": -20.39, "width": 917, "height": 323 }
+			"logo": { "y": -20.4, "width": 917, "height": 323 }
 		},
 		},
 		"play": {
 		"play": {
 			"play": { "width": 218, "height": 77 }
 			"play": { "width": 218, "height": 77 }
@@ -60,9 +53,9 @@
 			"play": {
 			"play": {
 				"color": [
 				"color": [
 					{ "time": 1.3333, "color": "fff99dff" },
 					{ "time": 1.3333, "color": "fff99dff" },
-					{ "time": 1.5666, "color": "ffffffff", "curve": "stepped" },
+					{ "time": 1.5667, "color": "ffffffff", "curve": "stepped" },
 					{ "time": 1.8333, "color": "ffffffff" },
 					{ "time": 1.8333, "color": "ffffffff" },
-					{ "time": 2.0666, "color": "fff99dff" }
+					{ "time": 2.0667, "color": "fff99dff" }
 				]
 				]
 			},
 			},
 			"quit": {
 			"quit": {
@@ -73,10 +66,10 @@
 			},
 			},
 			"settings": {
 			"settings": {
 				"color": [
 				"color": [
-					{ "time": 1.8666, "color": "fff99dff" },
-					{ "time": 2.0999, "color": "ffffffff", "curve": "stepped" },
-					{ "time": 2.3666, "color": "ffffffff" },
-					{ "time": 2.5999, "color": "fff99dff" }
+					{ "time": 1.8667, "color": "fff99dff" },
+					{ "time": 2.1, "color": "ffffffff", "curve": "stepped" },
+					{ "time": 2.3667, "color": "ffffffff" },
+					{ "time": 2.6, "color": "fff99dff" }
 				]
 				]
 			}
 			}
 		},
 		},
@@ -87,39 +80,39 @@
 						"time": 0,
 						"time": 0,
 						"x": 0,
 						"x": 0,
 						"y": 40.8,
 						"y": 40.8,
-						"curve": [ 0.043, 0.15, 0.344, 1.26 ]
+						"curve": [ 0.043, 0.15, 0.345, 1.27 ]
 					},
 					},
 					{
 					{
 						"time": 0.3333,
 						"time": 0.3333,
 						"x": 0,
 						"x": 0,
-						"y": -597.71,
-						"curve": [ 0.425, 0.17, 0.591, 0.99 ]
+						"y": -597.72,
+						"curve": [ 0.425, 0.17, 0.592, 1 ]
 					},
 					},
 					{
 					{
 						"time": 1,
 						"time": 1,
 						"x": 0,
 						"x": 0,
-						"y": -583.71,
+						"y": -583.72,
 						"curve": [ 0.402, 0, 0.603, 1 ]
 						"curve": [ 0.402, 0, 0.603, 1 ]
 					},
 					},
 					{
 					{
-						"time": 1.6666,
+						"time": 1.6667,
 						"x": 0,
 						"x": 0,
-						"y": -592.11,
-						"curve": [ 0.408, 0.01, 0.655, 0.98 ]
+						"y": -592.12,
+						"curve": [ 0.408, 0.01, 0.655, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 2.3333,
 						"time": 2.3333,
 						"x": 0,
 						"x": 0,
-						"y": -583.71,
-						"curve": [ 0.402, 0, 0.603, 0.99 ]
+						"y": -583.72,
+						"curve": [ 0.402, 0, 0.603, 1 ]
 					},
 					},
 					{
 					{
 						"time": 3,
 						"time": 3,
 						"x": 0,
 						"x": 0,
-						"y": -592.11,
-						"curve": [ 0.408, 0.01, 0.655, 0.98 ]
+						"y": -592.12,
+						"curve": [ 0.408, 0.01, 0.655, 0.99 ]
 					},
 					},
-					{ "time": 3.6666, "x": 0, "y": -583.71 }
+					{ "time": 3.6667, "x": 0, "y": -583.72 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{
 					{
@@ -132,61 +125,61 @@
 						"time": 0.3333,
 						"time": 0.3333,
 						"x": 1,
 						"x": 1,
 						"y": 1,
 						"y": 1,
-						"curve": [ 0.189, 0.37, 0.658, 0.98 ]
+						"curve": [ 0.19, 0.38, 0.658, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 1,
 						"time": 1,
-						"x": 1.019,
-						"y": 1.029,
-						"curve": [ 0.37, 0, 0.66, 0.99 ]
+						"x": 1.02,
+						"y": 1.03,
+						"curve": [ 0.371, 0, 0.661, 1 ]
 					},
 					},
 					{
 					{
-						"time": 1.6666,
+						"time": 1.6667,
 						"x": 1,
 						"x": 1,
 						"y": 1,
 						"y": 1,
-						"curve": [ 0.387, 0.01, 0.686, 1 ]
+						"curve": [ 0.388, 0.01, 0.687, 1 ]
 					},
 					},
 					{
 					{
 						"time": 2.3333,
 						"time": 2.3333,
-						"x": 1.019,
-						"y": 1.029,
-						"curve": [ 0.37, 0, 0.66, 0.99 ]
+						"x": 1.02,
+						"y": 1.03,
+						"curve": [ 0.371, 0, 0.661, 1 ]
 					},
 					},
 					{
 					{
 						"time": 3,
 						"time": 3,
 						"x": 1,
 						"x": 1,
 						"y": 1,
 						"y": 1,
-						"curve": [ 0.387, 0.01, 0.686, 1 ]
+						"curve": [ 0.388, 0.01, 0.687, 1 ]
 					},
 					},
-					{ "time": 3.6666, "x": 1.019, "y": 1.029 }
+					{ "time": 3.6667, "x": 1.02, "y": 1.03 }
 				]
 				]
 			},
 			},
 			"play": {
 			"play": {
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{
 					{
-						"time": 0.6666,
+						"time": 0.6667,
 						"x": 0,
 						"x": 0,
 						"y": 0,
 						"y": 0,
-						"curve": [ 0, 0, 0.448, 1.62 ]
+						"curve": [ 0, 0, 0.448, 1.63 ]
 					},
 					},
-					{ "time": 0.8666, "x": 0, "y": 480.2 }
+					{ "time": 0.8667, "x": 0, "y": 480.2 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{
 					{
 						"time": 1.3333,
 						"time": 1.3333,
 						"x": 1,
 						"x": 1,
 						"y": 1,
 						"y": 1,
-						"curve": [ 0, 0, 0.525, 2.46 ]
+						"curve": [ 0, 0, 0.526, 2.46 ]
 					},
 					},
-					{ "time": 1.5666, "x": 1.231, "y": 1.231, "curve": "stepped" },
+					{ "time": 1.5667, "x": 1.231, "y": 1.231, "curve": "stepped" },
 					{
 					{
 						"time": 1.8333,
 						"time": 1.8333,
 						"x": 1.231,
 						"x": 1.231,
 						"y": 1.231,
 						"y": 1.231,
-						"curve": [ 0, 0, 0.525, 2.46 ]
+						"curve": [ 0, 0, 0.526, 2.46 ]
 					},
 					},
-					{ "time": 2.0666, "x": 1, "y": 1 }
+					{ "time": 2.0667, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"settings": {
 			"settings": {
@@ -195,25 +188,25 @@
 						"time": 0.8,
 						"time": 0.8,
 						"x": 0,
 						"x": 0,
 						"y": 0,
 						"y": 0,
-						"curve": [ 0, 0, 0.448, 1.62 ]
+						"curve": [ 0, 0, 0.448, 1.63 ]
 					},
 					},
 					{ "time": 1, "x": 0, "y": 431.2 }
 					{ "time": 1, "x": 0, "y": 431.2 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{
 					{
-						"time": 1.8666,
+						"time": 1.8667,
 						"x": 1,
 						"x": 1,
 						"y": 1,
 						"y": 1,
-						"curve": [ 0, 0, 0.525, 2.46 ]
+						"curve": [ 0, 0, 0.526, 2.46 ]
 					},
 					},
-					{ "time": 2.0999, "x": 1.23, "y": 1.23, "curve": "stepped" },
+					{ "time": 2.1, "x": 1.23, "y": 1.23, "curve": "stepped" },
 					{
 					{
-						"time": 2.3666,
+						"time": 2.3667,
 						"x": 1.23,
 						"x": 1.23,
 						"y": 1.23,
 						"y": 1.23,
-						"curve": [ 0, 0, 0.525, 2.46 ]
+						"curve": [ 0, 0, 0.526, 2.46 ]
 					},
 					},
-					{ "time": 2.5999, "x": 1, "y": 1 }
+					{ "time": 2.6, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"quit": {
 			"quit": {
@@ -222,7 +215,7 @@
 						"time": 0.9333,
 						"time": 0.9333,
 						"x": 0,
 						"x": 0,
 						"y": 0,
 						"y": 0,
-						"curve": [ 0, 0, 0.448, 1.62 ]
+						"curve": [ 0, 0, 0.448, 1.63 ]
 					},
 					},
 					{ "time": 1.1333, "x": 0, "y": 376.32 }
 					{ "time": 1.1333, "x": 0, "y": 376.32 }
 				],
 				],
@@ -231,7 +224,7 @@
 						"time": 2.4,
 						"time": 2.4,
 						"x": 1,
 						"x": 1,
 						"y": 1,
 						"y": 1,
-						"curve": [ 0, 0, 0.525, 2.46 ]
+						"curve": [ 0, 0, 0.526, 2.46 ]
 					},
 					},
 					{ "time": 2.6333, "x": 1.23, "y": 1.23 }
 					{ "time": 2.6333, "x": 1.23, "y": 1.23 }
 				]
 				]
@@ -242,28 +235,28 @@
 						"time": 0,
 						"time": 0,
 						"x": 0,
 						"x": 0,
 						"y": 0,
 						"y": 0,
-						"curve": [ 0.043, 0.15, 0.344, 1.26 ]
+						"curve": [ 0.043, 0.15, 0.345, 1.27 ]
 					},
 					},
 					{
 					{
 						"time": 0.3333,
 						"time": 0.3333,
-						"x": 0.16,
-						"y": -601.23,
-						"curve": [ 0.425, 0.17, 0.591, 0.99 ]
+						"x": 0.17,
+						"y": -601.24,
+						"curve": [ 0.425, 0.17, 0.592, 1 ]
 					},
 					},
 					{
 					{
 						"time": 1.3333,
 						"time": 1.3333,
-						"x": 0.16,
-						"y": -580.83,
+						"x": 0.17,
+						"y": -580.84,
 						"curve": [ 0.402, 0, 0.603, 1 ]
 						"curve": [ 0.402, 0, 0.603, 1 ]
 					},
 					},
-					{ "time": 2, "x": 0.16, "y": -595.11 },
+					{ "time": 2, "x": 0.17, "y": -595.12 },
 					{
 					{
-						"time": 2.6666,
-						"x": 0.16,
-						"y": -580.83,
+						"time": 2.6667,
+						"x": 0.17,
+						"y": -580.84,
 						"curve": [ 0.402, 0, 0.603, 1 ]
 						"curve": [ 0.402, 0, 0.603, 1 ]
 					},
 					},
-					{ "time": 3.3333, "x": 0.16, "y": -595.11 }
+					{ "time": 3.3333, "x": 0.17, "y": -595.12 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{
 					{
@@ -273,9 +266,9 @@
 						"curve": [ 0, 0, 0.744, 0.4 ]
 						"curve": [ 0, 0, 0.744, 0.4 ]
 					},
 					},
 					{ "time": 0.3333, "x": 1, "y": 1 },
 					{ "time": 0.3333, "x": 1, "y": 1 },
-					{ "time": 1.3333, "x": 1.029, "y": 1.019 },
+					{ "time": 1.3333, "x": 1.03, "y": 1.02 },
 					{ "time": 2, "x": 1, "y": 1 },
 					{ "time": 2, "x": 1, "y": 1 },
-					{ "time": 2.6666, "x": 1.029, "y": 1.019 },
+					{ "time": 2.6667, "x": 1.03, "y": 1.02 },
 					{ "time": 3.3333, "x": 1, "y": 1 }
 					{ "time": 3.3333, "x": 1, "y": 1 }
 				]
 				]
 			}
 			}

二进制
examples/spinosaurus/export/spinosaurus.skel


文件差异内容过多而无法显示
+ 56 - 71
examples/stretchyman/export/stretchyman.json


二进制
examples/stretchyman/export/stretchyman.skel


文件差异内容过多而无法显示
+ 27 - 36
examples/tank/export/tank.json


二进制
examples/tank/export/tank.skel


二进制
examples/tank/tank.spine


+ 34 - 41
examples/test/export/test.json

@@ -1,20 +1,13 @@
 {
 {
-"skeleton": {
-	"hash": "i05EldfljpjLC64I/kHnNrqzJ5A",
-	"spine": "3.5.03-beta",
-	"width": 1333.78,
-	"height": 1112.91,
-	"fps": 30,
-	"images": "./images/"
-},
+"skeleton": { "hash": "64h+ct/Nr1wkBrgZHtYbbfXpBlI", "spine": "3.6.05-beta", "width": 1333.78, "height": 1112.91, "images": "./images/" },
 "bones": [
 "bones": [
-	{ "name": "root", "x": 28.68, "y": -105.7 },
-	{ "name": "attachment", "parent": "root", "x": -267.7, "y": -366.61 },
-	{ "name": "color", "parent": "root", "x": -298.29, "y": 44.09 },
-	{ "name": "draworder", "parent": "root", "x": 283.52, "y": -356.26 },
-	{ "name": "mesh", "parent": "root", "x": -320.73, "y": 413.7 },
-	{ "name": "meshweighted", "parent": "root", "rotation": -11.22, "x": -353.27, "y": 627.53 },
-	{ "name": "pathfollower", "parent": "root", "x": 177.52, "y": 56.61 },
+	{ "name": "root", "x": 28.68, "y": -105.71 },
+	{ "name": "attachment", "parent": "root", "x": -267.71, "y": -366.62 },
+	{ "name": "color", "parent": "root", "x": -298.3, "y": 44.1 },
+	{ "name": "draworder", "parent": "root", "x": 283.53, "y": -356.27 },
+	{ "name": "mesh", "parent": "root", "x": -320.74, "y": 413.7 },
+	{ "name": "meshweighted", "parent": "root", "rotation": -11.22, "x": -353.28, "y": 627.53 },
+	{ "name": "pathfollower", "parent": "root", "x": 177.52, "y": 56.62 },
 	{ "name": "rotate", "parent": "root", "x": -305, "y": 201 },
 	{ "name": "rotate", "parent": "root", "x": -305, "y": 201 },
 	{ "name": "scale", "parent": "root", "x": 183.99, "y": -138 },
 	{ "name": "scale", "parent": "root", "x": 183.99, "y": -138 },
 	{ "name": "shear", "parent": "root", "x": -304, "y": -146 },
 	{ "name": "shear", "parent": "root", "x": -304, "y": -146 },
@@ -81,7 +74,7 @@
 				"path": "spine",
 				"path": "spine",
 				"uvs": [ 0, 0, 0.25, 0, 0.5, 0, 0.75, 0, 1, 0, 1, 0.25, 1, 0.5, 1, 0.75, 1, 1, 0.75, 1, 0.5, 1, 0.25, 1, 0, 1, 0, 0.75, 0, 0.5, 0, 0.25, 0.25, 0.25, 0.25, 0.5, 0.25, 0.75, 0.5, 0.25, 0.5, 0.5, 0.5, 0.75, 0.75, 0.25, 0.75, 0.5, 0.75, 0.75 ],
 				"uvs": [ 0, 0, 0.25, 0, 0.5, 0, 0.75, 0, 1, 0, 1, 0.25, 1, 0.5, 1, 0.75, 1, 1, 0.75, 1, 0.5, 1, 0.25, 1, 0, 1, 0, 0.75, 0, 0.5, 0, 0.25, 0.25, 0.25, 0.25, 0.5, 0.25, 0.75, 0.5, 0.25, 0.5, 0.5, 0.5, 0.75, 0.75, 0.25, 0.75, 0.5, 0.75, 0.75 ],
 				"triangles": [ 15, 0, 1, 16, 1, 2, 15, 1, 16, 19, 2, 3, 16, 2, 19, 22, 3, 4, 19, 3, 22, 22, 4, 5, 14, 15, 16, 17, 16, 19, 14, 16, 17, 20, 19, 22, 17, 19, 20, 23, 22, 5, 20, 22, 23, 23, 5, 6, 13, 14, 17, 18, 17, 20, 13, 17, 18, 21, 20, 23, 18, 20, 21, 24, 23, 6, 21, 23, 24, 24, 6, 7, 12, 13, 18, 11, 18, 21, 12, 18, 11, 10, 21, 24, 11, 21, 10, 9, 24, 7, 10, 24, 9, 9, 7, 8 ],
 				"triangles": [ 15, 0, 1, 16, 1, 2, 15, 1, 16, 19, 2, 3, 16, 2, 19, 22, 3, 4, 19, 3, 22, 22, 4, 5, 14, 15, 16, 17, 16, 19, 14, 16, 17, 20, 19, 22, 17, 19, 20, 23, 22, 5, 20, 22, 23, 23, 5, 6, 13, 14, 17, 18, 17, 20, 13, 17, 18, 21, 20, 23, 18, 20, 21, 24, 23, 6, 21, 23, 24, 24, 6, 7, 12, 13, 18, 11, 18, 21, 12, 18, 11, 10, 21, 24, 11, 21, 10, 9, 24, 7, 10, 24, 9, 9, 7, 8 ],
-				"vertices": [ 1, 5, -194.66, 21.29, 1, 1, 5, -102.08, 38.90999, 1, 1, 5, -9.47999, 56.54, 1, 1, 5, 83.08, 74.16, 1, 1, 5, 175.66, 91.79, 1, 1, 5, 181.27, 62.31, 1, 1, 5, 186.88, 32.84, 1, 1, 5, 192.5, 3.38, 1, 1, 5, 198.11, -26.09, 1, 1, 5, 105.51, -43.7, 1, 1, 5, 12.93, -61.33, 1, 1, 5, -79.62999, -78.94999, 1, 1, 5, -172.22, -96.58, 1, 1, 5, -177.83, -67.11, 1, 1, 5, -183.44, -37.63, 1, 1, 5, -189.05, -8.17, 1, 1, 5, -96.47, 9.43999, 1, 1, 5, -90.86, -20.01, 1, 1, 5, -85.25, -49.47, 1, 1, 5, -3.88, 27.05999, 1, 1, 5, 1.72, -2.39, 1, 1, 5, 7.32, -31.86, 1, 1, 5, 88.69, 44.68, 1, 1, 5, 94.3, 15.22, 1, 1, 5, 99.91, -14.22999, 1 ],
+				"vertices": [ 1, 5, -194.67, 21.29, 1, 1, 5, -102.08, 38.92, 1, 1, 5, -9.49, 56.54, 1, 1, 5, 83.09, 74.16, 1, 1, 5, 175.67, 91.79, 1, 1, 5, 181.28, 62.32, 1, 1, 5, 186.89, 32.85, 1, 1, 5, 192.5, 3.38, 1, 1, 5, 198.11, -26.09, 1, 1, 5, 105.52, -43.71, 1, 1, 5, 12.94, -61.33, 1, 1, 5, -79.64, -78.96, 1, 1, 5, -172.23, -96.58, 1, 1, 5, -177.84, -67.11, 1, 1, 5, -183.45, -37.64, 1, 1, 5, -189.06, -8.17, 1, 1, 5, -96.47, 9.45, 1, 1, 5, -90.86, -20.01, 1, 1, 5, -85.25, -49.48, 1, 1, 5, -3.88, 27.07, 1, 1, 5, 1.72, -2.39, 1, 1, 5, 7.33, -31.86, 1, 1, 5, 88.7, 44.69, 1, 1, 5, 94.31, 15.22, 1, 1, 5, 99.92, -14.24, 1 ],
 				"hull": 16,
 				"hull": 16,
 				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 0 ],
 				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 0 ],
 				"width": 377,
 				"width": 377,
@@ -114,9 +107,9 @@
 			"images/spine": {
 			"images/spine": {
 				"type": "mesh",
 				"type": "mesh",
 				"path": "spine",
 				"path": "spine",
-				"uvs": [ 1, 0.50124, 1, 1, 0.72412, 1, 0.49981, 1, 0.2858, 1, 0, 1, 0, 0.50124, 0, 0, 0.49206, 0, 1, 0, 0.56941, 0.57414, 0.84013, 0.50124, 0.6184, 0.22584, 0.20588, 0.20153, 0.19558, 0.67133, 0.39151, 0.86574, 0.3941, 0.41214, 0.3941, 0.12863, 0.7602, 0.19344, 0.76537, 0.59034, 0.74474, 0.84144, 0.57716, 0.81713 ],
+				"uvs": [ 1, 0.50124, 1, 1, 0.72412, 1, 0.49981, 1, 0.28581, 1, 0, 1, 0, 0.50124, 0, 0, 0.49207, 0, 1, 0, 0.56942, 0.57414, 0.84014, 0.50124, 0.61841, 0.22584, 0.20589, 0.20154, 0.19558, 0.67134, 0.39152, 0.86574, 0.3941, 0.41214, 0.3941, 0.12864, 0.76021, 0.19344, 0.76537, 0.59034, 0.74474, 0.84144, 0.57716, 0.81714 ],
 				"triangles": [ 17, 7, 8, 18, 8, 9, 13, 7, 17, 12, 8, 18, 17, 8, 12, 16, 17, 12, 13, 17, 16, 6, 7, 13, 6, 13, 16, 18, 9, 0, 11, 18, 0, 10, 16, 12, 12, 18, 11, 10, 12, 11, 19, 10, 11, 14, 6, 16, 14, 16, 10, 21, 10, 19, 15, 14, 10, 20, 21, 19, 21, 15, 10, 5, 6, 14, 4, 5, 14, 15, 4, 14, 3, 15, 21, 4, 15, 3, 2, 21, 20, 3, 21, 2, 19, 11, 0, 0, 20, 19, 1, 20, 0, 2, 20, 1 ],
 				"triangles": [ 17, 7, 8, 18, 8, 9, 13, 7, 17, 12, 8, 18, 17, 8, 12, 16, 17, 12, 13, 17, 16, 6, 7, 13, 6, 13, 16, 18, 9, 0, 11, 18, 0, 10, 16, 12, 12, 18, 11, 10, 12, 11, 19, 10, 11, 14, 6, 16, 14, 16, 10, 21, 10, 19, 15, 14, 10, 20, 21, 19, 21, 15, 10, 5, 6, 14, 4, 5, 14, 15, 4, 14, 3, 15, 21, 4, 15, 3, 2, 21, 20, 3, 21, 2, 19, 11, 0, 0, 20, 19, 1, 20, 0, 2, 20, 1 ],
-				"vertices": [ 191.41, -1.12, 191.41, -60.97, 87.4, -60.97, 2.82999, -60.97, -77.80999, -60.97, -185.58, -60.97, -185.58, -1.12, -185.58, 59.02, -0.07, 59.02, 191.41, 59.02, 29.09, -9.85, 131.13, -1.12, 47.54, 31.92, -107.94999, 34.84, -111.83999, -21.53, -37.97, -44.86, -37, 9.56, -37, 43.59, 101.01, 35.81, 102.94999, -11.81, 95.18, -41.93, 32, -39.02 ],
+				"vertices": [ 191.41, -1.12, 191.41, -60.97, 87.4, -60.97, 2.84, -60.97, -77.82, -60.97, -185.58, -60.97, -185.58, -1.12, -185.58, 59.02, -0.07, 59.02, 191.41, 59.02, 29.09, -9.86, 131.14, -1.12, 47.55, 31.92, -107.96, 34.84, -111.85, -21.53, -37.97, -44.86, -37, 9.57, -37, 43.59, 101.01, 35.81, 102.96, -11.81, 95.18, -41.94, 32, -39.02 ],
 				"hull": 10,
 				"hull": 10,
 				"edges": [ 10, 12, 12, 14, 14, 16, 16, 18, 2, 0, 0, 18, 6, 8, 8, 10, 2, 4, 4, 6 ],
 				"edges": [ 10, 12, 12, 14, 14, 16, 16, 18, 2, 0, 0, 18, 6, 8, 8, 10, 2, 4, 4, 6 ],
 				"width": 377,
 				"width": 377,
@@ -127,9 +120,9 @@
 			"path": {
 			"path": {
 				"type": "path",
 				"type": "path",
 				"closed": true,
 				"closed": true,
-				"lengths": [ 128.85, 310.24, 465.06, 600.88, 773.97 ],
+				"lengths": [ 128.85, 310.24, 465.06, 600.89, 773.98 ],
 				"vertexCount": 15,
 				"vertexCount": 15,
-				"vertices": [ 258.07, -42.65999, 291.94, -17.53, 326.41, 7.21, 391.41, 2.75, 398.04, 46.72, 399.82, 84.05999, 274.02, 106.4, 236.69, 117.73, 199.36, 129.08, 116.55, 135.11, 84.41, 115.47, 50.34, 94.04, 56.52, 1.48, 89.01, -5.59, 122.87999, -13.56999 ]
+				"vertices": [ 258.08, -42.67, 291.94, -17.53, 326.41, 7.22, 391.41, 2.75, 398.05, 46.72, 399.83, 84.07, 274.03, 106.4, 236.7, 117.74, 199.37, 129.09, 116.55, 135.12, 84.41, 115.47, 50.34, 94.04, 56.53, 1.48, 89.01, -5.59, 122.89, -13.58 ]
 			}
 			}
 		}
 		}
 	}
 	}
@@ -141,21 +134,21 @@
 				"color": [
 				"color": [
 					{ "time": 0, "color": "ffffffff" },
 					{ "time": 0, "color": "ffffffff" },
 					{ "time": 0.4333, "color": "ff0901ff" },
 					{ "time": 0.4333, "color": "ff0901ff" },
-					{ "time": 0.8999, "color": "2dff00ff" },
+					{ "time": 0.9, "color": "2dff00ff" },
 					{ "time": 1.3333, "color": "ffffffff" }
 					{ "time": 1.3333, "color": "ffffffff" }
 				]
 				]
 			},
 			},
 			"images/spine10": {
 			"images/spine10": {
 				"attachment": [
 				"attachment": [
 					{ "time": 0, "name": "images/spine" },
 					{ "time": 0, "name": "images/spine" },
-					{ "time": 0.6666, "name": "images/logo" },
+					{ "time": 0.6667, "name": "images/logo" },
 					{ "time": 1.3333, "name": "images/spine" }
 					{ "time": 1.3333, "name": "images/spine" }
 				]
 				]
 			},
 			},
 			"images/spine12": {
 			"images/spine12": {
 				"attachment": [
 				"attachment": [
 					{ "time": 0, "name": "images/spine" },
 					{ "time": 0, "name": "images/spine" },
-					{ "time": 0.6666, "name": "linkedmesh" }
+					{ "time": 0.6667, "name": "linkedmesh" }
 				]
 				]
 			}
 			}
 		},
 		},
@@ -168,50 +161,50 @@
 						"y": 0,
 						"y": 0,
 						"curve": [ 1, 0, 0, 1 ]
 						"curve": [ 1, 0, 0, 1 ]
 					},
 					},
-					{ "time": 0.6666, "x": 96.98, "y": -151 },
+					{ "time": 0.6667, "x": 96.99, "y": -151 },
 					{ "time": 1.3333, "x": 0, "y": 0 }
 					{ "time": 1.3333, "x": 0, "y": 0 }
 				]
 				]
 			},
 			},
 			"scale": {
 			"scale": {
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.6666, "x": 1, "y": 2.339 },
+					{ "time": 0.6667, "x": 1, "y": 2.34 },
 					{ "time": 1.3333, "x": 1, "y": 1 }
 					{ "time": 1.3333, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"rotate": {
 			"rotate": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": -125.33 },
+					{ "time": 0.6667, "angle": -125.34 },
 					{ "time": 1.3333, "angle": 0 }
 					{ "time": 1.3333, "angle": 0 }
 				]
 				]
 			},
 			},
 			"shear": {
 			"shear": {
 				"shear": [
 				"shear": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.6666, "x": 29.39, "y": 0 },
+					{ "time": 0.6667, "x": 29.4, "y": 0 },
 					{ "time": 1.3333, "x": 0, "y": 0 }
 					{ "time": 1.3333, "x": 0, "y": 0 }
 				]
 				]
 			},
 			},
 			"transformconstrainttarget": {
 			"transformconstrainttarget": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": -74.59 },
+					{ "time": 0.6667, "angle": -74.6 },
 					{ "time": 1.3333, "angle": 0 }
 					{ "time": 1.3333, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.6666, "x": 176.22, "y": -170.33 },
+					{ "time": 0.6667, "x": 176.22, "y": -170.34 },
 					{ "time": 1.3333, "x": 0, "y": 0 }
 					{ "time": 1.3333, "x": 0, "y": 0 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.6666, "x": 2, "y": 2 },
+					{ "time": 0.6667, "x": 2, "y": 2 },
 					{ "time": 1.3333, "x": 1, "y": 1 }
 					{ "time": 1.3333, "x": 1, "y": 1 }
 				],
 				],
 				"shear": [
 				"shear": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.6666, "x": 23.39, "y": 0 },
+					{ "time": 0.6667, "x": 23.4, "y": 0 },
 					{ "time": 1.3333, "x": 0, "y": 0 }
 					{ "time": 1.3333, "x": 0, "y": 0 }
 				]
 				]
 			}
 			}
@@ -219,7 +212,7 @@
 		"transform": {
 		"transform": {
 			"transformconstraint": [
 			"transformconstraint": [
 				{ "time": 0, "rotateMix": 0.509, "translateMix": 0.509, "scaleMix": 0.509, "shearMix": 0.509 },
 				{ "time": 0, "rotateMix": 0.509, "translateMix": 0.509, "scaleMix": 0.509, "shearMix": 0.509 },
-				{ "time": 0.6666 },
+				{ "time": 0.6667 },
 				{ "time": 1.3333, "rotateMix": 0.5, "translateMix": 0.5, "scaleMix": 0.5, "shearMix": 0.5 }
 				{ "time": 1.3333, "rotateMix": 0.5, "translateMix": 0.5, "scaleMix": 0.5, "shearMix": 0.5 }
 			]
 			]
 		},
 		},
@@ -230,11 +223,11 @@
 					{ "time": 1.3333, "position": 1 }
 					{ "time": 1.3333, "position": 1 }
 				],
 				],
 				"spacing": [
 				"spacing": [
-					{ "time": 0, "spacing": 40.0999 },
+					{ "time": 0, "spacing": 40.1 },
 					{ "time": 1.3333 }
 					{ "time": 1.3333 }
 				],
 				],
 				"mix": [
 				"mix": [
-					{ "time": 0.6666, "rotateMix": 0.4729, "translateMix": 0.4729 },
+					{ "time": 0.6667, "rotateMix": 0.473, "translateMix": 0.473 },
 					{ "time": 1.3333 }
 					{ "time": 1.3333 }
 				]
 				]
 			}
 			}
@@ -245,8 +238,8 @@
 					"images/spine": [
 					"images/spine": [
 						{ "time": 0 },
 						{ "time": 0 },
 						{
 						{
-							"time": 0.6666,
-							"vertices": [ 43.09783, 58.11693, 0, 0, 0, 0, -0.653, -57.46398, -50.93395, -47.01593, -43.098, -24.81398, -43.098, -24.81399, -1.0E-5, 1.0E-5, 0, 1.0E-5, 43.09783, 58.11695, 0, 0, 43.09783, 58.11693, 1.0E-5, -1.0E-5, 0, 0, -43.09797, -24.81399, 0, 1.0E-5, 0, 0, 0, 0, 43.09783, 58.11694, 43.09783, 58.11693 ]
+							"time": 0.6667,
+							"vertices": [ 43.09784, 58.11694, 0, 0, 1.0E-5, 0, -0.65301, -57.46399, -50.93396, -47.01593, -43.09801, -24.81399, -43.09801, -24.814, -2.0E-5, 1.0E-5, 1.0E-5, 1.0E-5, 43.09784, 58.11695, 0, 0, 43.09784, 58.11694, 1.0E-5, -1.0E-5, -1.0E-5, 0, -43.09798, -24.81399, 0, 2.0E-5, 0, -1.0E-5, 0, 0, 43.09784, 58.11694, 43.09784, 58.11694 ]
 						},
 						},
 						{ "time": 1.3333 }
 						{ "time": 1.3333 }
 					]
 					]
@@ -257,16 +250,16 @@
 						{
 						{
 							"time": 0.3333,
 							"time": 0.3333,
 							"offset": 4,
 							"offset": 4,
-							"vertices": [ -9.45232, 83.51329, -3.90007, 44.76634, -3.90007, 44.76634, -3.90007, 44.76634, 0, 0, 0, 0, 0, 0, 0, 0, 5.15667, -29.57762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.90007, 44.76634 ]
+							"vertices": [ -9.45233, 83.5133, -3.90008, 44.76635, -3.90008, 44.76635, -3.90008, 44.76635, 0, 0, 0, 0, 0, 0, 0, 0, 5.15667, -29.57763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.90008, 44.76635 ]
 						},
 						},
-						{ "time": 0.6666 },
+						{ "time": 0.6667 },
 						{
 						{
 							"time": 0.6679,
 							"time": 0.6679,
-							"vertices": [ -1.21159, -14.52715, -2.76092, -7.75683, -4.30998, -0.98668, 2.38385, 9.78289, -1.56903, 5.49315, -2.93443, 6.75127, -4.3001, 8.00932, -5.66552, 9.2677, -7.031, 10.52575, -3.07855, 14.8156, 4.30986, 0.98589, 5.85906, -5.78435, 7.40825, -12.55461, 5.25317, -13.04796, 3.09832, -13.54082, 0.94322, -14.03411, -0.60594, -7.26379, 1.54907, -6.77055, 3.70422, -6.27746, -2.15495, -0.49345, 0, -3.0E-4, 2.15495, 0.49272, 1.01812, 11.04131, -0.34709, 12.29895, -1.71312, 13.557 ]
+							"vertices": [ -1.2116, -14.52716, -2.76092, -7.75683, -4.30999, -0.98669, 2.38385, 9.78289, -1.56903, 5.49316, -2.93444, 6.75128, -4.30011, 8.00933, -5.66552, 9.2677, -7.031, 10.52575, -3.07855, 14.81561, 4.30987, 0.9859, 5.85907, -5.78436, 7.40826, -12.55462, 5.25317, -13.04797, 3.09832, -13.54083, 0.94323, -14.03411, -0.60595, -7.26379, 1.54907, -6.77056, 3.70422, -6.27746, -2.15496, -0.49346, 0, -3.0E-4, 2.15496, 0.49273, 1.01812, 11.04132, -0.3471, 12.29895, -1.71313, 13.557 ]
 						},
 						},
 						{
 						{
 							"time": 1.3333,
 							"time": 1.3333,
-							"vertices": [ -10.57341, 25.16797, -9.16716, 14.48486, -7.76073, 3.80211, 131.25482, 21.05285, 128.23181, -0.04534, 121.51611, 0.91667, 114.80023, 1.8789, 108.08458, 2.84123, 101.36889, 3.80315, 104.39154, 24.90191, -21.3623, 2.0117, -22.76855, 12.69433, -24.17505, 23.37718, -20.7747, 23.82476, -17.37413, 24.27276, -13.97393, 24.72009, -12.56768, 14.03752, -15.96788, 13.58977, -19.36809, 13.14214, -11.16094, 3.35454, -14.56134, 2.90704, -17.96166, 2.45921, 124.53894, 22.01538, 117.82335, 22.97705, 111.10717, 23.93932 ]
+							"vertices": [ -10.57342, 25.16797, -9.16717, 14.48486, -7.76074, 3.80212, 131.25482, 21.05285, 128.23181, -0.04534, 121.51611, 0.91668, 114.80023, 1.8789, 108.08459, 2.84124, 101.3689, 3.80316, 104.39154, 24.90191, -21.3623, 2.01171, -22.76855, 12.69433, -24.17505, 23.37719, -20.77471, 23.82476, -17.37414, 24.27276, -13.97393, 24.72009, -12.56768, 14.03753, -15.96789, 13.58978, -19.3681, 13.14215, -11.16095, 3.35455, -14.56134, 2.90704, -17.96167, 2.45922, 124.53894, 22.01538, 117.82336, 22.97705, 111.10718, 23.93933 ]
 						}
 						}
 					]
 					]
 				}
 				}
@@ -275,7 +268,7 @@
 		"drawOrder": [
 		"drawOrder": [
 			{ "time": 0 },
 			{ "time": 0 },
 			{
 			{
-				"time": 0.6666,
+				"time": 0.6667,
 				"offsets": [
 				"offsets": [
 					{ "slot": "draworder2", "offset": 1 }
 					{ "slot": "draworder2", "offset": 1 }
 				]
 				]

二进制
examples/test/export/test.skel


文件差异内容过多而无法显示
+ 16 - 23
examples/vine/export/vine.json


二进制
examples/vine/export/vine.skel


文件差异内容过多而无法显示
+ 236 - 243
spine-as3/spine-as3-example/src/spineboy.json


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

@@ -90,7 +90,8 @@ typedef enum {
 	SP_TIMELINE_TRANSFORMCONSTRAINT,
 	SP_TIMELINE_TRANSFORMCONSTRAINT,
 	SP_TIMELINE_PATHCONSTRAINTPOSITION,
 	SP_TIMELINE_PATHCONSTRAINTPOSITION,
 	SP_TIMELINE_PATHCONSTRAINTSPACING,
 	SP_TIMELINE_PATHCONSTRAINTSPACING,
-	SP_TIMELINE_PATHCONSTRAINTMIX
+	SP_TIMELINE_PATHCONSTRAINTMIX,
+	SP_TIMELINE_TWOCOLOR
 } spTimelineType;
 } spTimelineType;
 
 
 struct spTimeline {
 struct spTimeline {
@@ -266,6 +267,36 @@ typedef spColorTimeline ColorTimeline;
 
 
 /**/
 /**/
 
 
+static const int TWOCOLOR_ENTRIES = 8;
+
+typedef struct spTwoColorTimeline {
+	spCurveTimeline super;
+	int const framesCount;
+	float* const frames; /* time, r, g, b, a, ... */
+	int slotIndex;
+
+#ifdef __cplusplus
+	spTwoColorTimeline() :
+		super(),
+		framesCount(0),
+		frames(0),
+		slotIndex(0) {
+	}
+#endif
+} spTwoColorTimeline;
+
+spTwoColorTimeline* spTwoColorTimeline_create (int framesCount);
+
+void spTwoColorTimeline_setFrame (spTwoColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a, float r2, float g2, float b2);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spTwoColorTimeline TwoColorTimeline;
+#define TwoColorTimeline_create(...) spTwoColorTimeline_create(__VA_ARGS__)
+#define TwoColorTimeline_setFrame(...) spTwoColorTimeline_setFrame(__VA_ARGS__)
+#endif
+
+/**/
+
 typedef struct spAttachmentTimeline {
 typedef struct spAttachmentTimeline {
 	spTimeline super;
 	spTimeline super;
 	int const framesCount;
 	int const framesCount;

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

@@ -42,7 +42,8 @@ typedef enum {
 	SP_ATTACHMENT_BOUNDING_BOX,
 	SP_ATTACHMENT_BOUNDING_BOX,
 	SP_ATTACHMENT_MESH,
 	SP_ATTACHMENT_MESH,
 	SP_ATTACHMENT_LINKED_MESH,
 	SP_ATTACHMENT_LINKED_MESH,
-	SP_ATTACHMENT_PATH
+	SP_ATTACHMENT_PATH,
+	SP_ATTACHMENT_POINT
 } spAttachmentType;
 } spAttachmentType;
 
 
 typedef struct spAttachment {
 typedef struct spAttachment {

+ 6 - 6
spine-c/spine-c/include/spine/Bone.h

@@ -90,13 +90,13 @@ float spBone_getWorldRotationY (spBone* self);
 float spBone_getWorldScaleX (spBone* self);
 float spBone_getWorldScaleX (spBone* self);
 float spBone_getWorldScaleY (spBone* self);
 float spBone_getWorldScaleY (spBone* self);
 
 
-float spBone_worldToLocalRotationX (spBone* self);
-float spBone_worldToLocalRotationY (spBone* self);
-void spBone_rotateWorld (spBone* self, float degrees);
 void spBone_updateAppliedTransform (spBone* self);
 void spBone_updateAppliedTransform (spBone* self);
 
 
 void spBone_worldToLocal (spBone* self, float worldX, float worldY, float* localX, float* localY);
 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);
 void spBone_localToWorld (spBone* self, float localX, float localY, float* worldX, float* worldY);
+float spBone_worldToLocalRotation (spBone* self, float worldRotation);
+float spBone_localToWorldRotation (spBone* self, float localRotation);
+void spBone_rotateWorld (spBone* self, float degrees);
 
 
 #ifdef SPINE_SHORT_NAMES
 #ifdef SPINE_SHORT_NAMES
 typedef spBone Bone;
 typedef spBone Bone;
@@ -111,12 +111,12 @@ typedef spBone Bone;
 #define Bone_getWorldRotationY(...) spBone_getWorldRotationY(__VA_ARGS__)
 #define Bone_getWorldRotationY(...) spBone_getWorldRotationY(__VA_ARGS__)
 #define Bone_getWorldScaleX(...) spBone_getWorldScaleX(__VA_ARGS__)
 #define Bone_getWorldScaleX(...) spBone_getWorldScaleX(__VA_ARGS__)
 #define Bone_getWorldScaleY(...) spBone_getWorldScaleY(__VA_ARGS__)
 #define Bone_getWorldScaleY(...) spBone_getWorldScaleY(__VA_ARGS__)
-#define Bone_worldToLocalRotationX(...) spBone_worldToLocalRotationX(__VA_ARGS__)
-#define Bone_worldToLocalRotationY(...) spBone_worldToLocalRotationY(__VA_ARGS__)
-#define Bone_rotateWorld(...) spBone_rotateWorld(__VA_ARGS__)
 #define Bone_updateAppliedTransform(...) spBone_updateAppliedTransform(__VA_ARGS__)
 #define Bone_updateAppliedTransform(...) spBone_updateAppliedTransform(__VA_ARGS__)
 #define Bone_worldToLocal(...) spBone_worldToLocal(__VA_ARGS__)
 #define Bone_worldToLocal(...) spBone_worldToLocal(__VA_ARGS__)
 #define Bone_localToWorld(...) spBone_localToWorld(__VA_ARGS__)
 #define Bone_localToWorld(...) spBone_localToWorld(__VA_ARGS__)
+#define Bone_worldToLocalRotation(...) spBone_worldToLocalRotation(__VA_ARGS__)
+#define Bone_localToWorldRotation(...) spBone_localToWorldRotation(__VA_ARGS__)
+#define Bone_rotateWorld(...) spBone_rotateWorld(__VA_ARGS__)
 #endif
 #endif
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus

+ 0 - 2
spine-c/spine-c/include/spine/BoundingBoxAttachment.h

@@ -45,12 +45,10 @@ typedef struct spBoundingBoxAttachment {
 } spBoundingBoxAttachment;
 } spBoundingBoxAttachment;
 
 
 spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name);
 spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name);
-void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spSlot* slot, float* worldVertices);
 
 
 #ifdef SPINE_SHORT_NAMES
 #ifdef SPINE_SHORT_NAMES
 typedef spBoundingBoxAttachment BoundingBoxAttachment;
 typedef spBoundingBoxAttachment BoundingBoxAttachment;
 #define BoundingBoxAttachment_create(...) spBoundingBoxAttachment_create(__VA_ARGS__)
 #define BoundingBoxAttachment_create(...) spBoundingBoxAttachment_create(__VA_ARGS__)
-#define BoundingBoxAttachment_computeWorldVertices(...) spBoundingBoxAttachment_computeWorldVertices(__VA_ARGS__)
 #endif
 #endif
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus

+ 72 - 0
spine-c/spine-c/include/spine/Color.h

@@ -0,0 +1,72 @@
+/******************************************************************************
+ * Spine Runtimes Software License v2.5
+ *
+ * Copyright (c) 2013-2016, Esoteric Software
+ * All rights reserved.
+ *
+ * You are granted a perpetual, non-exclusive, non-sublicensable, and
+ * non-transferable license to use, install, execute, and perform the Spine
+ * Runtimes software and derivative works solely for personal or internal
+ * use. Without the written permission of Esoteric Software (see Section 2 of
+ * the Spine Software License Agreement), you may not (a) modify, translate,
+ * adapt, or develop new applications using the Spine Runtimes or otherwise
+ * create derivative works or improvements of the Spine Runtimes or (b) remove,
+ * delete, alter, or obscure any trademarks or any copyright, trademark, patent,
+ * or other intellectual property or proprietary rights notices on or in the
+ * Software, including any copy thereof. Redistributions in binary or source
+ * form must include this license and terms.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
+ * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#ifndef SPINE_COLOR_H_
+#define SPINE_COLOR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct spColor {
+	float r, g, b, a;
+
+#ifdef __cplusplus
+	spColor() :
+		r(0), g(0), b(0), a(0) {
+	}
+#endif
+} spColor;
+
+/* @param attachmentName May be 0 for no setup pose attachment. */
+spColor* spColor_create();
+void spColor_dispose(spColor* self);
+void spColor_setFromFloats(spColor* color, float r, float g, float b, float a);
+void spColor_setFromColor(spColor* color, spColor* otherColor);
+void spColor_addFloats(spColor* color, float r, float g, float b, float a);
+void spColor_addColor(spColor* color, spColor* otherColor);
+void spColor_clamp(spColor* color);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spColor color;
+#define Color_create() spColor_create()
+#define Color_dispose(...) spColor_dispose(__VA_ARGS__)
+#define Color_setFromFloats(...) spColor_setFromFloats(__VA_ARGS__)
+#define Color_setFromColor(...) spColor_setFromColor(__VA_ARGS__)
+#define Color_addColor(...) spColor_addColor(__VA_ARGS__)
+#define Color_addFloats(...) spColor_addFloats(__VA_ARGS__)
+#define Color_clamp(...) spColor_clamp(__VA_ARGS__)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SPINE_COLOR_H_ */

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

@@ -59,7 +59,7 @@ struct spMeshAttachment {
 	int trianglesCount;
 	int trianglesCount;
 	unsigned short* triangles;
 	unsigned short* triangles;
 
 
-	float r, g, b, a;
+	spColor color;
 
 
 	int hullLength;
 	int hullLength;
 
 
@@ -74,14 +74,12 @@ struct spMeshAttachment {
 
 
 spMeshAttachment* spMeshAttachment_create (const char* name);
 spMeshAttachment* spMeshAttachment_create (const char* name);
 void spMeshAttachment_updateUVs (spMeshAttachment* self);
 void spMeshAttachment_updateUVs (spMeshAttachment* self);
-void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, spSlot* slot, float* worldVertices);
 void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh);
 void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh);
 
 
 #ifdef SPINE_SHORT_NAMES
 #ifdef SPINE_SHORT_NAMES
 typedef spMeshAttachment MeshAttachment;
 typedef spMeshAttachment MeshAttachment;
 #define MeshAttachment_create(...) spMeshAttachment_create(__VA_ARGS__)
 #define MeshAttachment_create(...) spMeshAttachment_create(__VA_ARGS__)
 #define MeshAttachment_updateUVs(...) spMeshAttachment_updateUVs(__VA_ARGS__)
 #define MeshAttachment_updateUVs(...) spMeshAttachment_updateUVs(__VA_ARGS__)
-#define MeshAttachment_computeWorldVertices(...) spMeshAttachment_computeWorldVertices(__VA_ARGS__)
 #define MeshAttachment_setParentMesh(...) spMeshAttachment_setParentMesh(__VA_ARGS__)
 #define MeshAttachment_setParentMesh(...) spMeshAttachment_setParentMesh(__VA_ARGS__)
 #endif
 #endif
 
 

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

@@ -48,8 +48,6 @@ typedef struct spPathAttachment {
 } spPathAttachment;
 } spPathAttachment;
 
 
 spPathAttachment* spPathAttachment_create (const char* name);
 spPathAttachment* spPathAttachment_create (const char* name);
-void spPathAttachment_computeWorldVertices (spPathAttachment* self, spSlot* slot, float* worldVertices);
-void spPathAttachment_computeWorldVertices1 (spPathAttachment* self, spSlot* slot, int start, int count, float* worldVertices, int offset);
 
 
 #ifdef SPINE_SHORT_NAMES
 #ifdef SPINE_SHORT_NAMES
 typedef spPathAttachment PathAttachment;
 typedef spPathAttachment PathAttachment;

+ 64 - 0
spine-c/spine-c/include/spine/PointAttachment.h

@@ -0,0 +1,64 @@
+/******************************************************************************
+ * Spine Runtimes Software License v2.5
+ *
+ * Copyright (c) 2013-2016, Esoteric Software
+ * All rights reserved.
+ *
+ * You are granted a perpetual, non-exclusive, non-sublicensable, and
+ * non-transferable license to use, install, execute, and perform the Spine
+ * Runtimes software and derivative works solely for personal or internal
+ * use. Without the written permission of Esoteric Software (see Section 2 of
+ * the Spine Software License Agreement), you may not (a) modify, translate,
+ * adapt, or develop new applications using the Spine Runtimes or otherwise
+ * create derivative works or improvements of the Spine Runtimes or (b) remove,
+ * delete, alter, or obscure any trademarks or any copyright, trademark, patent,
+ * or other intellectual property or proprietary rights notices on or in the
+ * Software, including any copy thereof. Redistributions in binary or source
+ * form must include this license and terms.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
+ * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#ifndef SPINE_POINTATTACHMENT_H_
+#define SPINE_POINTATTACHMENT_H_
+
+#include <spine/Attachment.h>
+#include <spine/VertexAttachment.h>
+#include <spine/Atlas.h>
+#include <spine/Slot.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct spPointAttachment {
+	spVertexAttachment super;
+	float x, y, rotation;
+	spColor color;
+} spPointAttachment;
+
+spPointAttachment* spPointAttachment_create (const char* name);
+void spPointAttachment_computeWorldPosition (spPointAttachment* self, spBone* bone, float* x, float* y);
+float spPointAttachment_computeWorldRotation (spPointAttachment* self, spBone* bone);
+
+#ifdef SPINE_SHORT_NAMES
+typedef spPointAttachment PointAttachment;
+#define PointAttachment_create(...) spPointAttachment_create(__VA_ARGS__)
+#define PointAttachment_computeWorldPosition(...) spPointAttachment_computeWorldPosition(__VA_ARGS__)
+#define PointAttachment_computeWorldRotation(...) spPointAttachment_computeWorldRotation(__VA_ARGS__)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SPINE_POINTATTACHMENT_H_ */

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

@@ -47,7 +47,7 @@ typedef struct spRegionAttachment {
 	spAttachment super;
 	spAttachment super;
 	const char* path;
 	const char* path;
 	float x, y, scaleX, scaleY, rotation, width, height;
 	float x, y, scaleX, scaleY, rotation, width, height;
-	float r, g, b, a;
+	spColor color;
 
 
 	void* rendererObject;
 	void* rendererObject;
 	int regionOffsetX, regionOffsetY; /* Pixels stripped from the bottom left, unrotated. */
 	int regionOffsetX, regionOffsetY; /* Pixels stripped from the bottom left, unrotated. */
@@ -61,7 +61,7 @@ typedef struct spRegionAttachment {
 spRegionAttachment* spRegionAttachment_create (const char* name);
 spRegionAttachment* spRegionAttachment_create (const char* name);
 void spRegionAttachment_setUVs (spRegionAttachment* self, float u, float v, float u2, float v2, int/*bool*/rotate);
 void spRegionAttachment_setUVs (spRegionAttachment* self, float u, float v, float u2, float v2, int/*bool*/rotate);
 void spRegionAttachment_updateOffset (spRegionAttachment* self);
 void spRegionAttachment_updateOffset (spRegionAttachment* self);
-void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, spBone* bone, float* vertices);
+void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, spBone* bone, float* vertices, int offset, int stride);
 
 
 #ifdef SPINE_SHORT_NAMES
 #ifdef SPINE_SHORT_NAMES
 typedef spVertexIndex VertexIndex;
 typedef spVertexIndex VertexIndex;

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

@@ -63,7 +63,7 @@ typedef struct spSkeleton {
 	spPathConstraint** pathConstraints;
 	spPathConstraint** pathConstraints;
 
 
 	spSkin* const skin;
 	spSkin* const skin;
-	float r, g, b, a;
+	spColor color;
 	float time;
 	float time;
 	int/*bool*/flipX, flipY;
 	int/*bool*/flipX, flipY;
 	float x, y;
 	float x, y;
@@ -85,7 +85,7 @@ typedef struct spSkeleton {
 		transformConstraints(0),
 		transformConstraints(0),
 
 
 		skin(0),
 		skin(0),
-		r(0), g(0), b(0), a(0),
+		color(),
 		time(0),
 		time(0),
 		flipX(0),
 		flipX(0),
 		flipY(0),
 		flipY(0),

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

@@ -42,7 +42,8 @@ extern "C" {
 typedef struct spSlot {
 typedef struct spSlot {
 	spSlotData* const data;
 	spSlotData* const data;
 	spBone* const bone;
 	spBone* const bone;
-	float r, g, b, a;
+	spColor color;
+	spColor* darkColor;
 	spAttachment* const attachment;
 	spAttachment* const attachment;
 
 
 	int attachmentVerticesCapacity;
 	int attachmentVerticesCapacity;
@@ -53,7 +54,8 @@ typedef struct spSlot {
 	spSlot() :
 	spSlot() :
 		data(0),
 		data(0),
 		bone(0),
 		bone(0),
-		r(0), g(0), b(0), a(0),
+		color(),
+		darkColor(0),
 		attachment(0),
 		attachment(0),
 		attachmentVerticesCapacity(0),
 		attachmentVerticesCapacity(0),
 		attachmentVerticesCount(0),
 		attachmentVerticesCount(0),

+ 5 - 2
spine-c/spine-c/include/spine/SlotData.h

@@ -32,6 +32,7 @@
 #define SPINE_SLOTDATA_H_
 #define SPINE_SLOTDATA_H_
 
 
 #include <spine/BoneData.h>
 #include <spine/BoneData.h>
+#include <spine/Color.h>
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 extern "C" {
 extern "C" {
@@ -46,7 +47,8 @@ typedef struct spSlotData {
 	const char* const name;
 	const char* const name;
 	const spBoneData* const boneData;
 	const spBoneData* const boneData;
 	const char* attachmentName;
 	const char* attachmentName;
-	float r, g, b, a;
+	spColor color;
+	spColor* darkColor;
 	spBlendMode blendMode;
 	spBlendMode blendMode;
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
@@ -55,7 +57,8 @@ typedef struct spSlotData {
 		name(0),
 		name(0),
 		boneData(0),
 		boneData(0),
 		attachmentName(0),
 		attachmentName(0),
-		r(0), g(0), b(0), a(0),
+		color(),
+		darkColor(0),
 		blendMode(SP_BLEND_MODE_NORMAL) {
 		blendMode(SP_BLEND_MODE_NORMAL) {
 	}
 	}
 #endif
 #endif

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

@@ -45,6 +45,8 @@ typedef struct spTransformConstraintData {
 	spBoneData* target;
 	spBoneData* target;
 	float rotateMix, translateMix, scaleMix, shearMix;
 	float rotateMix, translateMix, scaleMix, shearMix;
 	float offsetRotation, offsetX, offsetY, offsetScaleX, offsetScaleY, offsetShearY;
 	float offsetRotation, offsetX, offsetY, offsetScaleX, offsetScaleY, offsetShearY;
+	int /*boolean*/ relative;
+	int /*boolean*/ local;
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 	spTransformConstraintData() :
 	spTransformConstraintData() :
@@ -61,7 +63,9 @@ typedef struct spTransformConstraintData {
 		offsetY(0),
 		offsetY(0),
 		offsetScaleX(0),
 		offsetScaleX(0),
 		offsetScaleY(0),
 		offsetScaleY(0),
-		offsetShearY(0) {
+		offsetShearY(0),
+		relative(0),
+		local(0) {
 	}
 	}
 #endif
 #endif
 } spTransformConstraintData;
 } spTransformConstraintData;

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

@@ -51,13 +51,11 @@ struct spVertexAttachment {
 	int worldVerticesLength;
 	int worldVerticesLength;
 };
 };
 
 
-void spVertexAttachment_computeWorldVertices (spVertexAttachment* self, spSlot* slot, float* worldVertices);
-void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int start, int count, spSlot* slot, float* worldVertices, int offset);
+void spVertexAttachment_computeWorldVertices (spVertexAttachment* self, spSlot* slot, int start, int count, float* worldVertices, int offset, int stride);
 
 
 #ifdef SPINE_SHORT_NAMES
 #ifdef SPINE_SHORT_NAMES
 typedef spVertexAttachment VertexAttachment;
 typedef spVertexAttachment VertexAttachment;
 #define VertexAttachment_computeWorldVertices(...) spVertexAttachment_computeWorldVertices(__VA_ARGS__)
 #define VertexAttachment_computeWorldVertices(...) spVertexAttachment_computeWorldVertices(__VA_ARGS__)
-#define VertexAttachment_computeWorldVertices1(...) spVertexAttachment_computeWorldVertices1(__VA_ARGS__)
 #endif
 #endif
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus

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

@@ -135,6 +135,7 @@
 #include <spine/MeshAttachment.h>
 #include <spine/MeshAttachment.h>
 #include <spine/BoundingBoxAttachment.h>
 #include <spine/BoundingBoxAttachment.h>
 #include <spine/PathAttachment.h>
 #include <spine/PathAttachment.h>
+#include <spine/PointAttachment.h>
 #include <spine/AnimationState.h>
 #include <spine/AnimationState.h>
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus

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

@@ -44,6 +44,7 @@
 #include <spine/VertexAttachment.h>
 #include <spine/VertexAttachment.h>
 #include <spine/MeshAttachment.h>
 #include <spine/MeshAttachment.h>
 #include <spine/BoundingBoxAttachment.h>
 #include <spine/BoundingBoxAttachment.h>
+#include <spine/PointAttachment.h>
 #include <spine/Skeleton.h>
 #include <spine/Skeleton.h>
 #include <spine/SkeletonBounds.h>
 #include <spine/SkeletonBounds.h>
 #include <spine/SkeletonData.h>
 #include <spine/SkeletonData.h>

+ 101 - 16
spine-c/spine-c/src/spine/Animation.c

@@ -528,10 +528,7 @@ void _spColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 
 
 	if (time < self->frames[0]) {
 	if (time < self->frames[0]) {
 		if (setupPose) {
 		if (setupPose) {
-			slot->r = slot->data->r;
-			slot->g = slot->data->g;
-			slot->b = slot->data->b;
-			slot->a = slot->data->a;
+			spColor_setFromColor(&slot->color, &slot->data->color);
 		}
 		}
 		return;
 		return;
 	}
 	}
@@ -561,21 +558,12 @@ void _spColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 		a += (self->frames[frame + COLOR_A] - a) * percent;
 		a += (self->frames[frame + COLOR_A] - a) * percent;
 	}
 	}
 	if (alpha == 1) {
 	if (alpha == 1) {
-		slot->r = r;
-		slot->g = g;
-		slot->b = b;
-		slot->a = a;
+		spColor_setFromFloats(&slot->color, r, g, b, a);
 	} else {
 	} else {
 		if (setupPose) {
 		if (setupPose) {
-			slot->r = slot->data->r;
-			slot->g = slot->data->g;
-			slot->b = slot->data->b;
-			slot->a = slot->data->a;
+			spColor_setFromColor(&slot->color, &slot->data->color);
 		}
 		}
-		slot->r += (r - slot->r) * alpha;
-		slot->g += (g - slot->g) * alpha;
-		slot->b += (b - slot->b) * alpha;
-		slot->a += (a - slot->a) * alpha;
+		spColor_addFloats(&slot->color, (r - slot->color.r) * alpha, (g - slot->color.g) * alpha, (b - slot->color.b) * alpha, (a - slot->color.a) * alpha);
 	}
 	}
 
 
 	UNUSED(lastTime);
 	UNUSED(lastTime);
@@ -602,6 +590,103 @@ void spColorTimeline_setFrame (spColorTimeline* self, int frameIndex, float time
 
 
 /**/
 /**/
 
 
+static const int TWOCOLOR_PREV_TIME = -8, TWOCOLOR_PREV_R = -7, TWOCOLOR_PREV_G = -6, TWOCOLOR_PREV_B = -5, TWOCOLOR_PREV_A = -4;
+static const int TWOCOLOR_PREV_R2 = -3, TWOCOLOR_PREV_G2 = -2, TWOCOLOR_PREV_B2 = -1;
+static const int TWOCOLOR_R = 1, TWOCOLOR_G = 2, TWOCOLOR_B = 3, TWOCOLOR_A = 4, TWOCOLOR_R2 = 5, TWOCOLOR_G2 = 6, TWOCOLOR_B2 = 7;
+
+void _spTwoColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time, spEvent** firedEvents,
+							 int* eventsCount, float alpha, int setupPose, int mixingOut) {
+	spSlot *slot;
+	int frame;
+	float percent, frameTime;
+	float r, g, b, a, r2, g2, b2;
+	spColor* light;
+	spColor* dark;
+	spColorTimeline* self = (spColorTimeline*)timeline;
+	slot = skeleton->slots[self->slotIndex];
+
+	if (time < self->frames[0]) {
+		if (setupPose) {
+			spColor_setFromColor(&slot->color, &slot->data->color);
+			spColor_setFromColor(slot->darkColor, slot->data->darkColor);
+		}
+		return;
+	}
+
+	if (time >= self->frames[self->framesCount - TWOCOLOR_ENTRIES]) { /* Time is after last frame */
+		int i = self->framesCount;
+		r = self->frames[i + TWOCOLOR_PREV_R];
+		g = self->frames[i + TWOCOLOR_PREV_G];
+		b = self->frames[i + TWOCOLOR_PREV_B];
+		a = self->frames[i + TWOCOLOR_PREV_A];
+		r2 = self->frames[i + TWOCOLOR_PREV_R2];
+		g2 = self->frames[i + TWOCOLOR_PREV_G2];
+		b2 = self->frames[i + TWOCOLOR_PREV_B2];
+	} else {
+		/* Interpolate between the previous frame and the current frame. */
+		frame = binarySearch(self->frames, self->framesCount, time, TWOCOLOR_ENTRIES);
+
+		r = self->frames[frame + TWOCOLOR_PREV_R];
+		g = self->frames[frame + TWOCOLOR_PREV_G];
+		b = self->frames[frame + TWOCOLOR_PREV_B];
+		a = self->frames[frame + TWOCOLOR_PREV_A];
+		r2 = self->frames[frame + TWOCOLOR_PREV_R2];
+		g2 = self->frames[frame + TWOCOLOR_PREV_G2];
+		b2 = self->frames[frame + TWOCOLOR_PREV_B2];
+
+		frameTime = self->frames[frame];
+		percent = spCurveTimeline_getCurvePercent(SUPER(self), frame / TWOCOLOR_ENTRIES - 1,
+												  1 - (time - frameTime) / (self->frames[frame + TWOCOLOR_PREV_TIME] - frameTime));
+
+		r += (self->frames[frame + TWOCOLOR_R] - r) * percent;
+		g += (self->frames[frame + TWOCOLOR_G] - g) * percent;
+		b += (self->frames[frame + TWOCOLOR_B] - b) * percent;
+		a += (self->frames[frame + TWOCOLOR_A] - a) * percent;
+		r2 += (self->frames[frame + TWOCOLOR_R2] - r2) * percent;
+		g2 += (self->frames[frame + TWOCOLOR_G2] - g2) * percent;
+		b2 += (self->frames[frame + TWOCOLOR_B2] - b2) * percent;
+	}
+	if (alpha == 1) {
+		spColor_setFromFloats(&slot->color, r, g, b, a);
+		spColor_setFromFloats(slot->darkColor, r2, g2, b2, 1);
+	} else {
+		light = &slot->color;
+		dark = slot->darkColor;
+		if (setupPose) {
+			spColor_setFromColor(light, &slot->data->color);
+			spColor_setFromColor(dark, slot->data->darkColor);
+		}
+		spColor_addFloats(light, (r - light->r) * alpha, (g - light->g) * alpha, (b - light->b) * alpha, (a - light->a) * alpha);
+		spColor_addFloats(dark, (r2 - dark->r) * alpha, (g2 - dark->g) * alpha, (b2 - dark->b) * alpha, 0);
+	}
+
+	UNUSED(lastTime);
+	UNUSED(firedEvents);
+	UNUSED(eventsCount);
+}
+
+int _spTwoColorTimeline_getPropertyId (const spTimeline* timeline) {
+	return (SP_TIMELINE_TWOCOLOR << 24) + SUB_CAST(spTwoColorTimeline, timeline)->slotIndex;
+}
+
+spTwoColorTimeline* spTwoColorTimeline_create (int framesCount) {
+	return (spTwoColorTimeline*)_spBaseTimeline_create(framesCount, SP_TIMELINE_TWOCOLOR, TWOCOLOR_ENTRIES, _spTwoColorTimeline_apply, _spTwoColorTimeline_getPropertyId);
+}
+
+void spTwoColorTimeline_setFrame (spTwoColorTimeline* self, int frameIndex, float time, float r, float g, float b, float a, float r2, float g2, float b2) {
+	frameIndex *= TWOCOLOR_ENTRIES;
+	self->frames[frameIndex] = time;
+	self->frames[frameIndex + TWOCOLOR_R] = r;
+	self->frames[frameIndex + TWOCOLOR_G] = g;
+	self->frames[frameIndex + TWOCOLOR_B] = b;
+	self->frames[frameIndex + TWOCOLOR_A] = a;
+	self->frames[frameIndex + TWOCOLOR_R2] = r2;
+	self->frames[frameIndex + TWOCOLOR_G2] = g2;
+	self->frames[frameIndex + TWOCOLOR_B2] = b2;
+}
+
+/**/
+
 void _spAttachmentTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
 void _spAttachmentTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, float lastTime, float time,
 		spEvent** firedEvents, int* eventsCount, float alpha, int setupPose, int mixingOut) {
 		spEvent** firedEvents, int* eventsCount, float alpha, int setupPose, int mixingOut) {
 	const char* attachmentName;
 	const char* attachmentName;

+ 2 - 0
spine-c/spine-c/src/spine/AtlasAttachmentLoader.c

@@ -80,6 +80,8 @@ spAttachment* _spAtlasAttachmentLoader_createAttachment (spAttachmentLoader* loa
 		return SUPER(SUPER(spBoundingBoxAttachment_create(name)));
 		return SUPER(SUPER(spBoundingBoxAttachment_create(name)));
 	case SP_ATTACHMENT_PATH:
 	case SP_ATTACHMENT_PATH:
 		return SUPER(SUPER(spPathAttachment_create(name)));
 		return SUPER(SUPER(spPathAttachment_create(name)));
+	case SP_ATTACHMENT_POINT:
+		return SUPER(SUPER(spPointAttachment_create(name)));
 	default:
 	default:
 		_spAttachmentLoader_setUnknownTypeError(loader, type);
 		_spAttachmentLoader_setUnknownTypeError(loader, type);
 		return 0;
 		return 0;

+ 24 - 23
spine-c/spine-c/src/spine/Bone.c

@@ -218,29 +218,6 @@ float spBone_getWorldScaleY (spBone* self) {
 	return SQRT(self->b * self->b + self->d * self->d);
 	return SQRT(self->b * self->b + self->d * self->d);
 }
 }
 
 
-float spBone_worldToLocalRotationX (spBone* self) {
-	spBone* parent = self->parent;
-	if (!parent) return self->arotation;
-	return ATAN2(parent->a * self->c - parent->c * self->a, parent->d * self->a - parent->b * self->c) * RAD_DEG;
-}
-
-float spBone_worldToLocalRotationY (spBone* self) {
-	spBone* parent = self->parent;
-	if (!parent) return self->arotation;
-	return ATAN2(parent->a * self->d - parent->c * self->b, parent->d * self->b - parent->b * self->d) * RAD_DEG;
-}
-
-void spBone_rotateWorld (spBone* self, float degrees) {
-	float a = self->a, b = self->b, c = self->c, d = self->d;
-	float cosine = COS_DEG(degrees), sine = SIN_DEG(degrees);
-	CONST_CAST(float, self->a) = cosine * a - sine * c;
-	CONST_CAST(float, self->b) = cosine * b - sine * d;
-	CONST_CAST(float, self->c) = sine * a + cosine * c;
-	CONST_CAST(float, self->d) = sine * b + cosine * d;
-	CONST_CAST(int, self->appliedValid) = 1;
-}
-
-
 /** Computes the individual applied transform values from the world transform. This can be useful to perform processing using
 /** Computes the individual applied transform values from the world transform. This can be useful to perform processing using
  * the applied transform after the world transform has been modified directly (eg, by a constraint).
  * the applied transform after the world transform has been modified directly (eg, by a constraint).
  * <p>
  * <p>
@@ -299,3 +276,27 @@ void spBone_localToWorld (spBone* self, float localX, float localY, float* world
 	*worldX = x * self->a + y * self->b + self->worldX;
 	*worldX = x * self->a + y * self->b + self->worldX;
 	*worldY = x * self->c + y * self->d + self->worldY;
 	*worldY = x * self->c + y * self->d + self->worldY;
 }
 }
+
+float spBone_worldToLocalRotation (spBone* self, float worldRotation) {
+	float sine, cosine;
+	sine = SIN_DEG(worldRotation);
+	cosine = COS_DEG(worldRotation);
+	return ATAN2(self->a * sine - self->c * cosine, self->d * cosine - self->b * sine) * RAD_DEG;
+}
+
+float spBone_localToWorldRotation (spBone* self, float localRotation) {
+	float sine, cosine;
+	sine = SIN_DEG(localRotation);
+	cosine = COS_DEG(localRotation);
+	return ATAN2(cosine * self->c + sine * self->d, cosine * self->a + sine * self->b) * RAD_DEG;
+}
+
+void spBone_rotateWorld (spBone* self, float degrees) {
+	float a = self->a, b = self->b, c = self->c, d = self->d;
+	float cosine = COS_DEG(degrees), sine = SIN_DEG(degrees);
+	CONST_CAST(float, self->a) = cosine * a - sine * c;
+	CONST_CAST(float, self->b) = cosine * b - sine * d;
+	CONST_CAST(float, self->c) = sine * a + cosine * c;
+	CONST_CAST(float, self->d) = sine * b + cosine * d;
+	CONST_CAST(int, self->appliedValid) = 0;
+}

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

@@ -44,7 +44,3 @@ spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name) {
 	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_BOUNDING_BOX, _spBoundingBoxAttachment_dispose);
 	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_BOUNDING_BOX, _spBoundingBoxAttachment_dispose);
 	return self;
 	return self;
 }
 }
-
-void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spSlot* slot, float* worldVertices) {
-	spVertexAttachment_computeWorldVertices(SUPER(self), slot, worldVertices);
-}

+ 84 - 0
spine-c/spine-c/src/spine/Color.c

@@ -0,0 +1,84 @@
+/******************************************************************************
+ * Spine Runtimes Software License v2.5
+ *
+ * Copyright (c) 2013-2016, Esoteric Software
+ * All rights reserved.
+ *
+ * You are granted a perpetual, non-exclusive, non-sublicensable, and
+ * non-transferable license to use, install, execute, and perform the Spine
+ * Runtimes software and derivative works solely for personal or internal
+ * use. Without the written permission of Esoteric Software (see Section 2 of
+ * the Spine Software License Agreement), you may not (a) modify, translate,
+ * adapt, or develop new applications using the Spine Runtimes or otherwise
+ * create derivative works or improvements of the Spine Runtimes or (b) remove,
+ * delete, alter, or obscure any trademarks or any copyright, trademark, patent,
+ * or other intellectual property or proprietary rights notices on or in the
+ * Software, including any copy thereof. Redistributions in binary or source
+ * form must include this license and terms.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
+ * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#include <spine/Color.h>
+#include <spine/extension.h>
+
+spColor* spColor_create() {
+	return MALLOC(spColor, 1);
+}
+
+void spColor_dispose(spColor* self) {
+	if (self) FREE(self);
+}
+
+void spColor_setFromFloats(spColor* self, float r, float g, float b, float a) {
+	self->r = r;
+	self->g = g;
+	self->b = b;
+	self->a = a;
+}
+
+void spColor_setFromColor(spColor* self, spColor* otherColor) {
+	self->r = otherColor->r;
+	self->g = otherColor->g;
+	self->b = otherColor->b;
+	self->a = otherColor->a;
+}
+
+void spColor_addColor(spColor* self, spColor* otherColor) {
+	self->r += otherColor->r;
+	self->g += otherColor->g;
+	self->b += otherColor->b;
+	self->a += otherColor->a;
+	spColor_clamp(self);
+}
+
+void spColor_addFloats(spColor* self, float r, float g, float b, float a) {
+	self->r += r;
+	self->g += g;
+	self->b += b;
+	self->a += a;
+	spColor_clamp(self);
+}
+
+void spColor_clamp(spColor* self) {
+	if (self->r < 0) self->r = 0;
+	else if (self->r > 1) self->r = 1;
+
+	if (self->g < 0) self->g = 0;
+	else if (self->g > 1) self->g = 1;
+
+	if (self->b < 0) self->b = 0;
+	else if (self->b > 1) self->b = 1;
+
+	if (self->a < 0) self->a = 0;
+	else if (self->a > 1) self->a = 1;
+}

+ 1 - 8
spine-c/spine-c/src/spine/MeshAttachment.c

@@ -47,10 +47,7 @@ void _spMeshAttachment_dispose (spAttachment* attachment) {
 
 
 spMeshAttachment* spMeshAttachment_create (const char* name) {
 spMeshAttachment* spMeshAttachment_create (const char* name) {
 	spMeshAttachment* self = NEW(spMeshAttachment);
 	spMeshAttachment* self = NEW(spMeshAttachment);
-	self->r = 1;
-	self->g = 1;
-	self->b = 1;
-	self->a = 1;
+	spColor_setFromFloats(&self->color, 1, 1, 1, 1);
 	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_MESH, _spMeshAttachment_dispose);
 	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_MESH, _spMeshAttachment_dispose);
 	return self;
 	return self;
 }
 }
@@ -74,10 +71,6 @@ void spMeshAttachment_updateUVs (spMeshAttachment* self) {
 	}
 	}
 }
 }
 
 
-void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, spSlot* slot, float* worldVertices) {
-	spVertexAttachment_computeWorldVertices(SUPER(self), slot, worldVertices);
-}
-
 void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh) {
 void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh) {
 	CONST_CAST(spMeshAttachment*, self->parentMesh) = parentMesh;
 	CONST_CAST(spMeshAttachment*, self->parentMesh) = parentMesh;
 	if (parentMesh) {
 	if (parentMesh) {

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

@@ -45,11 +45,3 @@ spPathAttachment* spPathAttachment_create (const char* name) {
 	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_PATH, _spPathAttachment_dispose);
 	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_PATH, _spPathAttachment_dispose);
 	return self;
 	return self;
 }
 }
-
-void spPathAttachment_computeWorldVertices (spPathAttachment* self, spSlot* slot, float* worldVertices) {
-	spVertexAttachment_computeWorldVertices(SUPER(self), slot, worldVertices);
-}
-
-void spPathAttachment_computeWorldVertices1 (spPathAttachment* self, spSlot* slot, int start, int count, float* worldVertices, int offset) {
-	spVertexAttachment_computeWorldVertices1(SUPER(self), start, count, slot, worldVertices, offset);
-}

+ 11 - 11
spine-c/spine-c/src/spine/PathConstraint.c

@@ -74,7 +74,7 @@ void spPathConstraint_dispose (spPathConstraint* self) {
 
 
 void spPathConstraint_apply (spPathConstraint* self) {
 void spPathConstraint_apply (spPathConstraint* self) {
 	int i, p, n;
 	int i, p, n;
-	float length, x, y, dx, dy, s;
+	float length, setupLength, x, y, dx, dy, s;
 	float* spaces, *lengths, *positions;
 	float* spaces, *lengths, *positions;
 	float spacing;
 	float spacing;
 	float boneX, boneY, offsetRotation;
 	float boneX, boneY, offsetRotation;
@@ -114,10 +114,10 @@ void spPathConstraint_apply (spPathConstraint* self) {
 		}
 		}
 		for (i = 0, n = spacesCount - 1; i < n;) {
 		for (i = 0, n = spacesCount - 1; i < n;) {
 			spBone* bone = bones[i];
 			spBone* bone = bones[i];
-			length = bone->data->length, x = length * bone->a, y = length * bone->c;
+			setupLength = bone->data->length, x = setupLength * bone->a, y = setupLength * bone->c;
 			length = SQRT(x * x + y * y);
 			length = SQRT(x * x + y * y);
 			if (scale) lengths[i] = length;
 			if (scale) lengths[i] = length;
-			spaces[++i] = lengthSpacing ? MAX(0, length + spacing) : spacing;
+			spaces[++i] =  (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength;
 		}
 		}
 	} else {
 	} else {
 		for (i = 1; i < spacesCount; i++) {
 		for (i = 1; i < spacesCount; i++) {
@@ -256,14 +256,14 @@ float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAtta
 			} else if (p < 0) {
 			} else if (p < 0) {
 				if (prevCurve != PATHCONSTRAINT_BEFORE) {
 				if (prevCurve != PATHCONSTRAINT_BEFORE) {
 					prevCurve = PATHCONSTRAINT_BEFORE;
 					prevCurve = PATHCONSTRAINT_BEFORE;
-					spPathAttachment_computeWorldVertices1(path, target, 2, 4, world, 0);
+					spVertexAttachment_computeWorldVertices(SUPER(path), target, 2, 4, world, 0, 2);
 				}
 				}
 				_addBeforePosition(p, world, 0, out, o);
 				_addBeforePosition(p, world, 0, out, o);
 				continue;
 				continue;
 			} else if (p > pathLength) {
 			} else if (p > pathLength) {
 				if (prevCurve != PATHCONSTRAINT_AFTER) {
 				if (prevCurve != PATHCONSTRAINT_AFTER) {
 					prevCurve = PATHCONSTRAINT_AFTER;
 					prevCurve = PATHCONSTRAINT_AFTER;
-					spPathAttachment_computeWorldVertices1(path, target, verticesLength - 6, 4, world, 0);
+					spVertexAttachment_computeWorldVertices(SUPER(path), target, verticesLength - 6, 4, world, 0, 2);
 				}
 				}
 				_addAfterPosition(p - pathLength, world, 0, out, o);
 				_addAfterPosition(p - pathLength, world, 0, out, o);
 				continue;
 				continue;
@@ -284,10 +284,10 @@ float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAtta
 			if (curve != prevCurve) {
 			if (curve != prevCurve) {
 				prevCurve = curve;
 				prevCurve = curve;
 				if (closed && curve == curveCount) {
 				if (closed && curve == curveCount) {
-					spPathAttachment_computeWorldVertices1(path, target, verticesLength - 4, 4, world, 0);
-					spPathAttachment_computeWorldVertices1(path, target, 0, 4, world, 4);
+					spVertexAttachment_computeWorldVertices(SUPER(path), target, verticesLength - 4, 4, world, 0, 2);
+					spVertexAttachment_computeWorldVertices(SUPER(path), target, 0, 4, world, 4, 2);
 				} else
 				} else
-					spPathAttachment_computeWorldVertices1(path, target, curve * 6 + 2, 8, world, 0);
+					spVertexAttachment_computeWorldVertices(SUPER(path), target, curve * 6 + 2, 8, world, 0, 2);
 			}
 			}
 			_addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o,
 			_addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o,
 				tangents || (i > 0 && space == 0));
 				tangents || (i > 0 && space == 0));
@@ -304,8 +304,8 @@ float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAtta
 			self->worldCount = verticesLength;
 			self->worldCount = verticesLength;
 		}
 		}
 		world = self->world;
 		world = self->world;
-		spPathAttachment_computeWorldVertices1(path, target, 2, verticesLength - 4, world, 0);
-		spPathAttachment_computeWorldVertices1(path, target, 0, 2, world, verticesLength - 4);
+		spVertexAttachment_computeWorldVertices(SUPER(path), target, 2, verticesLength - 4, world, 0, 2);
+		spVertexAttachment_computeWorldVertices(SUPER(path), target, 0, 2, world, verticesLength - 4, 2);
 		world[verticesLength - 2] = world[0];
 		world[verticesLength - 2] = world[0];
 		world[verticesLength - 1] = world[1];
 		world[verticesLength - 1] = world[1];
 	} else {
 	} else {
@@ -317,7 +317,7 @@ float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAtta
 			self->worldCount = verticesLength;
 			self->worldCount = verticesLength;
 		}
 		}
 		world = self->world;
 		world = self->world;
-		spPathAttachment_computeWorldVertices1(path, target, 2, verticesLength, world, 0);
+		spVertexAttachment_computeWorldVertices(SUPER(path), target, 2, verticesLength, world, 0, 2);
 	}
 	}
 
 
 	/* Curve lengths. */
 	/* Curve lengths. */

+ 60 - 0
spine-c/spine-c/src/spine/PointAttachment.c

@@ -0,0 +1,60 @@
+/******************************************************************************
+ * Spine Runtimes Software License v2.5
+ *
+ * Copyright (c) 2013-2016, Esoteric Software
+ * All rights reserved.
+ *
+ * You are granted a perpetual, non-exclusive, non-sublicensable, and
+ * non-transferable license to use, install, execute, and perform the Spine
+ * Runtimes software and derivative works solely for personal or internal
+ * use. Without the written permission of Esoteric Software (see Section 2 of
+ * the Spine Software License Agreement), you may not (a) modify, translate,
+ * adapt, or develop new applications using the Spine Runtimes or otherwise
+ * create derivative works or improvements of the Spine Runtimes or (b) remove,
+ * delete, alter, or obscure any trademarks or any copyright, trademark, patent,
+ * or other intellectual property or proprietary rights notices on or in the
+ * Software, including any copy thereof. Redistributions in binary or source
+ * form must include this license and terms.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
+ * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#include <spine/PointAttachment.h>
+#include <spine/extension.h>
+
+void _spPointAttachment_dispose (spAttachment* attachment) {
+	spPathAttachment* self = SUB_CAST(spPathAttachment, attachment);
+
+	_spVertexAttachment_deinit(SUPER(self));
+
+	FREE(self);
+}
+
+spPointAttachment* spPointAttachment_create (const char* name) {
+	spPointAttachment* self = NEW(spPointAttachment);
+	_spAttachment_init(SUPER(SUPER(self)), name, SP_ATTACHMENT_POINT, _spPointAttachment_dispose);
+	return self;
+}
+
+void spPointAttachment_computeWorldPosition (spPointAttachment* self, spBone* bone, float* x, float* y) {
+	*x = self->x * bone->a + self->y * bone->b + bone->worldX;
+	*y = self->x * bone->c + self->y * bone->d + bone->worldY;
+}
+
+float spPointAttachment_computeWorldRotation (spPointAttachment* self, spBone* bone) {
+	float cosine, sine, x, y;
+	cosine = COS_DEG(self->rotation);
+	sine = SIN_DEG(self->rotation);
+	x = cosine * bone->a + sine * bone->b;
+	y = cosine * bone->c + sine * bone->d;
+	return ATAN2(y, x) * RAD_DEG;
+}

+ 18 - 14
spine-c/spine-c/src/spine/RegionAttachment.c

@@ -42,10 +42,7 @@ spRegionAttachment* spRegionAttachment_create (const char* name) {
 	spRegionAttachment* self = NEW(spRegionAttachment);
 	spRegionAttachment* self = NEW(spRegionAttachment);
 	self->scaleX = 1;
 	self->scaleX = 1;
 	self->scaleY = 1;
 	self->scaleY = 1;
-	self->r = 1;
-	self->g = 1;
-	self->b = 1;
-	self->a = 1;
+	spColor_setFromFloats(&self->color, 1, 1, 1, 1);
 	_spAttachment_init(SUPER(self), name, SP_ATTACHMENT_REGION, _spRegionAttachment_dispose);
 	_spAttachment_init(SUPER(self), name, SP_ATTACHMENT_REGION, _spRegionAttachment_dispose);
 	return self;
 	return self;
 }
 }
@@ -99,15 +96,22 @@ void spRegionAttachment_updateOffset (spRegionAttachment* self) {
 	self->offset[SP_VERTEX_Y4] = localYCos + localX2Sin;
 	self->offset[SP_VERTEX_Y4] = localYCos + localX2Sin;
 }
 }
 
 
-void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, spBone* bone, float* vertices) {
-	const float* offset = self->offset;
+void spRegionAttachment_computeWorldVertices (spRegionAttachment* self, spBone* bone, float* vertices, int offset, int stride) {
+	const float* offsets = self->offset;
 	float x = bone->worldX, y = bone->worldY;
 	float x = bone->worldX, y = bone->worldY;
-	vertices[SP_VERTEX_X1] = offset[SP_VERTEX_X1] * bone->a + offset[SP_VERTEX_Y1] * bone->b + x;
-	vertices[SP_VERTEX_Y1] = offset[SP_VERTEX_X1] * bone->c + offset[SP_VERTEX_Y1] * bone->d + y;
-	vertices[SP_VERTEX_X2] = offset[SP_VERTEX_X2] * bone->a + offset[SP_VERTEX_Y2] * bone->b + x;
-	vertices[SP_VERTEX_Y2] = offset[SP_VERTEX_X2] * bone->c + offset[SP_VERTEX_Y2] * bone->d + y;
-	vertices[SP_VERTEX_X3] = offset[SP_VERTEX_X3] * bone->a + offset[SP_VERTEX_Y3] * bone->b + x;
-	vertices[SP_VERTEX_Y3] = offset[SP_VERTEX_X3] * bone->c + offset[SP_VERTEX_Y3] * bone->d + y;
-	vertices[SP_VERTEX_X4] = offset[SP_VERTEX_X4] * bone->a + offset[SP_VERTEX_Y4] * bone->b + x;
-	vertices[SP_VERTEX_Y4] = offset[SP_VERTEX_X4] * bone->c + offset[SP_VERTEX_Y4] * bone->d + y;
+
+	vertices[offset] = offsets[SP_VERTEX_X1] * bone->a + offsets[SP_VERTEX_Y1] * bone->b + x; /* br */
+	vertices[offset + 1] = offsets[SP_VERTEX_X1] * bone->c + offsets[SP_VERTEX_Y1] * bone->d + y;
+	offset += stride;
+
+	vertices[offset] = offsets[SP_VERTEX_X2] * bone->a + offsets[SP_VERTEX_Y2] * bone->b + x; /* bl */
+	vertices[offset + 1] = offsets[SP_VERTEX_X2] * bone->c + offsets[SP_VERTEX_Y2] * bone->d + y;
+	offset += stride;
+
+	vertices[offset] = offsets[SP_VERTEX_X3] * bone->a + offsets[SP_VERTEX_Y3] * bone->b + x; /* ul */
+	vertices[offset + 1] = offsets[SP_VERTEX_X3] * bone->c + offsets[SP_VERTEX_Y3] * bone->d + y;
+	offset += stride;
+
+	vertices[offset] = offsets[SP_VERTEX_X4] * bone->a + offsets[SP_VERTEX_Y4] * bone->b + x; /* ur */
+	vertices[offset + 1] = offsets[SP_VERTEX_X4] * bone->c + offsets[SP_VERTEX_Y4] * bone->d + y;
 }
 }

+ 35 - 17
spine-c/spine-c/src/spine/Skeleton.c

@@ -117,7 +117,7 @@ spSkeleton* spSkeleton_create (spSkeletonData* data) {
 	for (i = 0; i < self->data->pathConstraintsCount; i++)
 	for (i = 0; i < self->data->pathConstraintsCount; i++)
 		self->pathConstraints[i] = spPathConstraint_create(self->data->pathConstraints[i], self);
 		self->pathConstraints[i] = spPathConstraint_create(self->data->pathConstraints[i], self);
 
 
-	self->r = 1; self->g = 1; self->b = 1; self->a = 1;
+	spColor_setFromFloats(&self->color, 1, 1, 1, 1);
 
 
 	spSkeleton_updateCache(self);
 	spSkeleton_updateCache(self);
 
 
@@ -258,48 +258,66 @@ static void _sortPathConstraint(_spSkeleton* const internal, spPathConstraint* c
 	spSlot* slot = constraint->target;
 	spSlot* slot = constraint->target;
 	int slotIndex = slot->data->index;
 	int slotIndex = slot->data->index;
 	spBone* slotBone = slot->bone;
 	spBone* slotBone = slot->bone;
-	int ii, nn, boneCount;
+	int i, n, boneCount;
 	spAttachment* attachment;
 	spAttachment* attachment;
 	spBone** constrained;
 	spBone** constrained;
 	spSkeleton* skeleton = SUPER_CAST(spSkeleton, internal);
 	spSkeleton* skeleton = SUPER_CAST(spSkeleton, internal);
 	if (skeleton->skin) _sortPathConstraintAttachment(internal, skeleton->skin, slotIndex, slotBone);
 	if (skeleton->skin) _sortPathConstraintAttachment(internal, skeleton->skin, slotIndex, slotBone);
 	if (skeleton->data->defaultSkin && skeleton->data->defaultSkin != skeleton->skin)
 	if (skeleton->data->defaultSkin && skeleton->data->defaultSkin != skeleton->skin)
 		_sortPathConstraintAttachment(internal, skeleton->data->defaultSkin, slotIndex, slotBone);
 		_sortPathConstraintAttachment(internal, skeleton->data->defaultSkin, slotIndex, slotBone);
-	for (ii = 0, nn = skeleton->data->skinsCount; ii < nn; ii++)
-		_sortPathConstraintAttachment(internal, skeleton->data->skins[ii], slotIndex, slotBone);
+	for (i = 0, n = skeleton->data->skinsCount; i < n; i++)
+		_sortPathConstraintAttachment(internal, skeleton->data->skins[i], slotIndex, slotBone);
 
 
 	attachment = slot->attachment;
 	attachment = slot->attachment;
 	if (attachment->type == SP_ATTACHMENT_PATH) _sortPathConstraintAttachmentBones(internal, attachment, slotBone);
 	if (attachment->type == SP_ATTACHMENT_PATH) _sortPathConstraintAttachmentBones(internal, attachment, slotBone);
 
 
 	constrained = constraint->bones;
 	constrained = constraint->bones;
 	boneCount = constraint->bonesCount;
 	boneCount = constraint->bonesCount;
-	for (ii = 0; ii < boneCount; ii++)
-		_sortBone(internal, constrained[ii]);
+	for (i = 0; i < boneCount; i++)
+		_sortBone(internal, constrained[i]);
 
 
 	_addToUpdateCache(internal, SP_UPDATE_PATH_CONSTRAINT, constraint);
 	_addToUpdateCache(internal, SP_UPDATE_PATH_CONSTRAINT, constraint);
 
 
-	for (ii = 0; ii < boneCount; ii++)
-		_sortReset(constrained[ii]->children, constrained[ii]->childrenCount);
-	for (ii = 0; ii < boneCount; ii++)
-		constrained[ii]->sorted = 1;
+	for (i = 0; i < boneCount; i++)
+		_sortReset(constrained[i]->children, constrained[i]->childrenCount);
+	for (i = 0; i < boneCount; i++)
+		constrained[i]->sorted = 1;
 }
 }
 
 
 static void _sortTransformConstraint(_spSkeleton* const internal, spTransformConstraint* constraint) {
 static void _sortTransformConstraint(_spSkeleton* const internal, spTransformConstraint* constraint) {
-	int ii, boneCount;
+	int i, boneCount;
 	spBone** constrained;
 	spBone** constrained;
+	spBone* child;
+	int /*boolean*/ contains = 0;
 	_sortBone(internal, constraint->target);
 	_sortBone(internal, constraint->target);
 
 
 	constrained = constraint->bones;
 	constrained = constraint->bones;
 	boneCount = constraint->bonesCount;
 	boneCount = constraint->bonesCount;
-	for (ii = 0; ii < boneCount; ii++)
-		_sortBone(internal, constrained[ii]);
+	if (constraint->data->local) {
+		for (i = 0; i < boneCount; i++) {
+			child = constrained[boneCount - 1];
+			_sortBone(internal, child);
+			contains = 0;
+			for (i = 0; i < internal->updateCacheCount; i++) {
+				_spUpdate update = internal->updateCache[i];
+				if (update.object == child) {
+					contains = -1;
+					break;
+				}
+			}
+			if (!contains) _addToUpdateCacheReset(internal, child);
+		}
+	} else {
+		for (i = 0; i < boneCount; i++)
+			_sortBone(internal, constrained[i]);
+	}
 
 
 	_addToUpdateCache(internal, SP_UPDATE_TRANSFORM_CONSTRAINT, constraint);
 	_addToUpdateCache(internal, SP_UPDATE_TRANSFORM_CONSTRAINT, constraint);
 
 
-	for (ii = 0; ii < boneCount; ii++)
-		_sortReset(constrained[ii]->children, constrained[ii]->childrenCount);
-	for (ii = 0; ii < boneCount; ii++)
-		constrained[ii]->sorted = 1;
+	for (i = 0; i < boneCount; i++)
+		_sortReset(constrained[i]->children, constrained[i]->childrenCount);
+	for (i = 0; i < boneCount; i++)
+		constrained[i]->sorted = 1;
 }
 }
 
 
 void spSkeleton_updateCache (spSkeleton* self) {
 void spSkeleton_updateCache (spSkeleton* self) {

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

@@ -686,7 +686,7 @@ spAttachment* spSkeletonBinary_readAttachment(spSkeletonBinary* self, _dataInput
 			region->scaleY = readFloat(input);
 			region->scaleY = readFloat(input);
 			region->width = readFloat(input) * self->scale;
 			region->width = readFloat(input) * self->scale;
 			region->height = readFloat(input) * self->scale;
 			region->height = readFloat(input) * self->scale;
-			readColor(input, &region->r, &region->g, &region->b, &region->a);
+			readColor(input, &region->color.r, &region->color.g, &region->color.b, &region->color.a);
 			spRegionAttachment_updateOffset(region);
 			spRegionAttachment_updateOffset(region);
 			spAttachmentLoader_configureAttachment(self->attachmentLoader, attachment);
 			spAttachmentLoader_configureAttachment(self->attachmentLoader, attachment);
 			if (freeName) FREE(name);
 			if (freeName) FREE(name);
@@ -711,7 +711,7 @@ spAttachment* spSkeletonBinary_readAttachment(spSkeletonBinary* self, _dataInput
 			attachment = spAttachmentLoader_createAttachment(self->attachmentLoader, skin, type, name, path);
 			attachment = spAttachmentLoader_createAttachment(self->attachmentLoader, skin, type, name, path);
 			mesh = SUB_CAST(spMeshAttachment, attachment);
 			mesh = SUB_CAST(spMeshAttachment, attachment);
 			mesh->path = path;
 			mesh->path = path;
-			readColor(input, &mesh->r, &mesh->g, &mesh->b, &mesh->a);
+			readColor(input, &mesh->color.r, &mesh->color.g, &mesh->color.b, &mesh->color.a);
 			vertexCount = readVarint(input, 1);
 			vertexCount = readVarint(input, 1);
 			mesh->regionUVs = _readFloatArray(input, vertexCount << 1, 1);
 			mesh->regionUVs = _readFloatArray(input, vertexCount << 1, 1);
 			mesh->triangles = (unsigned short*)_readShortArray(input, &mesh->trianglesCount);
 			mesh->triangles = (unsigned short*)_readShortArray(input, &mesh->trianglesCount);
@@ -741,7 +741,7 @@ spAttachment* spSkeletonBinary_readAttachment(spSkeletonBinary* self, _dataInput
 			attachment = spAttachmentLoader_createAttachment(self->attachmentLoader, skin, type, name, path);
 			attachment = spAttachmentLoader_createAttachment(self->attachmentLoader, skin, type, name, path);
 			mesh = SUB_CAST(spMeshAttachment, attachment);
 			mesh = SUB_CAST(spMeshAttachment, attachment);
 			mesh->path = path;
 			mesh->path = path;
-			readColor(input, &mesh->r, &mesh->g, &mesh->b, &mesh->a);
+			readColor(input, &mesh->color.r, &mesh->color.g, &mesh->color.b, &mesh->color.a);
 			skinName = readString(input);
 			skinName = readString(input);
 			parent = readString(input);
 			parent = readString(input);
 			mesh->inheritDeform = readBoolean(input);
 			mesh->inheritDeform = readBoolean(input);
@@ -771,6 +771,18 @@ spAttachment* spSkeletonBinary_readAttachment(spSkeletonBinary* self, _dataInput
 			if (freeName) FREE(name);
 			if (freeName) FREE(name);
 			return attachment;
 			return attachment;
 		}
 		}
+		case SP_ATTACHMENT_POINT: {
+			spAttachment* attachment = spAttachmentLoader_createAttachment(self->attachmentLoader, skin, type, name, 0);
+			spPointAttachment* point = SUB_CAST(spPointAttachment, attachment);
+			point->rotation = readFloat(input);
+			point->x = readFloat(input) * self->scale;
+			point->y = readFloat(input) * self->scale;
+
+			if (nonessential) {
+				readColor(input, &point->color.r, &point->color.g, &point->color.b, &point->color.a);
+			}
+			return attachment;
+		}
 	}
 	}
 
 
 	if (freeName) FREE(name);
 	if (freeName) FREE(name);
@@ -884,12 +896,21 @@ spSkeletonData* spSkeletonBinary_readSkeletonData (spSkeletonBinary* self, const
 	skeletonData->slotsCount = readVarint(input, 1);
 	skeletonData->slotsCount = readVarint(input, 1);
 	skeletonData->slots = MALLOC(spSlotData*, skeletonData->slotsCount);
 	skeletonData->slots = MALLOC(spSlotData*, skeletonData->slotsCount);
 	for (i = 0; i < skeletonData->slotsCount; ++i) {
 	for (i = 0; i < skeletonData->slotsCount; ++i) {
+		int r, g, b, a;
 		const char* slotName = readString(input);
 		const char* slotName = readString(input);
 		spBoneData* boneData = skeletonData->bones[readVarint(input, 1)];
 		spBoneData* boneData = skeletonData->bones[readVarint(input, 1)];
 		/* TODO Avoid copying of slotName */
 		/* TODO Avoid copying of slotName */
 		spSlotData* slotData = spSlotData_create(i, slotName, boneData);
 		spSlotData* slotData = spSlotData_create(i, slotName, boneData);
 		FREE(slotName);
 		FREE(slotName);
-		readColor(input, &slotData->r, &slotData->g, &slotData->b, &slotData->a);
+		readColor(input, &slotData->color.r, &slotData->color.g, &slotData->color.b, &slotData->color.a);
+		r = readByte(input);
+		g = readByte(input);
+		b = readByte(input);
+		a = readByte(input);
+		if (!(r == 0xff && g == 0xff && b == 0xff && a == 0xff)) {
+			slotData->darkColor = spColor_create();
+			spColor_setFromFloats(slotData->darkColor, r / 255.0f, g / 255.0f, b / 255.0f, 1);
+		}
 		slotData->attachmentName = readString(input);
 		slotData->attachmentName = readString(input);
 		slotData->blendMode = (spBlendMode)readVarint(input, 1);
 		slotData->blendMode = (spBlendMode)readVarint(input, 1);
 		skeletonData->slots[i] = slotData;
 		skeletonData->slots[i] = slotData;

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

@@ -141,7 +141,7 @@ void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/
 			self->polygons[self->count] = polygon = spPolygon_create(boundingBox->super.worldVerticesLength);
 			self->polygons[self->count] = polygon = spPolygon_create(boundingBox->super.worldVerticesLength);
 		}
 		}
 		polygon->count = boundingBox->super.worldVerticesLength;
 		polygon->count = boundingBox->super.worldVerticesLength;
-		spBoundingBoxAttachment_computeWorldVertices(boundingBox, slot, polygon->vertices);
+		spVertexAttachment_computeWorldVertices(SUPER(boundingBox), slot, 0, polygon->count, polygon->vertices, 0, 2);
 
 
 		if (updateAabb) {
 		if (updateAabb) {
 			int ii = 0;
 			int ii = 0;

+ 63 - 20
spine-c/spine-c/src/spine/SkeletonJson.c

@@ -34,7 +34,6 @@
 #include "Json.h"
 #include "Json.h"
 #include <spine/extension.h>
 #include <spine/extension.h>
 #include <spine/AtlasAttachmentLoader.h>
 #include <spine/AtlasAttachmentLoader.h>
-#include <spine/Animation.h>
 
 
 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
 #define strdup _strdup
 #define strdup _strdup
@@ -188,7 +187,19 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 		}
 		}
 
 
 		for (timelineMap = slotMap->child; timelineMap; timelineMap = timelineMap->next) {
 		for (timelineMap = slotMap->child; timelineMap; timelineMap = timelineMap->next) {
-			if (strcmp(timelineMap->name, "color") == 0) {
+			if (strcmp(timelineMap->name, "attachment") == 0) {
+				spAttachmentTimeline *timeline = spAttachmentTimeline_create(timelineMap->size);
+				timeline->slotIndex = slotIndex;
+
+				for (valueMap = timelineMap->child, frameIndex = 0; valueMap; valueMap = valueMap->next, ++frameIndex) {
+					Json* name = Json_getItem(valueMap, "name");
+					spAttachmentTimeline_setFrame(timeline, frameIndex, Json_getFloat(valueMap, "time", 0),
+												  name->type == Json_NULL ? 0 : name->valueString);
+				}
+				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
+				animation->duration = MAX(animation->duration, timeline->frames[timelineMap->size - 1]);
+
+			} else if (strcmp(timelineMap->name, "color") == 0) {
 				spColorTimeline *timeline = spColorTimeline_create(timelineMap->size);
 				spColorTimeline *timeline = spColorTimeline_create(timelineMap->size);
 				timeline->slotIndex = slotIndex;
 				timeline->slotIndex = slotIndex;
 
 
@@ -201,17 +212,19 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 				animation->duration = MAX(animation->duration, timeline->frames[(timelineMap->size - 1) * COLOR_ENTRIES]);
 				animation->duration = MAX(animation->duration, timeline->frames[(timelineMap->size - 1) * COLOR_ENTRIES]);
 
 
-			} else if (strcmp(timelineMap->name, "attachment") == 0) {
-				spAttachmentTimeline *timeline = spAttachmentTimeline_create(timelineMap->size);
+			} else if (strcmp(timelineMap->name, "twoColor") == 0) {
+				spTwoColorTimeline *timeline = spTwoColorTimeline_create(timelineMap->size);
 				timeline->slotIndex = slotIndex;
 				timeline->slotIndex = slotIndex;
 
 
 				for (valueMap = timelineMap->child, frameIndex = 0; valueMap; valueMap = valueMap->next, ++frameIndex) {
 				for (valueMap = timelineMap->child, frameIndex = 0; valueMap; valueMap = valueMap->next, ++frameIndex) {
-					Json* name = Json_getItem(valueMap, "name");
-					spAttachmentTimeline_setFrame(timeline, frameIndex, Json_getFloat(valueMap, "time", 0),
-							name->type == Json_NULL ? 0 : name->valueString);
+					const char* s = Json_getString(valueMap, "color", 0);
+					const char* ds = Json_getString(valueMap, "color", 0);
+					spTwoColorTimeline_setFrame(timeline, frameIndex, Json_getFloat(valueMap, "time", 0), toColor(s, 0), toColor(s, 1), toColor(s, 2),
+											 toColor(s, 3), toColor(ds, 0), toColor(ds, 1), toColor(ds, 2));
+					readCurve(valueMap, SUPER(timeline), frameIndex);
 				}
 				}
 				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
-				animation->duration = MAX(animation->duration, timeline->frames[timelineMap->size - 1]);
+				animation->duration = MAX(animation->duration, timeline->frames[(timelineMap->size - 1) * TWOCOLOR_ENTRIES]);
 
 
 			} else {
 			} else {
 				spAnimation_dispose(animation);
 				spAnimation_dispose(animation);
@@ -652,6 +665,7 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 		for (slotMap = slots->child, i = 0; slotMap; slotMap = slotMap->next, ++i) {
 		for (slotMap = slots->child, i = 0; slotMap; slotMap = slotMap->next, ++i) {
 			spSlotData* data;
 			spSlotData* data;
 			const char* color;
 			const char* color;
+			const char* dark;
 			Json *item;
 			Json *item;
 
 
 			const char* boneName = Json_getString(slotMap, "bone", 0);
 			const char* boneName = Json_getString(slotMap, "bone", 0);
@@ -666,10 +680,21 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 
 
 			color = Json_getString(slotMap, "color", 0);
 			color = Json_getString(slotMap, "color", 0);
 			if (color) {
 			if (color) {
-				data->r = toColor(color, 0);
-				data->g = toColor(color, 1);
-				data->b = toColor(color, 2);
-				data->a = toColor(color, 3);
+				spColor_setFromFloats(&data->color,
+									  toColor(color, 0),
+									  toColor(color, 1),
+									  toColor(color, 2),
+									  toColor(color, 3));
+			}
+
+			dark = Json_getString(slotMap, "dark", 0);
+			if (dark) {
+				data->darkColor = spColor_create();
+				spColor_setFromFloats(data->darkColor,
+									  toColor(dark, 0),
+									  toColor(dark, 1),
+									  toColor(dark, 2),
+									  toColor(dark, 3));
 			}
 			}
 
 
 			item = Json_getItem(slotMap, "attachment");
 			item = Json_getItem(slotMap, "attachment");
@@ -902,10 +927,11 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 
 
 						color = Json_getString(attachmentMap, "color", 0);
 						color = Json_getString(attachmentMap, "color", 0);
 						if (color) {
 						if (color) {
-							region->r = toColor(color, 0);
-							region->g = toColor(color, 1);
-							region->b = toColor(color, 2);
-							region->a = toColor(color, 3);
+							spColor_setFromFloats(&region->color,
+												  toColor(color, 0),
+												  toColor(color, 1),
+												  toColor(color, 2),
+												  toColor(color, 3));
 						}
 						}
 
 
 						spRegionAttachment_updateOffset(region);
 						spRegionAttachment_updateOffset(region);
@@ -921,10 +947,11 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 
 
 						color = Json_getString(attachmentMap, "color", 0);
 						color = Json_getString(attachmentMap, "color", 0);
 						if (color) {
 						if (color) {
-							mesh->r = toColor(color, 0);
-							mesh->g = toColor(color, 1);
-							mesh->b = toColor(color, 2);
-							mesh->a = toColor(color, 3);
+							spColor_setFromFloats(&mesh->color,
+												  toColor(color, 0),
+												  toColor(color, 1),
+												  toColor(color, 2),
+												  toColor(color, 3));
 						}
 						}
 
 
 						mesh->width = Json_getFloat(attachmentMap, "width", 32) * self->scale;
 						mesh->width = Json_getFloat(attachmentMap, "width", 32) * self->scale;
@@ -992,6 +1019,22 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 						}
 						}
 						break;
 						break;
 					}
 					}
+					case SP_ATTACHMENT_POINT: {
+						spPointAttachment* point = SUB_CAST(spPointAttachment, attachment);
+						point->x = Json_getFloat(attachmentMap, "x", 0) * self->scale;
+						point->y = Json_getFloat(attachmentMap, "y", 0) * self->scale;
+						point->rotation = Json_getFloat(attachmentMap, "rotation", 0);
+
+						color = Json_getString(attachmentMap, "color", 0);
+						if (color) {
+							spColor_setFromFloats(&point->color,
+												  toColor(color, 0),
+												  toColor(color, 1),
+												  toColor(color, 2),
+												  toColor(color, 3));
+						}
+						break;
+					}
 					}
 					}
 
 
 					spSkin_addAttachment(skin, slotIndex, skinAttachmentName, attachment);
 					spSkin_addAttachment(skin, slotIndex, skinAttachmentName, attachment);

+ 5 - 4
spine-c/spine-c/src/spine/Slot.c

@@ -40,12 +40,15 @@ spSlot* spSlot_create (spSlotData* data, spBone* bone) {
 	spSlot* self = SUPER(NEW(_spSlot));
 	spSlot* self = SUPER(NEW(_spSlot));
 	CONST_CAST(spSlotData*, self->data) = data;
 	CONST_CAST(spSlotData*, self->data) = data;
 	CONST_CAST(spBone*, self->bone) = bone;
 	CONST_CAST(spBone*, self->bone) = bone;
+	spColor_setFromFloats(&self->color, 1, 1, 1, 1);
+	self->darkColor = data->darkColor == 0 ? 0 : spColor_create();
 	spSlot_setToSetupPose(self);
 	spSlot_setToSetupPose(self);
 	return self;
 	return self;
 }
 }
 
 
 void spSlot_dispose (spSlot* self) {
 void spSlot_dispose (spSlot* self) {
 	FREE(self->attachmentVertices);
 	FREE(self->attachmentVertices);
+	FREE(self->darkColor);
 	FREE(self);
 	FREE(self);
 }
 }
 
 
@@ -65,10 +68,8 @@ float spSlot_getAttachmentTime (const spSlot* self) {
 }
 }
 
 
 void spSlot_setToSetupPose (spSlot* self) {
 void spSlot_setToSetupPose (spSlot* self) {
-	self->r = self->data->r;
-	self->g = self->data->g;
-	self->b = self->data->b;
-	self->a = self->data->a;
+	spColor_setFromColor(&self->color, &self->data->color);
+	if (self->darkColor) spColor_setFromColor(self->darkColor, self->data->darkColor);
 
 
 	if (!self->data->attachmentName)
 	if (!self->data->attachmentName)
 		spSlot_setAttachment(self, 0);
 		spSlot_setAttachment(self, 0);

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

@@ -36,16 +36,14 @@ spSlotData* spSlotData_create (const int index, const char* name, spBoneData* bo
 	CONST_CAST(int, self->index) = index;
 	CONST_CAST(int, self->index) = index;
 	MALLOC_STR(self->name, name);
 	MALLOC_STR(self->name, name);
 	CONST_CAST(spBoneData*, self->boneData) = boneData;
 	CONST_CAST(spBoneData*, self->boneData) = boneData;
-	self->r = 1;
-	self->g = 1;
-	self->b = 1;
-	self->a = 1;
+	spColor_setFromFloats(&self->color, 1, 1, 1, 1);
 	return self;
 	return self;
 }
 }
 
 
 void spSlotData_dispose (spSlotData* self) {
 void spSlotData_dispose (spSlotData* self) {
 	FREE(self->name);
 	FREE(self->name);
 	FREE(self->attachmentName);
 	FREE(self->attachmentName);
+	FREE(self->darkColor);
 	FREE(self);
 	FREE(self);
 }
 }
 
 

+ 163 - 11
spine-c/spine-c/src/spine/TransformConstraint.c

@@ -53,7 +53,7 @@ void spTransformConstraint_dispose (spTransformConstraint* self) {
 	FREE(self);
 	FREE(self);
 }
 }
 
 
-void spTransformConstraint_apply (spTransformConstraint* self) {
+void _spTransformConstraint_applyAbsoluteWorld (spTransformConstraint* self) {
 	float rotateMix = self->rotateMix, translateMix = self->translateMix, scaleMix = self->scaleMix, shearMix = self->shearMix;
 	float rotateMix = self->rotateMix, translateMix = self->translateMix, scaleMix = self->scaleMix, shearMix = self->shearMix;
 	spBone* target = self->target;
 	spBone* target = self->target;
 	float ta = target->a, tb = target->b, tc = target->c, td = target->d;
 	float ta = target->a, tb = target->b, tc = target->c, td = target->d;
@@ -61,14 +61,14 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 	float offsetRotation = self->data->offsetRotation * degRadReflect, offsetShearY = self->data->offsetShearY * degRadReflect;
 	float offsetRotation = self->data->offsetRotation * degRadReflect, offsetShearY = self->data->offsetShearY * degRadReflect;
 	int /*bool*/ modified;
 	int /*bool*/ modified;
 	int i;
 	int i;
+	float a, b, c, d, r, cosine, sine, x, y, s, ts, by;
 	for (i = 0; i < self->bonesCount; ++i) {
 	for (i = 0; i < self->bonesCount; ++i) {
 		spBone* bone = self->bones[i];
 		spBone* bone = self->bones[i];
 		modified = 0;
 		modified = 0;
 
 
 		if (rotateMix != 0) {
 		if (rotateMix != 0) {
-			float a = bone->a, b = bone->b, c = bone->c, d = bone->d;
-			float r = ATAN2(tc, ta) - ATAN2(c, a) + offsetRotation;
-			float cosine, sine;
+			a = bone->a, b = bone->b, c = bone->c, d = bone->d;
+			r = ATAN2(tc, ta) - ATAN2(c, a) + offsetRotation;
 			if (r > PI) r -= PI2;
 			if (r > PI) r -= PI2;
 			else if (r < -PI) r += PI2;
 			else if (r < -PI) r += PI2;
 			r *= rotateMix;
 			r *= rotateMix;
@@ -82,7 +82,6 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 		}
 		}
 
 
 		if (translateMix != 0) {
 		if (translateMix != 0) {
-			float x, y;
 			spBone_localToWorld(target, self->data->offsetX, self->data->offsetY, &x, &y);
 			spBone_localToWorld(target, self->data->offsetX, self->data->offsetY, &x, &y);
 			CONST_CAST(float, bone->worldX) += (x - bone->worldX) * translateMix;
 			CONST_CAST(float, bone->worldX) += (x - bone->worldX) * translateMix;
 			CONST_CAST(float, bone->worldY) += (y - bone->worldY) * translateMix;
 			CONST_CAST(float, bone->worldY) += (y - bone->worldY) * translateMix;
@@ -90,8 +89,8 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 		}
 		}
 
 
 		if (scaleMix > 0) {
 		if (scaleMix > 0) {
-			float s = SQRT(bone->a * bone->a + bone->c * bone->c);
-			float ts = SQRT(ta * ta + tc * tc);
+			s = SQRT(bone->a * bone->a + bone->c * bone->c);
+			ts = SQRT(ta * ta + tc * tc);
 			if (s > 0.00001f) s = (s + (ts - s + self->data->offsetScaleX) * scaleMix) / s;
 			if (s > 0.00001f) s = (s + (ts - s + self->data->offsetScaleX) * scaleMix) / s;
 			CONST_CAST(float, bone->a) *= s;
 			CONST_CAST(float, bone->a) *= s;
 			CONST_CAST(float, bone->c) *= s;
 			CONST_CAST(float, bone->c) *= s;
@@ -104,10 +103,10 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 		}
 		}
 
 
 		if (shearMix > 0) {
 		if (shearMix > 0) {
-			float b = bone->b, d = bone->d;
-			float by = ATAN2(d, b);
-			float r = ATAN2(td, tb) - ATAN2(tc, ta) - (by - ATAN2(bone->c, bone->a));
-			float s = SQRT(b * b + d * d);
+			b = bone->b, d = bone->d;
+			by = ATAN2(d, b);
+			r = ATAN2(td, tb) - ATAN2(tc, ta) - (by - ATAN2(bone->c, bone->a));
+			s = SQRT(b * b + d * d);
 			if (r > PI) r -= PI2;
 			if (r > PI) r -= PI2;
 			else if (r < -PI) r += PI2;
 			else if (r < -PI) r += PI2;
 			r = by + (r + offsetShearY) * shearMix;
 			r = by + (r + offsetShearY) * shearMix;
@@ -119,3 +118,156 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 		if (modified) CONST_CAST(int, bone->appliedValid) = 0;
 		if (modified) CONST_CAST(int, bone->appliedValid) = 0;
 	}
 	}
 }
 }
+
+void _spTransformConstraint_applyRelativeWorld (spTransformConstraint* self) {
+	float rotateMix = self->rotateMix, translateMix = self->translateMix, scaleMix = self->scaleMix, shearMix = self->shearMix;
+	spBone* target = self->target;
+	float ta = target->a, tb = target->b, tc = target->c, td = target->d;
+	float degRadReflect = ta * td - tb * tc > 0 ? DEG_RAD : -DEG_RAD;
+	float offsetRotation = self->data->offsetRotation * degRadReflect, offsetShearY = self->data->offsetShearY * degRadReflect;
+	int /*bool*/ modified;
+	int i;
+	float a, b, c, d, r, cosine, sine, x, y, s;
+	for (i = 0; i < self->bonesCount; ++i) {
+		spBone* bone = self->bones[i];
+		modified = 0;
+
+		if (rotateMix != 0) {
+			a = bone->a, b = bone->b, c = bone->c, d = bone->d;
+			r = ATAN2(tc, ta) + offsetRotation;
+			if (r > PI) r -= PI2;
+			else if (r < -PI) r += PI2;
+			r *= rotateMix;
+			cosine = COS(r);
+			sine = SIN(r);
+			CONST_CAST(float, bone->a) = cosine * a - sine * c;
+			CONST_CAST(float, bone->b) = cosine * b - sine * d;
+			CONST_CAST(float, bone->c) = sine * a + cosine * c;
+			CONST_CAST(float, bone->d) = sine * b + cosine * d;
+			modified = 1;
+		}
+
+		if (translateMix != 0) {
+			spBone_localToWorld(target, self->data->offsetX, self->data->offsetY, &x, &y);
+			CONST_CAST(float, bone->worldX) += (x * translateMix);
+			CONST_CAST(float, bone->worldY) += (y * translateMix);
+			modified = 1;
+		}
+
+		if (scaleMix > 0) {
+			s = (SQRT(ta * ta + tc * tc) - 1 + self->data->offsetScaleX) * scaleMix + 1;
+			CONST_CAST(float, bone->a) *= s;
+			CONST_CAST(float, bone->c) *= s;
+			s = (SQRT(tb * tb + td * td) - 1 + self->data->offsetScaleY) * scaleMix + 1;
+			CONST_CAST(float, bone->b) *= s;
+			CONST_CAST(float, bone->d) *= s;
+			modified = 1;
+		}
+
+		if (shearMix > 0) {
+			r = ATAN2(td, tb) - ATAN2(tc, ta);
+			if (r > PI) r -= PI2;
+			else if (r < -PI) r += PI2;
+			b = bone->b, d = bone->d;
+			r = ATAN2(d, b) + (r - PI / 2 + offsetShearY) * shearMix;
+			s = SQRT(b * b + d * d);
+			CONST_CAST(float, bone->b) = COS(r) * s;
+			CONST_CAST(float, bone->d) = SIN(r) * s;
+			modified = 1;
+		}
+
+		if (modified) CONST_CAST(int, bone->appliedValid) = 0;
+	}
+}
+
+void _spTransformConstraint_applyAbsoluteLocal (spTransformConstraint* self) {
+	float rotateMix = self->rotateMix, translateMix = self->translateMix, scaleMix = self->scaleMix, shearMix = self->shearMix;
+	spBone* target = self->target;
+	int i;
+	float rotation, r, x, y, scaleX, scaleY, shearY;
+
+	if (!target->appliedValid) spBone_updateAppliedTransform(target);
+	for (i = 0; i < self->bonesCount; ++i) {
+		spBone* bone = self->bones[i];
+		if (!bone->appliedValid) spBone_updateAppliedTransform(bone);
+
+		rotation = bone->arotation;
+		if (rotateMix != 0) {
+			r = target->arotation - rotation + self->data->offsetRotation;
+			r -= (16384 - (int)(16384.499999999996 - r / 360)) * 360;
+			rotation += r * rotateMix;
+		}
+
+		x = bone->ax, y = bone->ay;
+		if (translateMix != 0) {
+			x += (target->ax - x + self->data->offsetX) * translateMix;
+			y += (target->ay - y + self->data->offsetY) * translateMix;
+		}
+
+		scaleX = bone->ascaleX, scaleY = bone->ascaleY;
+		if (scaleMix > 0) {
+			if (scaleX > 0.00001) scaleX = (scaleX + (target->ascaleX - scaleX + self->data->offsetScaleX) * scaleMix) / scaleX;
+			if (scaleY > 0.00001) scaleY = (scaleY + (target->ascaleY - scaleY + self->data->offsetScaleY) * scaleMix) / scaleY;
+		}
+
+		shearY = bone->ashearY;
+		if (shearMix > 0) {
+			r = target->ashearY - shearY + self->data->offsetShearY;
+			r -= (16384 - (int)(16384.499999999996 - r / 360)) * 360;
+			bone->shearY += r * shearMix;
+		}
+
+		spBone_updateWorldTransformWith(bone, x, y, rotation, scaleX, scaleY, bone->ashearX, shearY);
+	}
+}
+
+void _spTransformConstraint_applyRelativeLocal (spTransformConstraint* self) {
+	float rotateMix = self->rotateMix, translateMix = self->translateMix, scaleMix = self->scaleMix, shearMix = self->shearMix;
+	spBone* target = self->target;
+	int i;
+	float rotation, x, y, scaleX, scaleY, shearY;
+
+	if (!target->appliedValid) spBone_updateAppliedTransform(target);
+
+	for (i = 0; i < self->bonesCount; ++i) {
+		spBone* bone = self->bones[i];
+		if (!bone->appliedValid) spBone_updateAppliedTransform(bone);
+
+		rotation = bone->arotation;
+		if (rotateMix != 0) rotation += (target->arotation + self->data->offsetRotation) * rotateMix;
+
+		x = bone->ax;
+		y = bone->ay;
+		if (translateMix != 0) {
+			x += (target->ax + self->data->offsetX) * translateMix;
+			y += (target->ay + self->data->offsetY) * translateMix;
+		}
+
+		scaleX = bone->ascaleX;
+		scaleY = bone->ascaleY;
+		if (scaleMix > 0) {
+			if (scaleX > 0.00001f) scaleX *= ((target->ascaleX - 1 + self->data->offsetScaleX) * scaleMix) + 1;
+			if (scaleY > 0.00001f) scaleY *= ((target->ascaleY - 1 + self->data->offsetScaleY) * scaleMix) + 1;
+		}
+
+		shearY = bone->ashearY;
+		if (shearMix > 0) shearY += (target->ashearY + self->data->offsetShearY) * shearMix;
+
+		spBone_updateWorldTransformWith(bone, x, y, rotation, scaleX, scaleY, bone->ashearX, shearY);
+	}
+}
+
+void spTransformConstraint_apply (spTransformConstraint* self) {
+	if (self->data->local) {
+		if (self->data->relative)
+			_spTransformConstraint_applyRelativeLocal(self);
+		else
+			_spTransformConstraint_applyAbsoluteLocal(self);
+
+	} else {
+		if (self->data->relative)
+			_spTransformConstraint_applyRelativeWorld(self);
+		else
+			_spTransformConstraint_applyAbsoluteWorld(self);
+	}
+}

+ 4 - 8
spine-c/spine-c/src/spine/VertexAttachment.c

@@ -37,11 +37,7 @@ void _spVertexAttachment_deinit (spVertexAttachment* attachment) {
 	FREE(attachment->vertices);
 	FREE(attachment->vertices);
 }
 }
 
 
-void spVertexAttachment_computeWorldVertices (spVertexAttachment* self, spSlot* slot, float* worldVertices) {
-	spVertexAttachment_computeWorldVertices1(self, 0, self->worldVerticesLength, slot, worldVertices, 0);
-}
-
-void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int start, int count, spSlot* slot, float* worldVertices, int offset) {
+void spVertexAttachment_computeWorldVertices (spVertexAttachment* self, spSlot* slot, int start, int count, float* worldVertices, int offset, int stride) {
 	spSkeleton* skeleton;
 	spSkeleton* skeleton;
 	int deformLength;
 	int deformLength;
 	float* deform;
 	float* deform;
@@ -62,7 +58,7 @@ void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int sta
 		bone = slot->bone;
 		bone = slot->bone;
 		x = bone->worldX;
 		x = bone->worldX;
 		y = bone->worldY;
 		y = bone->worldY;
-		for (v = start, w = offset; w < count; v += 2, w += 2) {
+		for (v = start, w = offset; w < count; v += 2, w += stride) {
 			float vx = vertices[v], vy = vertices[v + 1];
 			float vx = vertices[v], vy = vertices[v + 1];
 			worldVertices[w] = vx * bone->a + vy * bone->b + x;
 			worldVertices[w] = vx * bone->a + vy * bone->b + x;
 			worldVertices[w + 1] = vx * bone->c + vy * bone->d + y;
 			worldVertices[w + 1] = vx * bone->c + vy * bone->d + y;
@@ -78,7 +74,7 @@ void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int sta
 		skeletonBones = skeleton->bones;
 		skeletonBones = skeleton->bones;
 		if (deformLength == 0) {
 		if (deformLength == 0) {
 			int w, b;
 			int w, b;
-			for (w = offset, b = skip * 3; w < count; w += 2) {
+			for (w = offset, b = skip * 3; w < count; w += stride) {
 				float wx = 0, wy = 0;
 				float wx = 0, wy = 0;
 				int n = bones[v++];
 				int n = bones[v++];
 				n += v;
 				n += v;
@@ -93,7 +89,7 @@ void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int sta
 			}
 			}
 		} else {
 		} else {
 			int w, b, f;
 			int w, b, f;
-			for (w = offset, b = skip * 3, f = skip << 1; w < count; w += 2) {
+			for (w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) {
 				float wx = 0, wy = 0;
 				float wx = 0, wy = 0;
 				int n = bones[v++];
 				int n = bones[v++];
 				n += v;
 				n += v;

文件差异内容过多而无法显示
+ 218 - 225
spine-cocos2d-objc/Resources/goblins-mesh.json


文件差异内容过多而无法显示
+ 102 - 109
spine-cocos2d-objc/Resources/raptor.json


文件差异内容过多而无法显示
+ 236 - 243
spine-cocos2d-objc/Resources/spineboy.json


文件差异内容过多而无法显示
+ 27 - 36
spine-cocos2d-objc/Resources/tank.json


文件差异内容过多而无法显示
+ 218 - 225
spine-cocos2dx/example/Resources/common/goblins-mesh.json


文件差异内容过多而无法显示
+ 102 - 109
spine-cocos2dx/example/Resources/common/raptor.json


文件差异内容过多而无法显示
+ 236 - 243
spine-cocos2dx/example/Resources/common/spineboy.json


文件差异内容过多而无法显示
+ 27 - 36
spine-cocos2dx/example/Resources/common/tank.json


文件差异内容过多而无法显示
+ 218 - 225
spine-corona/data/goblins-mesh.json


文件差异内容过多而无法显示
+ 102 - 109
spine-corona/data/raptor.json


文件差异内容过多而无法显示
+ 236 - 243
spine-corona/data/spineboy.json


文件差异内容过多而无法显示
+ 56 - 71
spine-corona/data/stretchyman.json


文件差异内容过多而无法显示
+ 27 - 36
spine-corona/data/tank.json


+ 34 - 41
spine-corona/data/test.json

@@ -1,20 +1,13 @@
 {
 {
-"skeleton": {
-	"hash": "i05EldfljpjLC64I/kHnNrqzJ5A",
-	"spine": "3.5.03-beta",
-	"width": 1333.78,
-	"height": 1112.91,
-	"fps": 30,
-	"images": "./images/"
-},
+"skeleton": { "hash": "64h+ct/Nr1wkBrgZHtYbbfXpBlI", "spine": "3.6.05-beta", "width": 1333.78, "height": 1112.91, "images": "./images/" },
 "bones": [
 "bones": [
-	{ "name": "root", "x": 28.68, "y": -105.7 },
-	{ "name": "attachment", "parent": "root", "x": -267.7, "y": -366.61 },
-	{ "name": "color", "parent": "root", "x": -298.29, "y": 44.09 },
-	{ "name": "draworder", "parent": "root", "x": 283.52, "y": -356.26 },
-	{ "name": "mesh", "parent": "root", "x": -320.73, "y": 413.7 },
-	{ "name": "meshweighted", "parent": "root", "rotation": -11.22, "x": -353.27, "y": 627.53 },
-	{ "name": "pathfollower", "parent": "root", "x": 177.52, "y": 56.61 },
+	{ "name": "root", "x": 28.68, "y": -105.71 },
+	{ "name": "attachment", "parent": "root", "x": -267.71, "y": -366.62 },
+	{ "name": "color", "parent": "root", "x": -298.3, "y": 44.1 },
+	{ "name": "draworder", "parent": "root", "x": 283.53, "y": -356.27 },
+	{ "name": "mesh", "parent": "root", "x": -320.74, "y": 413.7 },
+	{ "name": "meshweighted", "parent": "root", "rotation": -11.22, "x": -353.28, "y": 627.53 },
+	{ "name": "pathfollower", "parent": "root", "x": 177.52, "y": 56.62 },
 	{ "name": "rotate", "parent": "root", "x": -305, "y": 201 },
 	{ "name": "rotate", "parent": "root", "x": -305, "y": 201 },
 	{ "name": "scale", "parent": "root", "x": 183.99, "y": -138 },
 	{ "name": "scale", "parent": "root", "x": 183.99, "y": -138 },
 	{ "name": "shear", "parent": "root", "x": -304, "y": -146 },
 	{ "name": "shear", "parent": "root", "x": -304, "y": -146 },
@@ -81,7 +74,7 @@
 				"path": "spine",
 				"path": "spine",
 				"uvs": [ 0, 0, 0.25, 0, 0.5, 0, 0.75, 0, 1, 0, 1, 0.25, 1, 0.5, 1, 0.75, 1, 1, 0.75, 1, 0.5, 1, 0.25, 1, 0, 1, 0, 0.75, 0, 0.5, 0, 0.25, 0.25, 0.25, 0.25, 0.5, 0.25, 0.75, 0.5, 0.25, 0.5, 0.5, 0.5, 0.75, 0.75, 0.25, 0.75, 0.5, 0.75, 0.75 ],
 				"uvs": [ 0, 0, 0.25, 0, 0.5, 0, 0.75, 0, 1, 0, 1, 0.25, 1, 0.5, 1, 0.75, 1, 1, 0.75, 1, 0.5, 1, 0.25, 1, 0, 1, 0, 0.75, 0, 0.5, 0, 0.25, 0.25, 0.25, 0.25, 0.5, 0.25, 0.75, 0.5, 0.25, 0.5, 0.5, 0.5, 0.75, 0.75, 0.25, 0.75, 0.5, 0.75, 0.75 ],
 				"triangles": [ 15, 0, 1, 16, 1, 2, 15, 1, 16, 19, 2, 3, 16, 2, 19, 22, 3, 4, 19, 3, 22, 22, 4, 5, 14, 15, 16, 17, 16, 19, 14, 16, 17, 20, 19, 22, 17, 19, 20, 23, 22, 5, 20, 22, 23, 23, 5, 6, 13, 14, 17, 18, 17, 20, 13, 17, 18, 21, 20, 23, 18, 20, 21, 24, 23, 6, 21, 23, 24, 24, 6, 7, 12, 13, 18, 11, 18, 21, 12, 18, 11, 10, 21, 24, 11, 21, 10, 9, 24, 7, 10, 24, 9, 9, 7, 8 ],
 				"triangles": [ 15, 0, 1, 16, 1, 2, 15, 1, 16, 19, 2, 3, 16, 2, 19, 22, 3, 4, 19, 3, 22, 22, 4, 5, 14, 15, 16, 17, 16, 19, 14, 16, 17, 20, 19, 22, 17, 19, 20, 23, 22, 5, 20, 22, 23, 23, 5, 6, 13, 14, 17, 18, 17, 20, 13, 17, 18, 21, 20, 23, 18, 20, 21, 24, 23, 6, 21, 23, 24, 24, 6, 7, 12, 13, 18, 11, 18, 21, 12, 18, 11, 10, 21, 24, 11, 21, 10, 9, 24, 7, 10, 24, 9, 9, 7, 8 ],
-				"vertices": [ 1, 5, -194.66, 21.29, 1, 1, 5, -102.08, 38.90999, 1, 1, 5, -9.47999, 56.54, 1, 1, 5, 83.08, 74.16, 1, 1, 5, 175.66, 91.79, 1, 1, 5, 181.27, 62.31, 1, 1, 5, 186.88, 32.84, 1, 1, 5, 192.5, 3.38, 1, 1, 5, 198.11, -26.09, 1, 1, 5, 105.51, -43.7, 1, 1, 5, 12.93, -61.33, 1, 1, 5, -79.62999, -78.94999, 1, 1, 5, -172.22, -96.58, 1, 1, 5, -177.83, -67.11, 1, 1, 5, -183.44, -37.63, 1, 1, 5, -189.05, -8.17, 1, 1, 5, -96.47, 9.43999, 1, 1, 5, -90.86, -20.01, 1, 1, 5, -85.25, -49.47, 1, 1, 5, -3.88, 27.05999, 1, 1, 5, 1.72, -2.39, 1, 1, 5, 7.32, -31.86, 1, 1, 5, 88.69, 44.68, 1, 1, 5, 94.3, 15.22, 1, 1, 5, 99.91, -14.22999, 1 ],
+				"vertices": [ 1, 5, -194.67, 21.29, 1, 1, 5, -102.08, 38.92, 1, 1, 5, -9.49, 56.54, 1, 1, 5, 83.09, 74.16, 1, 1, 5, 175.67, 91.79, 1, 1, 5, 181.28, 62.32, 1, 1, 5, 186.89, 32.85, 1, 1, 5, 192.5, 3.38, 1, 1, 5, 198.11, -26.09, 1, 1, 5, 105.52, -43.71, 1, 1, 5, 12.94, -61.33, 1, 1, 5, -79.64, -78.96, 1, 1, 5, -172.23, -96.58, 1, 1, 5, -177.84, -67.11, 1, 1, 5, -183.45, -37.64, 1, 1, 5, -189.06, -8.17, 1, 1, 5, -96.47, 9.45, 1, 1, 5, -90.86, -20.01, 1, 1, 5, -85.25, -49.48, 1, 1, 5, -3.88, 27.07, 1, 1, 5, 1.72, -2.39, 1, 1, 5, 7.33, -31.86, 1, 1, 5, 88.7, 44.69, 1, 1, 5, 94.31, 15.22, 1, 1, 5, 99.92, -14.24, 1 ],
 				"hull": 16,
 				"hull": 16,
 				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 0 ],
 				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 0 ],
 				"width": 377,
 				"width": 377,
@@ -114,9 +107,9 @@
 			"images/spine": {
 			"images/spine": {
 				"type": "mesh",
 				"type": "mesh",
 				"path": "spine",
 				"path": "spine",
-				"uvs": [ 1, 0.50124, 1, 1, 0.72412, 1, 0.49981, 1, 0.2858, 1, 0, 1, 0, 0.50124, 0, 0, 0.49206, 0, 1, 0, 0.56941, 0.57414, 0.84013, 0.50124, 0.6184, 0.22584, 0.20588, 0.20153, 0.19558, 0.67133, 0.39151, 0.86574, 0.3941, 0.41214, 0.3941, 0.12863, 0.7602, 0.19344, 0.76537, 0.59034, 0.74474, 0.84144, 0.57716, 0.81713 ],
+				"uvs": [ 1, 0.50124, 1, 1, 0.72412, 1, 0.49981, 1, 0.28581, 1, 0, 1, 0, 0.50124, 0, 0, 0.49207, 0, 1, 0, 0.56942, 0.57414, 0.84014, 0.50124, 0.61841, 0.22584, 0.20589, 0.20154, 0.19558, 0.67134, 0.39152, 0.86574, 0.3941, 0.41214, 0.3941, 0.12864, 0.76021, 0.19344, 0.76537, 0.59034, 0.74474, 0.84144, 0.57716, 0.81714 ],
 				"triangles": [ 17, 7, 8, 18, 8, 9, 13, 7, 17, 12, 8, 18, 17, 8, 12, 16, 17, 12, 13, 17, 16, 6, 7, 13, 6, 13, 16, 18, 9, 0, 11, 18, 0, 10, 16, 12, 12, 18, 11, 10, 12, 11, 19, 10, 11, 14, 6, 16, 14, 16, 10, 21, 10, 19, 15, 14, 10, 20, 21, 19, 21, 15, 10, 5, 6, 14, 4, 5, 14, 15, 4, 14, 3, 15, 21, 4, 15, 3, 2, 21, 20, 3, 21, 2, 19, 11, 0, 0, 20, 19, 1, 20, 0, 2, 20, 1 ],
 				"triangles": [ 17, 7, 8, 18, 8, 9, 13, 7, 17, 12, 8, 18, 17, 8, 12, 16, 17, 12, 13, 17, 16, 6, 7, 13, 6, 13, 16, 18, 9, 0, 11, 18, 0, 10, 16, 12, 12, 18, 11, 10, 12, 11, 19, 10, 11, 14, 6, 16, 14, 16, 10, 21, 10, 19, 15, 14, 10, 20, 21, 19, 21, 15, 10, 5, 6, 14, 4, 5, 14, 15, 4, 14, 3, 15, 21, 4, 15, 3, 2, 21, 20, 3, 21, 2, 19, 11, 0, 0, 20, 19, 1, 20, 0, 2, 20, 1 ],
-				"vertices": [ 191.41, -1.12, 191.41, -60.97, 87.4, -60.97, 2.82999, -60.97, -77.80999, -60.97, -185.58, -60.97, -185.58, -1.12, -185.58, 59.02, -0.07, 59.02, 191.41, 59.02, 29.09, -9.85, 131.13, -1.12, 47.54, 31.92, -107.94999, 34.84, -111.83999, -21.53, -37.97, -44.86, -37, 9.56, -37, 43.59, 101.01, 35.81, 102.94999, -11.81, 95.18, -41.93, 32, -39.02 ],
+				"vertices": [ 191.41, -1.12, 191.41, -60.97, 87.4, -60.97, 2.84, -60.97, -77.82, -60.97, -185.58, -60.97, -185.58, -1.12, -185.58, 59.02, -0.07, 59.02, 191.41, 59.02, 29.09, -9.86, 131.14, -1.12, 47.55, 31.92, -107.96, 34.84, -111.85, -21.53, -37.97, -44.86, -37, 9.57, -37, 43.59, 101.01, 35.81, 102.96, -11.81, 95.18, -41.94, 32, -39.02 ],
 				"hull": 10,
 				"hull": 10,
 				"edges": [ 10, 12, 12, 14, 14, 16, 16, 18, 2, 0, 0, 18, 6, 8, 8, 10, 2, 4, 4, 6 ],
 				"edges": [ 10, 12, 12, 14, 14, 16, 16, 18, 2, 0, 0, 18, 6, 8, 8, 10, 2, 4, 4, 6 ],
 				"width": 377,
 				"width": 377,
@@ -127,9 +120,9 @@
 			"path": {
 			"path": {
 				"type": "path",
 				"type": "path",
 				"closed": true,
 				"closed": true,
-				"lengths": [ 128.85, 310.24, 465.06, 600.88, 773.97 ],
+				"lengths": [ 128.85, 310.24, 465.06, 600.89, 773.98 ],
 				"vertexCount": 15,
 				"vertexCount": 15,
-				"vertices": [ 258.07, -42.65999, 291.94, -17.53, 326.41, 7.21, 391.41, 2.75, 398.04, 46.72, 399.82, 84.05999, 274.02, 106.4, 236.69, 117.73, 199.36, 129.08, 116.55, 135.11, 84.41, 115.47, 50.34, 94.04, 56.52, 1.48, 89.01, -5.59, 122.87999, -13.56999 ]
+				"vertices": [ 258.08, -42.67, 291.94, -17.53, 326.41, 7.22, 391.41, 2.75, 398.05, 46.72, 399.83, 84.07, 274.03, 106.4, 236.7, 117.74, 199.37, 129.09, 116.55, 135.12, 84.41, 115.47, 50.34, 94.04, 56.53, 1.48, 89.01, -5.59, 122.89, -13.58 ]
 			}
 			}
 		}
 		}
 	}
 	}
@@ -141,21 +134,21 @@
 				"color": [
 				"color": [
 					{ "time": 0, "color": "ffffffff" },
 					{ "time": 0, "color": "ffffffff" },
 					{ "time": 0.4333, "color": "ff0901ff" },
 					{ "time": 0.4333, "color": "ff0901ff" },
-					{ "time": 0.8999, "color": "2dff00ff" },
+					{ "time": 0.9, "color": "2dff00ff" },
 					{ "time": 1.3333, "color": "ffffffff" }
 					{ "time": 1.3333, "color": "ffffffff" }
 				]
 				]
 			},
 			},
 			"images/spine10": {
 			"images/spine10": {
 				"attachment": [
 				"attachment": [
 					{ "time": 0, "name": "images/spine" },
 					{ "time": 0, "name": "images/spine" },
-					{ "time": 0.6666, "name": "images/logo" },
+					{ "time": 0.6667, "name": "images/logo" },
 					{ "time": 1.3333, "name": "images/spine" }
 					{ "time": 1.3333, "name": "images/spine" }
 				]
 				]
 			},
 			},
 			"images/spine12": {
 			"images/spine12": {
 				"attachment": [
 				"attachment": [
 					{ "time": 0, "name": "images/spine" },
 					{ "time": 0, "name": "images/spine" },
-					{ "time": 0.6666, "name": "linkedmesh" }
+					{ "time": 0.6667, "name": "linkedmesh" }
 				]
 				]
 			}
 			}
 		},
 		},
@@ -168,50 +161,50 @@
 						"y": 0,
 						"y": 0,
 						"curve": [ 1, 0, 0, 1 ]
 						"curve": [ 1, 0, 0, 1 ]
 					},
 					},
-					{ "time": 0.6666, "x": 96.98, "y": -151 },
+					{ "time": 0.6667, "x": 96.99, "y": -151 },
 					{ "time": 1.3333, "x": 0, "y": 0 }
 					{ "time": 1.3333, "x": 0, "y": 0 }
 				]
 				]
 			},
 			},
 			"scale": {
 			"scale": {
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.6666, "x": 1, "y": 2.339 },
+					{ "time": 0.6667, "x": 1, "y": 2.34 },
 					{ "time": 1.3333, "x": 1, "y": 1 }
 					{ "time": 1.3333, "x": 1, "y": 1 }
 				]
 				]
 			},
 			},
 			"rotate": {
 			"rotate": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": -125.33 },
+					{ "time": 0.6667, "angle": -125.34 },
 					{ "time": 1.3333, "angle": 0 }
 					{ "time": 1.3333, "angle": 0 }
 				]
 				]
 			},
 			},
 			"shear": {
 			"shear": {
 				"shear": [
 				"shear": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.6666, "x": 29.39, "y": 0 },
+					{ "time": 0.6667, "x": 29.4, "y": 0 },
 					{ "time": 1.3333, "x": 0, "y": 0 }
 					{ "time": 1.3333, "x": 0, "y": 0 }
 				]
 				]
 			},
 			},
 			"transformconstrainttarget": {
 			"transformconstrainttarget": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 0 },
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": -74.59 },
+					{ "time": 0.6667, "angle": -74.6 },
 					{ "time": 1.3333, "angle": 0 }
 					{ "time": 1.3333, "angle": 0 }
 				],
 				],
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.6666, "x": 176.22, "y": -170.33 },
+					{ "time": 0.6667, "x": 176.22, "y": -170.34 },
 					{ "time": 1.3333, "x": 0, "y": 0 }
 					{ "time": 1.3333, "x": 0, "y": 0 }
 				],
 				],
 				"scale": [
 				"scale": [
 					{ "time": 0, "x": 1, "y": 1 },
 					{ "time": 0, "x": 1, "y": 1 },
-					{ "time": 0.6666, "x": 2, "y": 2 },
+					{ "time": 0.6667, "x": 2, "y": 2 },
 					{ "time": 1.3333, "x": 1, "y": 1 }
 					{ "time": 1.3333, "x": 1, "y": 1 }
 				],
 				],
 				"shear": [
 				"shear": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.6666, "x": 23.39, "y": 0 },
+					{ "time": 0.6667, "x": 23.4, "y": 0 },
 					{ "time": 1.3333, "x": 0, "y": 0 }
 					{ "time": 1.3333, "x": 0, "y": 0 }
 				]
 				]
 			}
 			}
@@ -219,7 +212,7 @@
 		"transform": {
 		"transform": {
 			"transformconstraint": [
 			"transformconstraint": [
 				{ "time": 0, "rotateMix": 0.509, "translateMix": 0.509, "scaleMix": 0.509, "shearMix": 0.509 },
 				{ "time": 0, "rotateMix": 0.509, "translateMix": 0.509, "scaleMix": 0.509, "shearMix": 0.509 },
-				{ "time": 0.6666 },
+				{ "time": 0.6667 },
 				{ "time": 1.3333, "rotateMix": 0.5, "translateMix": 0.5, "scaleMix": 0.5, "shearMix": 0.5 }
 				{ "time": 1.3333, "rotateMix": 0.5, "translateMix": 0.5, "scaleMix": 0.5, "shearMix": 0.5 }
 			]
 			]
 		},
 		},
@@ -230,11 +223,11 @@
 					{ "time": 1.3333, "position": 1 }
 					{ "time": 1.3333, "position": 1 }
 				],
 				],
 				"spacing": [
 				"spacing": [
-					{ "time": 0, "spacing": 40.0999 },
+					{ "time": 0, "spacing": 40.1 },
 					{ "time": 1.3333 }
 					{ "time": 1.3333 }
 				],
 				],
 				"mix": [
 				"mix": [
-					{ "time": 0.6666, "rotateMix": 0.4729, "translateMix": 0.4729 },
+					{ "time": 0.6667, "rotateMix": 0.473, "translateMix": 0.473 },
 					{ "time": 1.3333 }
 					{ "time": 1.3333 }
 				]
 				]
 			}
 			}
@@ -245,8 +238,8 @@
 					"images/spine": [
 					"images/spine": [
 						{ "time": 0 },
 						{ "time": 0 },
 						{
 						{
-							"time": 0.6666,
-							"vertices": [ 43.09783, 58.11693, 0, 0, 0, 0, -0.653, -57.46398, -50.93395, -47.01593, -43.098, -24.81398, -43.098, -24.81399, -1.0E-5, 1.0E-5, 0, 1.0E-5, 43.09783, 58.11695, 0, 0, 43.09783, 58.11693, 1.0E-5, -1.0E-5, 0, 0, -43.09797, -24.81399, 0, 1.0E-5, 0, 0, 0, 0, 43.09783, 58.11694, 43.09783, 58.11693 ]
+							"time": 0.6667,
+							"vertices": [ 43.09784, 58.11694, 0, 0, 1.0E-5, 0, -0.65301, -57.46399, -50.93396, -47.01593, -43.09801, -24.81399, -43.09801, -24.814, -2.0E-5, 1.0E-5, 1.0E-5, 1.0E-5, 43.09784, 58.11695, 0, 0, 43.09784, 58.11694, 1.0E-5, -1.0E-5, -1.0E-5, 0, -43.09798, -24.81399, 0, 2.0E-5, 0, -1.0E-5, 0, 0, 43.09784, 58.11694, 43.09784, 58.11694 ]
 						},
 						},
 						{ "time": 1.3333 }
 						{ "time": 1.3333 }
 					]
 					]
@@ -257,16 +250,16 @@
 						{
 						{
 							"time": 0.3333,
 							"time": 0.3333,
 							"offset": 4,
 							"offset": 4,
-							"vertices": [ -9.45232, 83.51329, -3.90007, 44.76634, -3.90007, 44.76634, -3.90007, 44.76634, 0, 0, 0, 0, 0, 0, 0, 0, 5.15667, -29.57762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.90007, 44.76634 ]
+							"vertices": [ -9.45233, 83.5133, -3.90008, 44.76635, -3.90008, 44.76635, -3.90008, 44.76635, 0, 0, 0, 0, 0, 0, 0, 0, 5.15667, -29.57763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.90008, 44.76635 ]
 						},
 						},
-						{ "time": 0.6666 },
+						{ "time": 0.6667 },
 						{
 						{
 							"time": 0.6679,
 							"time": 0.6679,
-							"vertices": [ -1.21159, -14.52715, -2.76092, -7.75683, -4.30998, -0.98668, 2.38385, 9.78289, -1.56903, 5.49315, -2.93443, 6.75127, -4.3001, 8.00932, -5.66552, 9.2677, -7.031, 10.52575, -3.07855, 14.8156, 4.30986, 0.98589, 5.85906, -5.78435, 7.40825, -12.55461, 5.25317, -13.04796, 3.09832, -13.54082, 0.94322, -14.03411, -0.60594, -7.26379, 1.54907, -6.77055, 3.70422, -6.27746, -2.15495, -0.49345, 0, -3.0E-4, 2.15495, 0.49272, 1.01812, 11.04131, -0.34709, 12.29895, -1.71312, 13.557 ]
+							"vertices": [ -1.2116, -14.52716, -2.76092, -7.75683, -4.30999, -0.98669, 2.38385, 9.78289, -1.56903, 5.49316, -2.93444, 6.75128, -4.30011, 8.00933, -5.66552, 9.2677, -7.031, 10.52575, -3.07855, 14.81561, 4.30987, 0.9859, 5.85907, -5.78436, 7.40826, -12.55462, 5.25317, -13.04797, 3.09832, -13.54083, 0.94323, -14.03411, -0.60595, -7.26379, 1.54907, -6.77056, 3.70422, -6.27746, -2.15496, -0.49346, 0, -3.0E-4, 2.15496, 0.49273, 1.01812, 11.04132, -0.3471, 12.29895, -1.71313, 13.557 ]
 						},
 						},
 						{
 						{
 							"time": 1.3333,
 							"time": 1.3333,
-							"vertices": [ -10.57341, 25.16797, -9.16716, 14.48486, -7.76073, 3.80211, 131.25482, 21.05285, 128.23181, -0.04534, 121.51611, 0.91667, 114.80023, 1.8789, 108.08458, 2.84123, 101.36889, 3.80315, 104.39154, 24.90191, -21.3623, 2.0117, -22.76855, 12.69433, -24.17505, 23.37718, -20.7747, 23.82476, -17.37413, 24.27276, -13.97393, 24.72009, -12.56768, 14.03752, -15.96788, 13.58977, -19.36809, 13.14214, -11.16094, 3.35454, -14.56134, 2.90704, -17.96166, 2.45921, 124.53894, 22.01538, 117.82335, 22.97705, 111.10717, 23.93932 ]
+							"vertices": [ -10.57342, 25.16797, -9.16717, 14.48486, -7.76074, 3.80212, 131.25482, 21.05285, 128.23181, -0.04534, 121.51611, 0.91668, 114.80023, 1.8789, 108.08459, 2.84124, 101.3689, 3.80316, 104.39154, 24.90191, -21.3623, 2.01171, -22.76855, 12.69433, -24.17505, 23.37719, -20.77471, 23.82476, -17.37414, 24.27276, -13.97393, 24.72009, -12.56768, 14.03753, -15.96789, 13.58978, -19.3681, 13.14215, -11.16095, 3.35455, -14.56134, 2.90704, -17.96167, 2.45922, 124.53894, 22.01538, 117.82336, 22.97705, 111.10718, 23.93933 ]
 						}
 						}
 					]
 					]
 				}
 				}
@@ -275,7 +268,7 @@
 		"drawOrder": [
 		"drawOrder": [
 			{ "time": 0 },
 			{ "time": 0 },
 			{
 			{
-				"time": 0.6666,
+				"time": 0.6667,
 				"offsets": [
 				"offsets": [
 					{ "slot": "draworder2", "offset": 1 }
 					{ "slot": "draworder2", "offset": 1 }
 				]
 				]

文件差异内容过多而无法显示
+ 16 - 23
spine-corona/data/vine.json


文件差异内容过多而无法显示
+ 218 - 225
spine-libgdx/spine-libgdx-tests/assets/goblins/goblins-mesh.json


二进制
spine-libgdx/spine-libgdx-tests/assets/goblins/goblins-mesh.skel


+ 140 - 147
spine-libgdx/spine-libgdx-tests/assets/goblins/goblins.json

@@ -1,31 +1,24 @@
 {
 {
-"skeleton": {
-	"hash": "9Twfw0ImCCb/C3Vx15ucH1FZP6U",
-	"spine": "3.5.03-beta",
-	"width": 234.01,
-	"height": 354.84,
-	"fps": 30,
-	"images": "./images/"
-},
+"skeleton": { "hash": "r5YD0f6538Hmy0yaaam0Wp73fd8", "spine": "3.6.05-beta", "width": 234.01, "height": 354.84, "images": "./images/" },
 "bones": [
 "bones": [
 	{ "name": "root" },
 	{ "name": "root" },
-	{ "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 },
-	{ "name": "torso", "parent": "hip", "length": 85.82, "rotation": 93.92, "x": -6.42, "y": 1.97 },
-	{ "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.51, "x": 81.67, "y": -6.34 },
-	{ "name": "head", "parent": "neck", "length": 68.28, "rotation": -13.92, "x": 20.93, "y": 11.59 },
-	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.04, "y": -20.38 },
-	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.16, "x": 37.85, "y": -2.34 },
-	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "rotation": -89.09, "x": 14.45, "y": 2.81 },
-	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "rotation": -16.65, "x": 56.34, "y": 0.98 },
+	{ "name": "hip", "parent": "root", "x": 0.65, "y": 114.41 },
+	{ "name": "torso", "parent": "hip", "length": 85.83, "rotation": 93.93, "x": -6.42, "y": 1.98 },
+	{ "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.52, "x": 81.68, "y": -6.35 },
+	{ "name": "head", "parent": "neck", "length": 68.29, "rotation": -13.92, "x": 20.94, "y": 11.59 },
+	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.05, "y": -20.39 },
+	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.17, "x": 37.86, "y": -2.35 },
+	{ "name": "left upper leg", "parent": "hip", "length": 50.4, "rotation": -89.1, "x": 14.45, "y": 2.81 },
+	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.9, "rotation": -16.66, "x": 56.34, "y": 0.99 },
 	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 },
 	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 },
-	{ "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.07 },
-	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 },
-	{ "name": "right shoulder", "parent": "torso", "length": 37.24, "rotation": 133.88, "x": 76.02, "y": 18.14 },
-	{ "name": "right arm", "parent": "right shoulder", "length": 36.74, "rotation": 36.32, "x": 37.6, "y": 0.31 },
-	{ "name": "right upper leg", "parent": "hip", "length": 42.45, "rotation": -97.49, "x": -20.07, "y": -6.83 },
-	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "rotation": -14.34, "x": 42.99, "y": -0.61 },
-	{ "name": "right foot", "parent": "right lower leg", "length": 45.45, "rotation": 110.3, "x": 64.88, "y": 0.04 },
-	{ "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.35, "x": 36.9, "y": 0.34 }
+	{ "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.08 },
+	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.58 },
+	{ "name": "right shoulder", "parent": "torso", "length": 37.25, "rotation": 133.89, "x": 76.02, "y": 18.15 },
+	{ "name": "right arm", "parent": "right shoulder", "length": 36.75, "rotation": 36.33, "x": 37.61, "y": 0.31 },
+	{ "name": "right upper leg", "parent": "hip", "length": 42.46, "rotation": -97.5, "x": -20.08, "y": -6.84 },
+	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.53, "rotation": -14.34, "x": 43, "y": -0.62 },
+	{ "name": "right foot", "parent": "right lower leg", "length": 45.46, "rotation": 110.31, "x": 64.89, "y": 0.04 },
+	{ "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.36, "x": 36.9, "y": 0.35 }
 ],
 ],
 "slots": [
 "slots": [
 	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
 	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
@@ -54,22 +47,22 @@
 "skins": {
 "skins": {
 	"default": {
 	"default": {
 		"left hand item": {
 		"left hand item": {
-			"dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 },
-			"spear": { "x": -4.55, "y": 39.2, "rotation": 13.04, "width": 22, "height": 368 }
+			"dagger": { "x": 7.88, "y": -23.46, "rotation": 10.48, "width": 26, "height": 108 },
+			"spear": { "x": -4.56, "y": 39.2, "rotation": 13.05, "width": 22, "height": 368 }
 		},
 		},
 		"right hand item": {
 		"right hand item": {
-			"dagger": { "x": 6.51, "y": -24.15, "rotation": -8.06, "width": 26, "height": 108 }
+			"dagger": { "x": 6.52, "y": -24.16, "rotation": -8.06, "width": 26, "height": 108 }
 		},
 		},
 		"right hand item top": {
 		"right hand item top": {
-			"shield": { "rotation": 93.49, "width": 70, "height": 72 }
+			"shield": { "rotation": 93.5, "width": 70, "height": 72 }
 		}
 		}
 	},
 	},
 	"goblin": {
 	"goblin": {
 		"eyes": {
 		"eyes": {
-			"eyes closed": { "name": "goblin/eyes-closed", "x": 32.21, "y": -21.27, "rotation": -88.92, "width": 34, "height": 12 }
+			"eyes closed": { "name": "goblin/eyes-closed", "x": 32.22, "y": -21.27, "rotation": -88.93, "width": 34, "height": 12 }
 		},
 		},
 		"head": {
 		"head": {
-			"head": { "name": "goblin/head", "x": 25.73, "y": 2.33, "rotation": -92.29, "width": 103, "height": 66 }
+			"head": { "name": "goblin/head", "x": 25.74, "y": 2.33, "rotation": -92.29, "width": 103, "height": 66 }
 		},
 		},
 		"left arm": {
 		"left arm": {
 			"left arm": {
 			"left arm": {
@@ -78,13 +71,13 @@
 				"y": -1.69,
 				"y": -1.69,
 				"scaleX": 1.057,
 				"scaleX": 1.057,
 				"scaleY": 1.057,
 				"scaleY": 1.057,
-				"rotation": 33.84,
+				"rotation": 33.85,
 				"width": 37,
 				"width": 37,
 				"height": 35
 				"height": 35
 			}
 			}
 		},
 		},
 		"left foot": {
 		"left foot": {
-			"left foot": { "name": "goblin/left-foot", "x": 24.85, "y": 8.74, "rotation": 3.32, "width": 65, "height": 31 }
+			"left foot": { "name": "goblin/left-foot", "x": 24.85, "y": 8.75, "rotation": 3.32, "width": 65, "height": 31 }
 		},
 		},
 		"left hand": {
 		"left hand": {
 			"left hand": {
 			"left hand": {
@@ -99,60 +92,60 @@
 			}
 			}
 		},
 		},
 		"left lower leg": {
 		"left lower leg": {
-			"left lower leg": { "name": "goblin/left-lower-leg", "x": 23.58, "y": -2.06, "rotation": 105.75, "width": 33, "height": 70 }
+			"left lower leg": { "name": "goblin/left-lower-leg", "x": 23.59, "y": -2.07, "rotation": 105.76, "width": 33, "height": 70 }
 		},
 		},
 		"left shoulder": {
 		"left shoulder": {
-			"left shoulder": { "name": "goblin/left-shoulder", "x": 15.56, "y": -2.26, "rotation": 62.01, "width": 29, "height": 44 }
+			"left shoulder": { "name": "goblin/left-shoulder", "x": 15.56, "y": -2.27, "rotation": 62.01, "width": 29, "height": 44 }
 		},
 		},
 		"left upper leg": {
 		"left upper leg": {
-			"left upper leg": { "name": "goblin/left-upper-leg", "x": 29.68, "y": -3.87, "rotation": 89.09, "width": 33, "height": 73 }
+			"left upper leg": { "name": "goblin/left-upper-leg", "x": 29.69, "y": -3.87, "rotation": 89.1, "width": 33, "height": 73 }
 		},
 		},
 		"neck": {
 		"neck": {
-			"neck": { "name": "goblin/neck", "x": 10.1, "y": 0.42, "rotation": -93.69, "width": 36, "height": 41 }
+			"neck": { "name": "goblin/neck", "x": 10.1, "y": 0.42, "rotation": -93.7, "width": 36, "height": 41 }
 		},
 		},
 		"pelvis": {
 		"pelvis": {
-			"pelvis": { "name": "goblin/pelvis", "x": -5.61, "y": 0.76, "width": 62, "height": 43 }
+			"pelvis": { "name": "goblin/pelvis", "x": -5.62, "y": 0.77, "width": 62, "height": 43 }
 		},
 		},
 		"right arm": {
 		"right arm": {
 			"right arm": { "name": "goblin/right-arm", "x": 16.44, "y": -1.04, "rotation": 94.32, "width": 23, "height": 50 }
 			"right arm": { "name": "goblin/right-arm", "x": 16.44, "y": -1.04, "rotation": 94.32, "width": 23, "height": 50 }
 		},
 		},
 		"right foot": {
 		"right foot": {
-			"right foot": { "name": "goblin/right-foot", "x": 23.56, "y": 9.8, "rotation": 1.52, "width": 63, "height": 33 }
+			"right foot": { "name": "goblin/right-foot", "x": 23.57, "y": 9.8, "rotation": 1.53, "width": 63, "height": 33 }
 		},
 		},
 		"right hand": {
 		"right hand": {
-			"right hand": { "name": "goblin/right-hand", "x": 7.88, "y": 2.78, "rotation": 91.96, "width": 36, "height": 37 }
+			"right hand": { "name": "goblin/right-hand", "x": 7.89, "y": 2.78, "rotation": 91.96, "width": 36, "height": 37 }
 		},
 		},
 		"right lower leg": {
 		"right lower leg": {
-			"right lower leg": { "name": "goblin/right-lower-leg", "x": 25.68, "y": -3.15, "rotation": 111.83, "width": 36, "height": 76 }
+			"right lower leg": { "name": "goblin/right-lower-leg", "x": 25.68, "y": -3.16, "rotation": 111.84, "width": 36, "height": 76 }
 		},
 		},
 		"right shoulder": {
 		"right shoulder": {
 			"right shoulder": { "name": "goblin/right-shoulder", "x": 15.68, "y": -1.03, "rotation": 130.65, "width": 39, "height": 45 }
 			"right shoulder": { "name": "goblin/right-shoulder", "x": 15.68, "y": -1.03, "rotation": 130.65, "width": 39, "height": 45 }
 		},
 		},
 		"right upper leg": {
 		"right upper leg": {
-			"right upper leg": { "name": "goblin/right-upper-leg", "x": 20.35, "y": 1.47, "rotation": 97.49, "width": 34, "height": 63 }
+			"right upper leg": { "name": "goblin/right-upper-leg", "x": 20.35, "y": 1.48, "rotation": 97.5, "width": 34, "height": 63 }
 		},
 		},
 		"torso": {
 		"torso": {
-			"torso": { "name": "goblin/torso", "x": 38.09, "y": -3.87, "rotation": -94.95, "width": 68, "height": 96 }
+			"torso": { "name": "goblin/torso", "x": 38.1, "y": -3.87, "rotation": -94.95, "width": 68, "height": 96 }
 		},
 		},
 		"undie straps": {
 		"undie straps": {
-			"undie straps": { "name": "goblin/undie-straps", "x": -3.87, "y": 13.1, "scaleX": 1.089, "width": 55, "height": 19 }
+			"undie straps": { "name": "goblin/undie-straps", "x": -3.88, "y": 13.11, "scaleX": 1.09, "width": 55, "height": 19 }
 		},
 		},
 		"undies": {
 		"undies": {
-			"undies": { "name": "goblin/undies", "x": 6.3, "y": 0.12, "rotation": 0.91, "width": 36, "height": 29 }
+			"undies": { "name": "goblin/undies", "x": 6.3, "y": 0.13, "rotation": 0.92, "width": 36, "height": 29 }
 		}
 		}
 	},
 	},
 	"goblingirl": {
 	"goblingirl": {
 		"eyes": {
 		"eyes": {
-			"eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 }
+			"eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.55, "rotation": -87.05, "width": 37, "height": 21 }
 		},
 		},
 		"head": {
 		"head": {
-			"head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 }
+			"head": { "name": "goblingirl/head", "x": 27.72, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 }
 		},
 		},
 		"left arm": {
 		"left arm": {
-			"left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 }
+			"left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.43, "rotation": 33.05, "width": 37, "height": 35 }
 		},
 		},
 		"left foot": {
 		"left foot": {
-			"left foot": { "name": "goblingirl/left-foot", "x": 25.17, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 }
+			"left foot": { "name": "goblingirl/left-foot", "x": 25.18, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 }
 		},
 		},
 		"left hand": {
 		"left hand": {
 			"left hand": {
 			"left hand": {
@@ -161,52 +154,52 @@
 				"y": 2.39,
 				"y": 2.39,
 				"scaleX": 0.896,
 				"scaleX": 0.896,
 				"scaleY": 0.896,
 				"scaleY": 0.896,
-				"rotation": 30.34,
+				"rotation": 30.35,
 				"width": 35,
 				"width": 35,
 				"height": 40
 				"height": 40
 			}
 			}
 		},
 		},
 		"left lower leg": {
 		"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 lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.61, "rotation": 105.76, "width": 33, "height": 70 }
 		},
 		},
 		"left shoulder": {
 		"left shoulder": {
-			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 }
+			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.81, "y": -0.43, "rotation": 61.22, "width": 28, "height": 46 }
 		},
 		},
 		"left upper leg": {
 		"left upper leg": {
-			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 }
+			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.22, "y": -2.95, "rotation": 89.1, "width": 33, "height": 70 }
 		},
 		},
 		"neck": {
 		"neck": {
-			"neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 }
+			"neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.15, "rotation": -98.86, "width": 35, "height": 41 }
 		},
 		},
 		"pelvis": {
 		"pelvis": {
-			"pelvis": { "name": "goblingirl/pelvis", "x": -3.87, "y": 3.18, "width": 62, "height": 43 }
+			"pelvis": { "name": "goblingirl/pelvis", "x": -3.88, "y": 3.19, "width": 62, "height": 43 }
 		},
 		},
 		"right arm": {
 		"right arm": {
-			"right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 }
+			"right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.53, "width": 28, "height": 50 }
 		},
 		},
 		"right foot": {
 		"right foot": {
-			"right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.52, "width": 63, "height": 33 }
+			"right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.53, "width": 63, "height": 33 }
 		},
 		},
 		"right hand": {
 		"right hand": {
-			"right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
+			"right hand": { "name": "goblingirl/right-hand", "x": 7.22, "y": 3.44, "rotation": 91.17, "width": 36, "height": 37 }
 		},
 		},
 		"right lower leg": {
 		"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 lower leg": { "name": "goblingirl/right-lower-leg", "x": 26.15, "y": -3.28, "rotation": 111.84, "width": 36, "height": 76 }
 		},
 		},
 		"right shoulder": {
 		"right shoulder": {
-			"right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 }
+			"right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.46, "rotation": 129.85, "width": 39, "height": 45 }
 		},
 		},
 		"right upper leg": {
 		"right upper leg": {
-			"right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.69, "y": 2.13, "rotation": 97.49, "width": 34, "height": 63 }
+			"right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.7, "y": 2.13, "rotation": 97.5, "width": 34, "height": 63 }
 		},
 		},
 		"torso": {
 		"torso": {
-			"torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 }
+			"torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.75, "width": 68, "height": 96 }
 		},
 		},
 		"undie straps": {
 		"undie straps": {
-			"undie straps": { "name": "goblingirl/undie-straps", "x": -1.51, "y": 14.18, "width": 55, "height": 19 }
+			"undie straps": { "name": "goblingirl/undie-straps", "x": -1.52, "y": 14.19, "width": 55, "height": 19 }
 		},
 		},
 		"undies": {
 		"undies": {
-			"undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.7, "width": 36, "height": 29 }
+			"undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.71, "width": 36, "height": 29 }
 		}
 		}
 	}
 	}
 },
 },
@@ -215,7 +208,7 @@
 		"slots": {
 		"slots": {
 			"eyes": {
 			"eyes": {
 				"attachment": [
 				"attachment": [
-					{ "time": 0.6999, "name": "eyes closed" },
+					{ "time": 0.7, "name": "eyes closed" },
 					{ "time": 0.8, "name": null }
 					{ "time": 0.8, "name": null }
 				]
 				]
 			}
 			}
@@ -223,62 +216,62 @@
 		"bones": {
 		"bones": {
 			"left upper leg": {
 			"left upper leg": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": -26.55 },
-					{ "time": 0.1333, "angle": -8.78 },
+					{ "time": 0, "angle": -26.56 },
+					{ "time": 0.1333, "angle": -8.79 },
 					{ "time": 0.2333, "angle": 9.51 },
 					{ "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.7 },
-					{ "time": 0.8666, "angle": -21.19 },
-					{ "time": 1, "angle": -26.55 }
+					{ "time": 0.3667, "angle": 30.74 },
+					{ "time": 0.5, "angle": 25.34 },
+					{ "time": 0.6333, "angle": 26.12 },
+					{ "time": 0.7333, "angle": -7.71 },
+					{ "time": 0.8667, "angle": -21.19 },
+					{ "time": 1, "angle": -26.56 }
 				],
 				],
 				"translate": [
 				"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 }
+					{ "time": 0, "x": -1.32, "y": 1.71 },
+					{ "time": 0.3667, "x": -0.06, "y": 2.43 },
+					{ "time": 1, "x": -1.32, "y": 1.71 }
 				]
 				]
 			},
 			},
 			"right upper leg": {
 			"right upper leg": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 42.45 },
 					{ "time": 0, "angle": 42.45 },
-					{ "time": 0.1333, "angle": 52.1 },
-					{ "time": 0.2333, "angle": 8.53 },
-					{ "time": 0.5, "angle": -16.93 },
-					{ "time": 0.6333, "angle": 1.89 },
+					{ "time": 0.1333, "angle": 52.11 },
+					{ "time": 0.2333, "angle": 8.54 },
+					{ "time": 0.5, "angle": -16.94 },
+					{ "time": 0.6333, "angle": 1.9 },
 					{
 					{
 						"time": 0.7333,
 						"time": 0.7333,
 						"angle": 28.06,
 						"angle": 28.06,
-						"curve": [ 0.462, 0.11, 1, 1 ]
+						"curve": [ 0.463, 0.12, 1, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.8666,
-						"angle": 58.68,
+						"time": 0.8667,
+						"angle": 58.69,
 						"curve": [ 0.5, 0.02, 1, 1 ]
 						"curve": [ 0.5, 0.02, 1, 1 ]
 					},
 					},
 					{ "time": 1, "angle": 42.45 }
 					{ "time": 1, "angle": 42.45 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0, "x": 6.23, "y": 0 },
+					{ "time": 0, "x": 6.24, "y": 0 },
 					{ "time": 0.2333, "x": 2.14, "y": 2.4 },
 					{ "time": 0.2333, "x": 2.14, "y": 2.4 },
 					{ "time": 0.5, "x": 2.44, "y": 4.8 },
 					{ "time": 0.5, "x": 2.44, "y": 4.8 },
-					{ "time": 1, "x": 6.23, "y": 0 }
+					{ "time": 1, "x": 6.24, "y": 0 }
 				]
 				]
 			},
 			},
 			"left lower leg": {
 			"left lower leg": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": -22.98 },
 					{ "time": 0, "angle": -22.98 },
-					{ "time": 0.1333, "angle": -63.5 },
+					{ "time": 0.1333, "angle": -63.51 },
 					{ "time": 0.2333, "angle": -73.76 },
 					{ "time": 0.2333, "angle": -73.76 },
-					{ "time": 0.5, "angle": 5.11 },
-					{ "time": 0.6333, "angle": -28.29 },
+					{ "time": 0.5, "angle": 5.12 },
+					{ "time": 0.6333, "angle": -28.3 },
 					{ "time": 0.7333, "angle": 4.08 },
 					{ "time": 0.7333, "angle": 4.08 },
-					{ "time": 0.8666, "angle": 3.53 },
+					{ "time": 0.8667, "angle": 3.53 },
 					{ "time": 1, "angle": -22.98 }
 					{ "time": 1, "angle": -22.98 }
 				],
 				],
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0 },
 					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.2333, "x": 2.55, "y": -0.47 },
+					{ "time": 0.2333, "x": 2.56, "y": -0.47 },
 					{ "time": 0.5, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0.5, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 1, "x": 0, "y": 0 }
 					{ "time": 1, "x": 0, "y": 0 }
 				]
 				]
@@ -288,11 +281,11 @@
 					{ "time": 0, "angle": -3.69 },
 					{ "time": 0, "angle": -3.69 },
 					{ "time": 0.1333, "angle": -10.42 },
 					{ "time": 0.1333, "angle": -10.42 },
 					{ "time": 0.2333, "angle": -5.01 },
 					{ "time": 0.2333, "angle": -5.01 },
-					{ "time": 0.3666, "angle": 3.87 },
-					{ "time": 0.5, "angle": -3.87 },
+					{ "time": 0.3667, "angle": 3.87 },
+					{ "time": 0.5, "angle": -3.88 },
 					{ "time": 0.6333, "angle": 2.78 },
 					{ "time": 0.6333, "angle": 2.78 },
 					{ "time": 0.7333, "angle": 1.68 },
 					{ "time": 0.7333, "angle": 1.68 },
-					{ "time": 0.8666, "angle": -8.54 },
+					{ "time": 0.8667, "angle": -8.54 },
 					{ "time": 1, "angle": -3.69 }
 					{ "time": 1, "angle": -3.69 }
 				]
 				]
 			},
 			},
@@ -311,70 +304,70 @@
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": -4.02,
-						"curve": [ 0.267, 0, 0.804, 0.99 ]
+						"angle": -4.03,
+						"curve": [ 0.267, 0.01, 0.805, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 0.6333,
 						"time": 0.6333,
-						"angle": 19.78,
+						"angle": 19.79,
 						"curve": [ 0.307, 0, 0.787, 0.99 ]
 						"curve": [ 0.307, 0, 0.787, 0.99 ]
 					},
 					},
-					{ "time": 1, "angle": -4.02 }
+					{ "time": 1, "angle": -4.03 }
 				]
 				]
 			},
 			},
 			"right hand": {
 			"right hand": {
 				"rotate": [
 				"rotate": [
-					{ "time": 0, "angle": 8.98 },
+					{ "time": 0, "angle": 8.99 },
 					{ "time": 0.6333, "angle": 0.51 },
 					{ "time": 0.6333, "angle": 0.51 },
-					{ "time": 1, "angle": 8.98 }
+					{ "time": 1, "angle": 8.99 }
 				]
 				]
 			},
 			},
 			"left shoulder": {
 			"left shoulder": {
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": 6.25,
-						"curve": [ 0.339, 0, 0.683, 1 ]
+						"angle": 6.26,
+						"curve": [ 0.339, 0, 0.684, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
-						"angle": -11.78,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
+						"angle": -11.79,
+						"curve": [ 0.282, 0, 0.687, 0.99 ]
 					},
 					},
-					{ "time": 1, "angle": 6.25 }
+					{ "time": 1, "angle": 6.26 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0, "x": 1.15, "y": 0.23 }
+					{ "time": 0, "x": 1.15, "y": 0.24 }
 				]
 				]
 			},
 			},
 			"left hand": {
 			"left hand": {
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": -21.23,
-						"curve": [ 0.295, 0, 0.755, 0.98 ]
+						"angle": -21.24,
+						"curve": [ 0.296, 0, 0.756, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
 						"angle": -27.28,
 						"angle": -27.28,
 						"curve": [ 0.241, 0, 0.75, 0.97 ]
 						"curve": [ 0.241, 0, 0.75, 0.97 ]
 					},
 					},
-					{ "time": 1, "angle": -21.23 }
+					{ "time": 1, "angle": -21.24 }
 				]
 				]
 			},
 			},
 			"left arm": {
 			"left arm": {
 				"rotate": [
 				"rotate": [
 					{
 					{
 						"time": 0,
 						"time": 0,
-						"angle": 28.37,
-						"curve": [ 0.339, 0, 0.683, 1 ]
+						"angle": 28.38,
+						"curve": [ 0.339, 0, 0.684, 1 ]
 					},
 					},
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
 						"angle": 60.09,
 						"angle": 60.09,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
+						"curve": [ 0.282, 0, 0.687, 0.99 ]
 					},
 					},
-					{ "time": 1, "angle": 28.37 }
+					{ "time": 1, "angle": 28.38 }
 				]
 				]
 			},
 			},
 			"torso": {
 			"torso": {
@@ -382,38 +375,38 @@
 					{ "time": 0, "angle": -10.28 },
 					{ "time": 0, "angle": -10.28 },
 					{
 					{
 						"time": 0.1333,
 						"time": 0.1333,
-						"angle": -15.38,
-						"curve": [ 0.545, 0, 0.818, 1 ]
+						"angle": -15.39,
+						"curve": [ 0.546, 0.01, 0.819, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.3666,
+						"time": 0.3667,
 						"angle": -9.78,
 						"angle": -9.78,
-						"curve": [ 0.58, 0.17, 0.669, 0.99 ]
+						"curve": [ 0.58, 0.17, 0.67, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 0.6333,
 						"time": 0.6333,
 						"angle": -15.75,
 						"angle": -15.75,
-						"curve": [ 0.235, 0.01, 0.795, 1 ]
+						"curve": [ 0.236, 0.01, 0.796, 1 ]
 					},
 					},
 					{
 					{
-						"time": 0.8666,
-						"angle": -7.06,
-						"curve": [ 0.209, 0, 0.816, 0.98 ]
+						"time": 0.8667,
+						"angle": -7.07,
+						"curve": [ 0.21, 0, 0.816, 0.99 ]
 					},
 					},
 					{ "time": 1, "angle": -10.28 }
 					{ "time": 1, "angle": -10.28 }
 				],
 				],
 				"translate": [
 				"translate": [
-					{ "time": 0, "x": -1.29, "y": 1.68 }
+					{ "time": 0, "x": -1.29, "y": 1.69 }
 				]
 				]
 			},
 			},
 			"right foot": {
 			"right foot": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": -5.25 },
 					{ "time": 0, "angle": -5.25 },
 					{ "time": 0.2333, "angle": -1.91 },
 					{ "time": 0.2333, "angle": -1.91 },
-					{ "time": 0.3666, "angle": -6.45 },
-					{ "time": 0.5, "angle": -5.39 },
-					{ "time": 0.7333, "angle": -11.68 },
-					{ "time": 0.8666, "angle": 0.46 },
+					{ "time": 0.3667, "angle": -6.45 },
+					{ "time": 0.5, "angle": -5.4 },
+					{ "time": 0.7333, "angle": -11.69 },
+					{ "time": 0.8667, "angle": 0.46 },
 					{ "time": 1, "angle": -5.25 }
 					{ "time": 1, "angle": -5.25 }
 				]
 				]
 			},
 			},
@@ -422,12 +415,12 @@
 					{
 					{
 						"time": 0,
 						"time": 0,
 						"angle": -3.39,
 						"angle": -3.39,
-						"curve": [ 0.316, 0.01, 0.741, 0.98 ]
+						"curve": [ 0.316, 0.02, 0.741, 0.99 ]
 					},
 					},
 					{
 					{
 						"time": 0.1333,
 						"time": 0.1333,
 						"angle": -45.53,
 						"angle": -45.53,
-						"curve": [ 0.229, 0, 0.738, 0.97 ]
+						"curve": [ 0.23, 0, 0.739, 0.97 ]
 					},
 					},
 					{ "time": 0.2333, "angle": -4.83 },
 					{ "time": 0.2333, "angle": -4.83 },
 					{ "time": 0.5, "angle": -19.53 },
 					{ "time": 0.5, "angle": -19.53 },
@@ -442,7 +435,7 @@
 				"translate": [
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0.5, "x": 0, "y": 0 },
 					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.6333, "x": 2.18, "y": 0.21 },
+					{ "time": 0.6333, "x": 2.19, "y": 0.21 },
 					{ "time": 1, "x": 0, "y": 0 }
 					{ "time": 1, "x": 0, "y": 0 }
 				]
 				]
 			},
 			},
@@ -456,31 +449,31 @@
 					{
 					{
 						"time": 0.1333,
 						"time": 0.1333,
 						"x": 0,
 						"x": 0,
-						"y": -7.05,
-						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
+						"y": -7.06,
+						"curve": [ 0.359, 0.47, 0.647, 0.75 ]
 					},
 					},
-					{ "time": 0.3666, "x": 0, "y": 6.78 },
-					{ "time": 0.5, "x": 0, "y": -6.13 },
+					{ "time": 0.3667, "x": 0, "y": 6.78 },
+					{ "time": 0.5, "x": 0, "y": -6.14 },
 					{
 					{
 						"time": 0.6333,
 						"time": 0.6333,
 						"x": 0,
 						"x": 0,
-						"y": -7.05,
-						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
+						"y": -7.06,
+						"curve": [ 0.359, 0.47, 0.647, 0.75 ]
 					},
 					},
-					{ "time": 0.8666, "x": 0, "y": 6.78 },
+					{ "time": 0.8667, "x": 0, "y": 6.78 },
 					{ "time": 1, "x": 0, "y": -4.16 }
 					{ "time": 1, "x": 0, "y": -4.16 }
 				]
 				]
 			},
 			},
 			"neck": {
 			"neck": {
 				"rotate": [
 				"rotate": [
 					{ "time": 0, "angle": 3.6 },
 					{ "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.1333, "angle": 17.5 },
+					{ "time": 0.2333, "angle": 6.11 },
+					{ "time": 0.3667, "angle": 3.46 },
+					{ "time": 0.5, "angle": 5.18 },
 					{ "time": 0.6333, "angle": 18.36 },
 					{ "time": 0.6333, "angle": 18.36 },
 					{ "time": 0.7333, "angle": 6.09 },
 					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
+					{ "time": 0.8667, "angle": 2.29 },
 					{ "time": 1, "angle": 3.6 }
 					{ "time": 1, "angle": 3.6 }
 				]
 				]
 			},
 			},
@@ -489,19 +482,19 @@
 					{
 					{
 						"time": 0,
 						"time": 0,
 						"angle": 3.6,
 						"angle": 3.6,
-						"curve": [ 0, 0, 0.704, 1.17 ]
+						"curve": [ 0, 0, 0.704, 1.18 ]
 					},
 					},
-					{ "time": 0.1333, "angle": -0.2 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
+					{ "time": 0.1333, "angle": -0.21 },
+					{ "time": 0.2333, "angle": 6.11 },
+					{ "time": 0.3667, "angle": 3.46 },
 					{
 					{
 						"time": 0.5,
 						"time": 0.5,
-						"angle": 5.17,
-						"curve": [ 0, 0, 0.704, 1.61 ]
+						"angle": 5.18,
+						"curve": [ 0, 0, 0.704, 1.62 ]
 					},
 					},
-					{ "time": 0.6666, "angle": 1.1 },
+					{ "time": 0.6667, "angle": 1.11 },
 					{ "time": 0.7333, "angle": 6.09 },
 					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
+					{ "time": 0.8667, "angle": 2.29 },
 					{ "time": 1, "angle": 3.6 }
 					{ "time": 1, "angle": 3.6 }
 				]
 				]
 			}
 			}

二进制
spine-libgdx/spine-libgdx-tests/assets/goblins/goblins.skel


文件差异内容过多而无法显示
+ 102 - 109
spine-libgdx/spine-libgdx-tests/assets/raptor/raptor.json


二进制
spine-libgdx/spine-libgdx-tests/assets/raptor/raptor.skel


文件差异内容过多而无法显示
+ 306 - 313
spine-libgdx/spine-libgdx-tests/assets/spineboy-old/spineboy-old.json


二进制
spine-libgdx/spine-libgdx-tests/assets/spineboy-old/spineboy-old.skel


文件差异内容过多而无法显示
+ 49 - 56
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-hover.json


二进制
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-hover.skel


文件差异内容过多而无法显示
+ 45 - 45
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-mesh.json


二进制
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-mesh.skel


文件差异内容过多而无法显示
+ 236 - 243
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy.json


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