Browse Source

[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 years ago
parent
commit
fe8eae4b8e
100 changed files with 6356 additions and 6029 deletions
  1. 249 256
      examples/alien/export/alien.json
  2. BIN
      examples/alien/export/alien.skel
  3. 132 132
      examples/dragon/export/dragon.json
  4. BIN
      examples/dragon/export/dragon.skel
  5. 218 225
      examples/goblins/export/goblins-mesh.json
  6. BIN
      examples/goblins/export/goblins-mesh.skel
  7. 140 147
      examples/goblins/export/goblins.json
  8. BIN
      examples/goblins/export/goblins.skel
  9. 30 37
      examples/hero/export/hero-mesh.json
  10. BIN
      examples/hero/export/hero-mesh.skel
  11. 235 242
      examples/hero/export/hero.json
  12. BIN
      examples/hero/export/hero.skel
  13. 141 148
      examples/powerup/export/powerup.json
  14. BIN
      examples/powerup/export/powerup.skel
  15. 102 109
      examples/raptor/export/raptor.json
  16. BIN
      examples/raptor/export/raptor.skel
  17. 292 299
      examples/speedy/export/speedy.json
  18. BIN
      examples/speedy/export/speedy.skel
  19. 306 313
      examples/spineboy-old/export/spineboy-old.json
  20. BIN
      examples/spineboy-old/export/spineboy-old.skel
  21. 49 56
      examples/spineboy/export/spineboy-hover.json
  22. BIN
      examples/spineboy/export/spineboy-hover.skel
  23. 45 45
      examples/spineboy/export/spineboy-mesh.json
  24. BIN
      examples/spineboy/export/spineboy-mesh.skel
  25. 236 243
      examples/spineboy/export/spineboy.json
  26. BIN
      examples/spineboy/export/spineboy.skel
  27. 64 71
      examples/spinosaurus/export/spinosaurus.json
  28. BIN
      examples/spinosaurus/export/spinosaurus.skel
  29. 56 71
      examples/stretchyman/export/stretchyman.json
  30. BIN
      examples/stretchyman/export/stretchyman.skel
  31. 27 36
      examples/tank/export/tank.json
  32. BIN
      examples/tank/export/tank.skel
  33. BIN
      examples/tank/tank.spine
  34. 34 41
      examples/test/export/test.json
  35. BIN
      examples/test/export/test.skel
  36. 16 23
      examples/vine/export/vine.json
  37. BIN
      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. BIN
      spine-libgdx/spine-libgdx-tests/assets/goblins/goblins-mesh.skel
  90. 140 147
      spine-libgdx/spine-libgdx-tests/assets/goblins/goblins.json
  91. BIN
      spine-libgdx/spine-libgdx-tests/assets/goblins/goblins.skel
  92. 102 109
      spine-libgdx/spine-libgdx-tests/assets/raptor/raptor.json
  93. BIN
      spine-libgdx/spine-libgdx-tests/assets/raptor/raptor.skel
  94. 306 313
      spine-libgdx/spine-libgdx-tests/assets/spineboy-old/spineboy-old.json
  95. BIN
      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. BIN
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-hover.skel
  98. 45 45
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-mesh.json
  99. BIN
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-mesh.skel
  100. 236 243
      spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy.json

File diff suppressed because it is too large
+ 249 - 256
examples/alien/export/alien.json


BIN
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": [
 	{ "name": "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_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_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": "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": [
 	{ "name": "L_rear_leg", "bone": "L_rear_leg", "attachment": "L_rear_leg" },
@@ -71,113 +71,113 @@
 "skins": {
 	"default": {
 		"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": { "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": {
-			"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": {
-			"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": {
-			"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": {
-			"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": { "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": { "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_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": { "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": { "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": {
-			"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": {
-			"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": {
-			"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": { "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": { "x": 53.25, "y": 12.58, "rotation": 103.29, "width": 91, "height": 149 }
 		},
 		"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": {
-			"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": {
 			"rear-toe": { "x": 47.46, "y": -7.64, "rotation": 134.34, "width": 109, "height": 77 }
 		},
 		"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": { "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": { "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": { "x": 66.55, "y": 7.32, "rotation": 30.01, "width": 214, "height": 146 }
 		},
 		"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": { "y": -176.72, "width": 897, "height": 92 }
 		},
 		"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": {
-			"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": {
-			"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": {
-			"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": {
-			"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": {
-			"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": {
 				"attachment": [
 					{ "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.2, "name": "L_wing04" },
-					{ "time": 0.2666, "name": "L_wing05" },
+					{ "time": 0.2667, "name": "L_wing05" },
 					{ "time": 0.3333, "name": "L_wing06" },
 					{ "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.6, "name": "L_wing01" },
 					{ "time": 0.7333, "name": "L_wing02" },
 					{ "time": 0.8, "name": "L_wing03" },
 					{ "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.9666, "name": "L_wing08" },
+					{ "time": 0.9667, "name": "L_wing08" },
 					{ "time": 1, "name": "L_wing01" }
 				]
 			},
 			"R_wing": {
 				"attachment": [
 					{ "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.2, "name": "R_wing04" },
-					{ "time": 0.2666, "name": "R_wing05" },
+					{ "time": 0.2667, "name": "R_wing05" },
 					{ "time": 0.3333, "name": "R_wing06" },
 					{ "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.6, "name": "R_wing01" },
 					{ "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.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.9666, "name": "R_wing08" },
+					{ "time": 0.9667, "name": "R_wing08" },
 					{ "time": 1, "name": "R_wing01" }
 				]
 			}
@@ -234,9 +234,9 @@
 			"back": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 17.39 },
+					{ "time": 0.1667, "angle": 17.39 },
 					{ "time": 0.5, "angle": 0 },
-					{ "time": 0.8333, "angle": 7 },
+					{ "time": 0.8333, "angle": 7.01 },
 					{ "time": 1, "angle": 0 }
 				],
 				"translate": [
@@ -253,9 +253,9 @@
 			"neck": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -8.18 },
+					{ "time": 0.1667, "angle": -8.18 },
 					{ "time": 0.3333, "angle": -23.16 },
-					{ "time": 0.5, "angle": -18.01 },
+					{ "time": 0.5, "angle": -18.02 },
 					{ "time": 1, "angle": 0 }
 				],
 				"translate": [
@@ -289,10 +289,10 @@
 			"tail1": {
 				"rotate": [
 					{ "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": 1, "angle": 0 }
 				],
@@ -327,10 +327,10 @@
 			"tail2": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -1.12 },
+					{ "time": 0.1667, "angle": -1.13 },
 					{ "time": 0.3333, "angle": 10.48 },
 					{ "time": 0.5, "angle": 7.89 },
-					{ "time": 0.8333, "angle": -10.38 },
+					{ "time": 0.8333, "angle": -10.39 },
 					{ "time": 1, "angle": 0 }
 				],
 				"translate": [
@@ -347,10 +347,10 @@
 			"tail3": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 8.24 },
+					{ "time": 0.1667, "angle": 8.25 },
 					{ "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 }
 				],
 				"translate": [
@@ -367,7 +367,7 @@
 			"tail4": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 17.46 },
+					{ "time": 0.1667, "angle": 17.47 },
 					{ "time": 0.3333, "angle": 22.15 },
 					{ "time": 0.5, "angle": 22.76 },
 					{ "time": 0.8333, "angle": -4.37 },
@@ -387,10 +387,10 @@
 			"tail5": {
 				"rotate": [
 					{ "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.8333, "angle": -1.27 },
+					{ "time": 0.8333, "angle": -1.28 },
 					{ "time": 1, "angle": 0 }
 				],
 				"translate": [
@@ -407,7 +407,7 @@
 			"tail6": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 45.99 },
+					{ "time": 0.1667, "angle": 46 },
 					{ "time": 0.4, "angle": 43.53 },
 					{ "time": 0.5, "angle": 61.79 },
 					{ "time": 0.8333, "angle": 13.28 },
@@ -427,8 +427,8 @@
 			"R_rear_leg": {
 				"rotate": [
 					{ "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 }
 				],
 				"translate": [
@@ -498,9 +498,9 @@
 					{
 						"time": 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 }
 				],
 				"translate": [
@@ -519,11 +519,11 @@
 					{
 						"time": 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.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 }
 				],
 				"translate": [
@@ -540,7 +540,7 @@
 			"L_front_thigh": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -19.18 },
+					{ "time": 0.1667, "angle": -19.19 },
 					{ "time": 0.3333, "angle": -32.02 },
 					{ "time": 0.5, "angle": -19.62 },
 					{ "time": 1, "angle": 0 }
@@ -559,7 +559,7 @@
 			"R_front_thigh": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -12.96 },
+					{ "time": 0.1667, "angle": -12.96 },
 					{ "time": 0.5, "angle": 16.2 },
 					{ "time": 1, "angle": 0 }
 				],
@@ -577,7 +577,7 @@
 			"L_front_leg": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 37.77 },
+					{ "time": 0.1667, "angle": 37.77 },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 1, "angle": 0 }
 				],
@@ -595,7 +595,7 @@
 			"L_front_toe1": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": -16.08 },
+					{ "time": 0.1667, "angle": -16.09 },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 1, "angle": 0 }
 				],
@@ -623,14 +623,14 @@
 				],
 				"scale": [
 					{ "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 }
 				]
 			},
 			"L_front_toe4": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.5, "angle": 26.51 },
+					{ "time": 0.5, "angle": 26.52 },
 					{ "time": 1, "angle": 0 }
 				],
 				"translate": [
@@ -640,7 +640,7 @@
 				],
 				"scale": [
 					{ "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 }
 				]
 			},
@@ -657,14 +657,14 @@
 				],
 				"scale": [
 					{ "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 }
 				]
 			},
 			"R_front_leg": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 26.07 },
+					{ "time": 0.1667, "angle": 26.07 },
 					{ "time": 0.5, "angle": -21.6 },
 					{ "time": 1, "angle": 0 }
 				],
@@ -682,8 +682,8 @@
 			"R_front_toe1": {
 				"rotate": [
 					{ "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 }
 				],
 				"translate": [
@@ -700,7 +700,7 @@
 			"R_front_toe2": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 24.89 },
+					{ "time": 0.1667, "angle": 24.9 },
 					{ "time": 0.5, "angle": 23.16 },
 					{ "time": 1, "angle": 0 }
 				],
@@ -711,14 +711,14 @@
 				],
 				"scale": [
 					{ "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 }
 				]
 			},
 			"R_front_toe3": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.1666, "angle": 11.01 },
+					{ "time": 0.1667, "angle": 11.01 },
 					{ "time": 0.5, "angle": 0, "curve": "stepped" },
 					{ "time": 1, "angle": 0 }
 				],
@@ -729,15 +729,15 @@
 				],
 				"scale": [
 					{ "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 }
 				]
 			},
 			"L_rear_leg": {
 				"rotate": [
 					{ "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 }
 				],
 				"translate": [
@@ -752,13 +752,13 @@
 					{
 						"time": 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.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 }
 				],
@@ -767,13 +767,13 @@
 						"time": 0,
 						"x": 0,
 						"y": 0,
-						"curve": [ 0.33, 1, 0.816, 1.33 ]
+						"curve": [ 0.33, 1, 0.816, 1.34 ]
 					},
 					{
 						"time": 0.5,
-						"x": 0,
+						"x": -0.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 }
 				]

BIN
examples/dragon/export/dragon.skel


File diff suppressed because it is too large
+ 218 - 225
examples/goblins/export/goblins-mesh.json


BIN
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": [
 	{ "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 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": [
 	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
@@ -54,22 +47,22 @@
 "skins": {
 	"default": {
 		"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": {
-			"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": {
-			"shield": { "rotation": 93.49, "width": 70, "height": 72 }
+			"shield": { "rotation": 93.5, "width": 70, "height": 72 }
 		}
 	},
 	"goblin": {
 		"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": { "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": {
@@ -78,13 +71,13 @@
 				"y": -1.69,
 				"scaleX": 1.057,
 				"scaleY": 1.057,
-				"rotation": 33.84,
+				"rotation": 33.85,
 				"width": 37,
 				"height": 35
 			}
 		},
 		"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": {
@@ -99,60 +92,60 @@
 			}
 		},
 		"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": { "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": { "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": { "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": { "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": { "name": "goblin/right-arm", "x": 16.44, "y": -1.04, "rotation": 94.32, "width": 23, "height": 50 }
 		},
 		"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": { "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": { "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": { "name": "goblin/right-shoulder", "x": 15.68, "y": -1.03, "rotation": 130.65, "width": 39, "height": 45 }
 		},
 		"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": { "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": { "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": { "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": {
 		"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": { "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": { "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": { "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": {
@@ -161,52 +154,52 @@
 				"y": 2.39,
 				"scaleX": 0.896,
 				"scaleY": 0.896,
-				"rotation": 30.34,
+				"rotation": 30.35,
 				"width": 35,
 				"height": 40
 			}
 		},
 		"left lower leg": {
-			"left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.6, "rotation": 105.75, "width": 33, "height": 70 }
+			"left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.61, "rotation": 105.76, "width": 33, "height": 70 }
 		},
 		"left shoulder": {
-			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 }
+			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.81, "y": -0.43, "rotation": 61.22, "width": 28, "height": 46 }
 		},
 		"left upper leg": {
-			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 }
+			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.22, "y": -2.95, "rotation": 89.1, "width": 33, "height": 70 }
 		},
 		"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": { "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": { "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": { "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": { "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": { "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": { "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": { "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": { "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": { "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": { "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": {
 			"eyes": {
 				"attachment": [
-					{ "time": 0.6999, "name": "eyes closed" },
+					{ "time": 0.7, "name": "eyes closed" },
 					{ "time": 0.8, "name": null }
 				]
 			}
@@ -223,62 +216,62 @@
 		"bones": {
 			"left upper leg": {
 				"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.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": [
-					{ "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": {
 				"rotate": [
 					{ "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,
 						"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 ]
 					},
 					{ "time": 1, "angle": 42.45 }
 				],
 				"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.5, "x": 2.44, "y": 4.8 },
-					{ "time": 1, "x": 6.23, "y": 0 }
+					{ "time": 1, "x": 6.24, "y": 0 }
 				]
 			},
 			"left lower leg": {
 				"rotate": [
 					{ "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.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.8666, "angle": 3.53 },
+					{ "time": 0.8667, "angle": 3.53 },
 					{ "time": 1, "angle": -22.98 }
 				],
 				"translate": [
 					{ "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": 1, "x": 0, "y": 0 }
 				]
@@ -288,11 +281,11 @@
 					{ "time": 0, "angle": -3.69 },
 					{ "time": 0.1333, "angle": -10.42 },
 					{ "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.7333, "angle": 1.68 },
-					{ "time": 0.8666, "angle": -8.54 },
+					{ "time": 0.8667, "angle": -8.54 },
 					{ "time": 1, "angle": -3.69 }
 				]
 			},
@@ -311,70 +304,70 @@
 				"rotate": [
 					{
 						"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,
-						"angle": 19.78,
+						"angle": 19.79,
 						"curve": [ 0.307, 0, 0.787, 0.99 ]
 					},
-					{ "time": 1, "angle": -4.02 }
+					{ "time": 1, "angle": -4.03 }
 				]
 			},
 			"right hand": {
 				"rotate": [
-					{ "time": 0, "angle": 8.98 },
+					{ "time": 0, "angle": 8.99 },
 					{ "time": 0.6333, "angle": 0.51 },
-					{ "time": 1, "angle": 8.98 }
+					{ "time": 1, "angle": 8.99 }
 				]
 			},
 			"left shoulder": {
 				"rotate": [
 					{
 						"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,
-						"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": [
-					{ "time": 0, "x": 1.15, "y": 0.23 }
+					{ "time": 0, "x": 1.15, "y": 0.24 }
 				]
 			},
 			"left hand": {
 				"rotate": [
 					{
 						"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,
 						"angle": -27.28,
 						"curve": [ 0.241, 0, 0.75, 0.97 ]
 					},
-					{ "time": 1, "angle": -21.23 }
+					{ "time": 1, "angle": -21.24 }
 				]
 			},
 			"left arm": {
 				"rotate": [
 					{
 						"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,
 						"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": {
@@ -382,38 +375,38 @@
 					{ "time": 0, "angle": -10.28 },
 					{
 						"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,
-						"curve": [ 0.58, 0.17, 0.669, 0.99 ]
+						"curve": [ 0.58, 0.17, 0.67, 0.99 ]
 					},
 					{
 						"time": 0.6333,
 						"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 }
 				],
 				"translate": [
-					{ "time": 0, "x": -1.29, "y": 1.68 }
+					{ "time": 0, "x": -1.29, "y": 1.69 }
 				]
 			},
 			"right foot": {
 				"rotate": [
 					{ "time": 0, "angle": -5.25 },
 					{ "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 }
 				]
 			},
@@ -422,12 +415,12 @@
 					{
 						"time": 0,
 						"angle": -3.39,
-						"curve": [ 0.316, 0.01, 0.741, 0.98 ]
+						"curve": [ 0.316, 0.02, 0.741, 0.99 ]
 					},
 					{
 						"time": 0.1333,
 						"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.5, "angle": -19.53 },
@@ -442,7 +435,7 @@
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.6333, "x": 2.18, "y": 0.21 },
+					{ "time": 0.6333, "x": 2.19, "y": 0.21 },
 					{ "time": 1, "x": 0, "y": 0 }
 				]
 			},
@@ -456,31 +449,31 @@
 					{
 						"time": 0.1333,
 						"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,
 						"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 }
 				]
 			},
 			"neck": {
 				"rotate": [
 					{ "time": 0, "angle": 3.6 },
-					{ "time": 0.1333, "angle": 17.49 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
-					{ "time": 0.5, "angle": 5.17 },
+					{ "time": 0.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.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
+					{ "time": 0.8667, "angle": 2.29 },
 					{ "time": 1, "angle": 3.6 }
 				]
 			},
@@ -489,19 +482,19 @@
 					{
 						"time": 0,
 						"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,
-						"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.8666, "angle": 2.28 },
+					{ "time": 0.8667, "angle": 2.29 },
 					{ "time": 1, "angle": 3.6 }
 				]
 			}

BIN
examples/goblins/export/goblins.skel


File diff suppressed because it is too large
+ 30 - 37
examples/hero/export/hero-mesh.json


BIN
examples/hero/export/hero-mesh.skel


File diff suppressed because it is too large
+ 235 - 242
examples/hero/export/hero.json


BIN
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": [
 	{ "name": "root" },
 	{ "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": "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": "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": "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": "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": [
 	{ "name": "right wing", "bone": "right wing", "attachment": "wing" },
@@ -44,10 +37,10 @@
 "skins": {
 	"default": {
 		"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": {
-			"wing": { "x": 49.55, "y": 42.32, "width": 137, "height": 150 }
+			"wing": { "x": 49.56, "y": 42.32, "width": 137, "height": 150 }
 		},
 		"star": {
 			"star": { "width": 76, "height": 72 }
@@ -80,7 +73,7 @@
 			"star": { "width": 76, "height": 72 }
 		},
 		"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": [
 					{ "time": 0, "color": "ffffff00" },
 					{ "time": 0.5333, "color": "ffffffff" },
-					{ "time": 0.6666, "color": "ffffff00" }
+					{ "time": 0.6667, "color": "ffffff00" }
 				]
 			},
 			"star1": {
 				"color": [
-					{ "time": 0.2666, "color": "fff9f600" },
+					{ "time": 0.2667, "color": "fff9f600" },
 					{ "time": 0.8, "color": "ffffffff" },
 					{ "time": 0.9333, "color": "fff0f200" }
 				]
@@ -104,14 +97,14 @@
 			"star2": {
 				"color": [
 					{ "time": 0.1333, "color": "ffffff00" },
-					{ "time": 0.6666, "color": "ffffffff" },
+					{ "time": 0.6667, "color": "ffffffff" },
 					{ "time": 0.8, "color": "ffffff00" }
 				]
 			},
 			"star3": {
 				"color": [
 					{ "time": 0.4333, "color": "ffffff00" },
-					{ "time": 0.9666, "color": "ffffffff" },
+					{ "time": 0.9667, "color": "ffffffff" },
 					{ "time": 1.1, "color": "ffffff00" }
 				]
 			},
@@ -119,7 +112,7 @@
 				"color": [
 					{ "time": 0.6, "color": "ffffff00" },
 					{ "time": 1.1333, "color": "ffffffff" },
-					{ "time": 1.2666, "color": "ffffff00" }
+					{ "time": 1.2667, "color": "ffffff00" }
 				]
 			},
 			"star5": {
@@ -135,7 +128,7 @@
 				"color": [
 					{ "time": 0, "color": "ffffff2f" },
 					{ "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.3333, "color": "ffffff2f" }
 				]
@@ -143,15 +136,15 @@
 			"star7": {
 				"color": [
 					{ "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": {
 				"color": [
 					{ "time": 0, "color": "ffffffbf" },
 					{ "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": 1.3333, "color": "ffffffbf" }
 				]
@@ -170,24 +163,24 @@
 				"translate": [
 					{
 						"time": 0,
-						"x": -18.55,
+						"x": -18.56,
 						"y": 0,
-						"curve": [ 0.385, 0, 0.689, 0.95 ]
+						"curve": [ 0.385, 0.01, 0.69, 0.96 ]
 					},
 					{
 						"time": 0.3333,
 						"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,
 						"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": {
@@ -195,258 +188,258 @@
 					{
 						"time": 0,
 						"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,
 						"angle": 45.23,
-						"curve": [ 0.393, 0, 0.629, 1 ]
+						"curve": [ 0.394, 0, 0.629, 1 ]
 					},
 					{
 						"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,
-						"curve": [ 0.393, 0, 0.629, 1 ]
+						"curve": [ 0.394, 0, 0.629, 1 ]
 					},
 					{
 						"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,
 						"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 }
 				],
 				"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": {
 				"rotate": [
 					{
 						"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,
-						"angle": -39.45,
-						"curve": [ 0.327, 0, 0.637, 1 ]
+						"angle": -39.46,
+						"curve": [ 0.328, 0, 0.638, 1 ]
 					},
 					{
 						"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,
-						"angle": 37.67,
-						"curve": [ 0.163, 0.91, 1, 1 ]
+						"angle": 37.68,
+						"curve": [ 0.164, 0.91, 1, 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": [
 					{ "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.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.1666, "x": 1, "y": 0.819 },
+					{ "time": 1.1667, "x": 1, "y": 0.82 },
 					{ "time": 1.3333, "x": 1.09, "y": 1 }
 				]
 			},
 			"tokenRoot": {
 				"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.3333, "angle": 11.29 }
+					{ "time": 1.3333, "angle": 11.3 }
 				]
 			},
 			"token": {
 				"rotate": [
 					{ "time": 0, "angle": -0.5 },
-					{ "time": 0.6666, "angle": 5.86 },
+					{ "time": 0.6667, "angle": 5.87 },
 					{ "time": 1.3333, "angle": -0.5 }
 				],
 				"scale": [
 					{ "time": 0, "x": 1.181, "y": 1.181 },
 					{ "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.3333, "x": 1.181, "y": 1.181 }
 				]
 			},
 			"star": {
 				"rotate": [
-					{ "time": 0, "angle": 28.25 },
-					{ "time": 0.6666, "angle": -42.08 }
+					{ "time": 0, "angle": 28.26 },
+					{ "time": 0.6667, "angle": -42.08 }
 				],
 				"translate": [
 					{ "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": [
 					{ "time": 0, "x": 0.439, "y": 0.439 },
-					{ "time": 0.6666, "x": 1, "y": 1 }
+					{ "time": 0.6667, "x": 1, "y": 1 }
 				]
 			},
 			"star1": {
 				"rotate": [
-					{ "time": 0.2666, "angle": 13.37 },
+					{ "time": 0.2667, "angle": 13.37 },
 					{ "time": 0.9333, "angle": 89.61 }
 				],
 				"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 }
 				],
 				"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": {
 				"rotate": [
-					{ "time": 0.1333, "angle": -42.67 },
+					{ "time": 0.1333, "angle": -42.68 },
 					{ "time": 0.8, "angle": 88.41 }
 				],
 				"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": [
-					{ "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": {
 				"rotate": [
-					{ "time": 0.4333, "angle": 57.71 },
+					{ "time": 0.4333, "angle": 57.72 },
 					{ "time": 1.1, "angle": -105.15 }
 				],
 				"translate": [
 					{ "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": [
-					{ "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 }
 				]
 			},
 			"star4": {
 				"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": [
-					{ "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": [
-					{ "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": {
 				"rotate": [
-					{ "time": 0, "angle": 18.27 },
+					{ "time": 0, "angle": 18.28 },
 					{ "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": [
-					{ "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": [
-					{ "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": 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": {
 				"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": [
 					{ "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.3333, "x": 4.55, "y": -14.21 }
 				],
 				"scale": [
 					{ "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 }
 				]
 			},
 			"star7": {
 				"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": [
-					{ "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": [
-					{ "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": {
@@ -458,33 +451,33 @@
 				],
 				"translate": [
 					{ "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": 1.3333, "x": -78.75, "y": 77.18 }
 				],
 				"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.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": {
 				"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": 1.3333, "angle": -60.17 }
+					{ "time": 1.3333, "angle": -60.18 }
 				],
 				"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": 1.3333, "x": 44.63, "y": -41.66 }
+					{ "time": 1.3333, "x": 44.64, "y": -41.66 }
 				],
 				"scale": [
 					{ "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": 1.3333, "x": 0.452, "y": 0.452 }
 				]

BIN
examples/powerup/export/powerup.skel


File diff suppressed because it is too large
+ 102 - 109
examples/raptor/export/raptor.json


BIN
examples/raptor/export/raptor.skel


File diff suppressed because it is too large
+ 292 - 299
examples/speedy/export/speedy.json


BIN
examples/speedy/export/speedy.skel


File diff suppressed because it is too large
+ 306 - 313
examples/spineboy-old/export/spineboy-old.json


BIN
examples/spineboy-old/export/spineboy-old.skel


File diff suppressed because it is too large
+ 49 - 56
examples/spineboy/export/spineboy-hover.json


BIN
examples/spineboy/export/spineboy-hover.skel


File diff suppressed because it is too large
+ 45 - 45
examples/spineboy/export/spineboy-mesh.json


BIN
examples/spineboy/export/spineboy-mesh.skel


File diff suppressed because it is too large
+ 236 - 243
examples/spineboy/export/spineboy.json


BIN
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": [
-	{ "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": "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 }
 ],
 "slots": [
@@ -29,7 +22,7 @@
 			"leaves": { "y": -28.54, "width": 1042, "height": 522 }
 		},
 		"logo": {
-			"logo": { "y": -20.39, "width": 917, "height": 323 }
+			"logo": { "y": -20.4, "width": 917, "height": 323 }
 		},
 		"play": {
 			"play": { "width": 218, "height": 77 }
@@ -60,9 +53,9 @@
 			"play": {
 				"color": [
 					{ "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": 2.0666, "color": "fff99dff" }
+					{ "time": 2.0667, "color": "fff99dff" }
 				]
 			},
 			"quit": {
@@ -73,10 +66,10 @@
 			},
 			"settings": {
 				"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,
 						"x": 0,
 						"y": 40.8,
-						"curve": [ 0.043, 0.15, 0.344, 1.26 ]
+						"curve": [ 0.043, 0.15, 0.345, 1.27 ]
 					},
 					{
 						"time": 0.3333,
 						"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,
 						"x": 0,
-						"y": -583.71,
+						"y": -583.72,
 						"curve": [ 0.402, 0, 0.603, 1 ]
 					},
 					{
-						"time": 1.6666,
+						"time": 1.6667,
 						"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,
 						"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,
 						"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": [
 					{
@@ -132,61 +125,61 @@
 						"time": 0.3333,
 						"x": 1,
 						"y": 1,
-						"curve": [ 0.189, 0.37, 0.658, 0.98 ]
+						"curve": [ 0.19, 0.38, 0.658, 0.99 ]
 					},
 					{
 						"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,
 						"y": 1,
-						"curve": [ 0.387, 0.01, 0.686, 1 ]
+						"curve": [ 0.388, 0.01, 0.687, 1 ]
 					},
 					{
 						"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,
 						"x": 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": {
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{
-						"time": 0.6666,
+						"time": 0.6667,
 						"x": 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": [
 					{
 						"time": 1.3333,
 						"x": 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,
 						"x": 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": {
@@ -195,25 +188,25 @@
 						"time": 0.8,
 						"x": 0,
 						"y": 0,
-						"curve": [ 0, 0, 0.448, 1.62 ]
+						"curve": [ 0, 0, 0.448, 1.63 ]
 					},
 					{ "time": 1, "x": 0, "y": 431.2 }
 				],
 				"scale": [
 					{
-						"time": 1.8666,
+						"time": 1.8667,
 						"x": 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,
 						"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": {
@@ -222,7 +215,7 @@
 						"time": 0.9333,
 						"x": 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 }
 				],
@@ -231,7 +224,7 @@
 						"time": 2.4,
 						"x": 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 }
 				]
@@ -242,28 +235,28 @@
 						"time": 0,
 						"x": 0,
 						"y": 0,
-						"curve": [ 0.043, 0.15, 0.344, 1.26 ]
+						"curve": [ 0.043, 0.15, 0.345, 1.27 ]
 					},
 					{
 						"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,
-						"x": 0.16,
-						"y": -580.83,
+						"x": 0.17,
+						"y": -580.84,
 						"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 ]
 					},
-					{ "time": 3.3333, "x": 0.16, "y": -595.11 }
+					{ "time": 3.3333, "x": 0.17, "y": -595.12 }
 				],
 				"scale": [
 					{
@@ -273,9 +266,9 @@
 						"curve": [ 0, 0, 0.744, 0.4 ]
 					},
 					{ "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.6666, "x": 1.029, "y": 1.019 },
+					{ "time": 2.6667, "x": 1.03, "y": 1.02 },
 					{ "time": 3.3333, "x": 1, "y": 1 }
 				]
 			}

BIN
examples/spinosaurus/export/spinosaurus.skel


File diff suppressed because it is too large
+ 56 - 71
examples/stretchyman/export/stretchyman.json


BIN
examples/stretchyman/export/stretchyman.skel


File diff suppressed because it is too large
+ 27 - 36
examples/tank/export/tank.json


BIN
examples/tank/export/tank.skel


BIN
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": [
-	{ "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": "scale", "parent": "root", "x": 183.99, "y": -138 },
 	{ "name": "shear", "parent": "root", "x": -304, "y": -146 },
@@ -81,7 +74,7 @@
 				"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 ],
 				"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,
 				"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,
@@ -114,9 +107,9 @@
 			"images/spine": {
 				"type": "mesh",
 				"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 ],
-				"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,
 				"edges": [ 10, 12, 12, 14, 14, 16, 16, 18, 2, 0, 0, 18, 6, 8, 8, 10, 2, 4, 4, 6 ],
 				"width": 377,
@@ -127,9 +120,9 @@
 			"path": {
 				"type": "path",
 				"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,
-				"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": [
 					{ "time": 0, "color": "ffffffff" },
 					{ "time": 0.4333, "color": "ff0901ff" },
-					{ "time": 0.8999, "color": "2dff00ff" },
+					{ "time": 0.9, "color": "2dff00ff" },
 					{ "time": 1.3333, "color": "ffffffff" }
 				]
 			},
 			"images/spine10": {
 				"attachment": [
 					{ "time": 0, "name": "images/spine" },
-					{ "time": 0.6666, "name": "images/logo" },
+					{ "time": 0.6667, "name": "images/logo" },
 					{ "time": 1.3333, "name": "images/spine" }
 				]
 			},
 			"images/spine12": {
 				"attachment": [
 					{ "time": 0, "name": "images/spine" },
-					{ "time": 0.6666, "name": "linkedmesh" }
+					{ "time": 0.6667, "name": "linkedmesh" }
 				]
 			}
 		},
@@ -168,50 +161,50 @@
 						"y": 0,
 						"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 }
 				]
 			},
 			"scale": {
 				"scale": [
 					{ "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 }
 				]
 			},
 			"rotate": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": -125.33 },
+					{ "time": 0.6667, "angle": -125.34 },
 					{ "time": 1.3333, "angle": 0 }
 				]
 			},
 			"shear": {
 				"shear": [
 					{ "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 }
 				]
 			},
 			"transformconstrainttarget": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": -74.59 },
+					{ "time": 0.6667, "angle": -74.6 },
 					{ "time": 1.3333, "angle": 0 }
 				],
 				"translate": [
 					{ "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 }
 				],
 				"scale": [
 					{ "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 }
 				],
 				"shear": [
 					{ "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 }
 				]
 			}
@@ -219,7 +212,7 @@
 		"transform": {
 			"transformconstraint": [
 				{ "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 }
 			]
 		},
@@ -230,11 +223,11 @@
 					{ "time": 1.3333, "position": 1 }
 				],
 				"spacing": [
-					{ "time": 0, "spacing": 40.0999 },
+					{ "time": 0, "spacing": 40.1 },
 					{ "time": 1.3333 }
 				],
 				"mix": [
-					{ "time": 0.6666, "rotateMix": 0.4729, "translateMix": 0.4729 },
+					{ "time": 0.6667, "rotateMix": 0.473, "translateMix": 0.473 },
 					{ "time": 1.3333 }
 				]
 			}
@@ -245,8 +238,8 @@
 					"images/spine": [
 						{ "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 }
 					]
@@ -257,16 +250,16 @@
 						{
 							"time": 0.3333,
 							"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,
-							"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,
-							"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": [
 			{ "time": 0 },
 			{
-				"time": 0.6666,
+				"time": 0.6667,
 				"offsets": [
 					{ "slot": "draworder2", "offset": 1 }
 				]

BIN
examples/test/export/test.skel


File diff suppressed because it is too large
+ 16 - 23
examples/vine/export/vine.json


BIN
examples/vine/export/vine.skel


File diff suppressed because it is too large
+ 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_PATHCONSTRAINTPOSITION,
 	SP_TIMELINE_PATHCONSTRAINTSPACING,
-	SP_TIMELINE_PATHCONSTRAINTMIX
+	SP_TIMELINE_PATHCONSTRAINTMIX,
+	SP_TIMELINE_TWOCOLOR
 } spTimelineType;
 
 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 {
 	spTimeline super;
 	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_MESH,
 	SP_ATTACHMENT_LINKED_MESH,
-	SP_ATTACHMENT_PATH
+	SP_ATTACHMENT_PATH,
+	SP_ATTACHMENT_POINT
 } spAttachmentType;
 
 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_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_worldToLocal (spBone* self, float worldX, float worldY, float* localX, float* localY);
 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
 typedef spBone Bone;
@@ -111,12 +111,12 @@ typedef spBone Bone;
 #define Bone_getWorldRotationY(...) spBone_getWorldRotationY(__VA_ARGS__)
 #define Bone_getWorldScaleX(...) spBone_getWorldScaleX(__VA_ARGS__)
 #define Bone_getWorldScaleY(...) spBone_getWorldScaleY(__VA_ARGS__)
-#define Bone_worldToLocalRotationX(...) spBone_worldToLocalRotationX(__VA_ARGS__)
-#define Bone_worldToLocalRotationY(...) spBone_worldToLocalRotationY(__VA_ARGS__)
-#define Bone_rotateWorld(...) spBone_rotateWorld(__VA_ARGS__)
 #define Bone_updateAppliedTransform(...) spBone_updateAppliedTransform(__VA_ARGS__)
 #define Bone_worldToLocal(...) spBone_worldToLocal(__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
 
 #ifdef __cplusplus

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

@@ -45,12 +45,10 @@ typedef struct spBoundingBoxAttachment {
 } spBoundingBoxAttachment;
 
 spBoundingBoxAttachment* spBoundingBoxAttachment_create (const char* name);
-void spBoundingBoxAttachment_computeWorldVertices (spBoundingBoxAttachment* self, spSlot* slot, float* worldVertices);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spBoundingBoxAttachment BoundingBoxAttachment;
 #define BoundingBoxAttachment_create(...) spBoundingBoxAttachment_create(__VA_ARGS__)
-#define BoundingBoxAttachment_computeWorldVertices(...) spBoundingBoxAttachment_computeWorldVertices(__VA_ARGS__)
 #endif
 
 #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;
 	unsigned short* triangles;
 
-	float r, g, b, a;
+	spColor color;
 
 	int hullLength;
 
@@ -74,14 +74,12 @@ struct spMeshAttachment {
 
 spMeshAttachment* spMeshAttachment_create (const char* name);
 void spMeshAttachment_updateUVs (spMeshAttachment* self);
-void spMeshAttachment_computeWorldVertices (spMeshAttachment* self, spSlot* slot, float* worldVertices);
 void spMeshAttachment_setParentMesh (spMeshAttachment* self, spMeshAttachment* parentMesh);
 
 #ifdef SPINE_SHORT_NAMES
 typedef spMeshAttachment MeshAttachment;
 #define MeshAttachment_create(...) spMeshAttachment_create(__VA_ARGS__)
 #define MeshAttachment_updateUVs(...) spMeshAttachment_updateUVs(__VA_ARGS__)
-#define MeshAttachment_computeWorldVertices(...) spMeshAttachment_computeWorldVertices(__VA_ARGS__)
 #define MeshAttachment_setParentMesh(...) spMeshAttachment_setParentMesh(__VA_ARGS__)
 #endif
 

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

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

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

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

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

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

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

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

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

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

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

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

@@ -51,13 +51,11 @@ struct spVertexAttachment {
 	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
 typedef spVertexAttachment VertexAttachment;
 #define VertexAttachment_computeWorldVertices(...) spVertexAttachment_computeWorldVertices(__VA_ARGS__)
-#define VertexAttachment_computeWorldVertices1(...) spVertexAttachment_computeWorldVertices1(__VA_ARGS__)
 #endif
 
 #ifdef __cplusplus

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

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

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

@@ -44,6 +44,7 @@
 #include <spine/VertexAttachment.h>
 #include <spine/MeshAttachment.h>
 #include <spine/BoundingBoxAttachment.h>
+#include <spine/PointAttachment.h>
 #include <spine/Skeleton.h>
 #include <spine/SkeletonBounds.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 (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;
 	}
@@ -561,21 +558,12 @@ void _spColorTimeline_apply (const spTimeline* timeline, spSkeleton* skeleton, f
 		a += (self->frames[frame + COLOR_A] - a) * percent;
 	}
 	if (alpha == 1) {
-		slot->r = r;
-		slot->g = g;
-		slot->b = b;
-		slot->a = a;
+		spColor_setFromFloats(&slot->color, r, g, b, a);
 	} else {
 		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);
@@ -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,
 		spEvent** firedEvents, int* eventsCount, float alpha, int setupPose, int mixingOut) {
 	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)));
 	case SP_ATTACHMENT_PATH:
 		return SUPER(SUPER(spPathAttachment_create(name)));
+	case SP_ATTACHMENT_POINT:
+		return SUPER(SUPER(spPointAttachment_create(name)));
 	default:
 		_spAttachmentLoader_setUnknownTypeError(loader, type);
 		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);
 }
 
-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
  * the applied transform after the world transform has been modified directly (eg, by a constraint).
  * <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;
 	*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);
 	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* 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);
 	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) {
 	CONST_CAST(spMeshAttachment*, self->parentMesh) = 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);
 	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) {
 	int i, p, n;
-	float length, x, y, dx, dy, s;
+	float length, setupLength, x, y, dx, dy, s;
 	float* spaces, *lengths, *positions;
 	float spacing;
 	float boneX, boneY, offsetRotation;
@@ -114,10 +114,10 @@ void spPathConstraint_apply (spPathConstraint* self) {
 		}
 		for (i = 0, n = spacesCount - 1; i < n;) {
 			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);
 			if (scale) lengths[i] = length;
-			spaces[++i] = lengthSpacing ? MAX(0, length + spacing) : spacing;
+			spaces[++i] =  (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength;
 		}
 	} else {
 		for (i = 1; i < spacesCount; i++) {
@@ -256,14 +256,14 @@ float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAtta
 			} else if (p < 0) {
 				if (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);
 				continue;
 			} else if (p > pathLength) {
 				if (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);
 				continue;
@@ -284,10 +284,10 @@ float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAtta
 			if (curve != prevCurve) {
 				prevCurve = curve;
 				if (closed && curve == curveCount) {
-					spPathAttachment_computeWorldVertices1(path, target, verticesLength - 4, 4, world, 0);
-					spPathAttachment_computeWorldVertices1(path, target, 0, 4, world, 4);
+					spVertexAttachment_computeWorldVertices(SUPER(path), target, verticesLength - 4, 4, world, 0, 2);
+					spVertexAttachment_computeWorldVertices(SUPER(path), target, 0, 4, world, 4, 2);
 				} 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,
 				tangents || (i > 0 && space == 0));
@@ -304,8 +304,8 @@ float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAtta
 			self->worldCount = verticesLength;
 		}
 		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 - 1] = world[1];
 	} else {
@@ -317,7 +317,7 @@ float* spPathConstraint_computeWorldPositions(spPathConstraint* self, spPathAtta
 			self->worldCount = verticesLength;
 		}
 		world = self->world;
-		spPathAttachment_computeWorldVertices1(path, target, 2, verticesLength, world, 0);
+		spVertexAttachment_computeWorldVertices(SUPER(path), target, 2, verticesLength, world, 0, 2);
 	}
 
 	/* 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);
 	self->scaleX = 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);
 	return self;
 }
@@ -99,15 +96,22 @@ void spRegionAttachment_updateOffset (spRegionAttachment* self) {
 	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;
-	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++)
 		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);
 
@@ -258,48 +258,66 @@ static void _sortPathConstraint(_spSkeleton* const internal, spPathConstraint* c
 	spSlot* slot = constraint->target;
 	int slotIndex = slot->data->index;
 	spBone* slotBone = slot->bone;
-	int ii, nn, boneCount;
+	int i, n, boneCount;
 	spAttachment* attachment;
 	spBone** constrained;
 	spSkeleton* skeleton = SUPER_CAST(spSkeleton, internal);
 	if (skeleton->skin) _sortPathConstraintAttachment(internal, skeleton->skin, slotIndex, slotBone);
 	if (skeleton->data->defaultSkin && skeleton->data->defaultSkin != skeleton->skin)
 		_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;
 	if (attachment->type == SP_ATTACHMENT_PATH) _sortPathConstraintAttachmentBones(internal, attachment, slotBone);
 
 	constrained = constraint->bones;
 	boneCount = constraint->bonesCount;
-	for (ii = 0; ii < boneCount; ii++)
-		_sortBone(internal, constrained[ii]);
+	for (i = 0; i < boneCount; i++)
+		_sortBone(internal, constrained[i]);
 
 	_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) {
-	int ii, boneCount;
+	int i, boneCount;
 	spBone** constrained;
+	spBone* child;
+	int /*boolean*/ contains = 0;
 	_sortBone(internal, constraint->target);
 
 	constrained = constraint->bones;
 	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);
 
-	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) {

+ 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->width = 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);
 			spAttachmentLoader_configureAttachment(self->attachmentLoader, attachment);
 			if (freeName) FREE(name);
@@ -711,7 +711,7 @@ spAttachment* spSkeletonBinary_readAttachment(spSkeletonBinary* self, _dataInput
 			attachment = spAttachmentLoader_createAttachment(self->attachmentLoader, skin, type, name, path);
 			mesh = SUB_CAST(spMeshAttachment, attachment);
 			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);
 			mesh->regionUVs = _readFloatArray(input, vertexCount << 1, 1);
 			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);
 			mesh = SUB_CAST(spMeshAttachment, attachment);
 			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);
 			parent = readString(input);
 			mesh->inheritDeform = readBoolean(input);
@@ -771,6 +771,18 @@ spAttachment* spSkeletonBinary_readAttachment(spSkeletonBinary* self, _dataInput
 			if (freeName) FREE(name);
 			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);
@@ -884,12 +896,21 @@ spSkeletonData* spSkeletonBinary_readSkeletonData (spSkeletonBinary* self, const
 	skeletonData->slotsCount = readVarint(input, 1);
 	skeletonData->slots = MALLOC(spSlotData*, skeletonData->slotsCount);
 	for (i = 0; i < skeletonData->slotsCount; ++i) {
+		int r, g, b, a;
 		const char* slotName = readString(input);
 		spBoneData* boneData = skeletonData->bones[readVarint(input, 1)];
 		/* TODO Avoid copying of slotName */
 		spSlotData* slotData = spSlotData_create(i, slotName, boneData);
 		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->blendMode = (spBlendMode)readVarint(input, 1);
 		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);
 		}
 		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) {
 			int ii = 0;

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

@@ -34,7 +34,6 @@
 #include "Json.h"
 #include <spine/extension.h>
 #include <spine/AtlasAttachmentLoader.h>
-#include <spine/Animation.h>
 
 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
 #define strdup _strdup
@@ -188,7 +187,19 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 		}
 
 		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);
 				timeline->slotIndex = slotIndex;
 
@@ -201,17 +212,19 @@ static spAnimation* _spSkeletonJson_readAnimation (spSkeletonJson* self, Json* r
 				animation->timelines[animation->timelinesCount++] = SUPER_CAST(spTimeline, timeline);
 				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;
 
 				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->duration = MAX(animation->duration, timeline->frames[timelineMap->size - 1]);
+				animation->duration = MAX(animation->duration, timeline->frames[(timelineMap->size - 1) * TWOCOLOR_ENTRIES]);
 
 			} else {
 				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) {
 			spSlotData* data;
 			const char* color;
+			const char* dark;
 			Json *item;
 
 			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);
 			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");
@@ -902,10 +927,11 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 
 						color = Json_getString(attachmentMap, "color", 0);
 						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);
@@ -921,10 +947,11 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 
 						color = Json_getString(attachmentMap, "color", 0);
 						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;
@@ -992,6 +1019,22 @@ spSkeletonData* spSkeletonJson_readSkeletonData (spSkeletonJson* self, const cha
 						}
 						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);

+ 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));
 	CONST_CAST(spSlotData*, self->data) = data;
 	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);
 	return self;
 }
 
 void spSlot_dispose (spSlot* self) {
 	FREE(self->attachmentVertices);
+	FREE(self->darkColor);
 	FREE(self);
 }
 
@@ -65,10 +68,8 @@ float spSlot_getAttachmentTime (const 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)
 		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;
 	MALLOC_STR(self->name, name);
 	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;
 }
 
 void spSlotData_dispose (spSlotData* self) {
 	FREE(self->name);
 	FREE(self->attachmentName);
+	FREE(self->darkColor);
 	FREE(self);
 }
 

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

@@ -53,7 +53,7 @@ void spTransformConstraint_dispose (spTransformConstraint* 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;
 	spBone* target = self->target;
 	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;
 	int /*bool*/ modified;
 	int i;
+	float a, b, c, d, r, cosine, sine, x, y, s, ts, by;
 	for (i = 0; i < self->bonesCount; ++i) {
 		spBone* bone = self->bones[i];
 		modified = 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;
 			else if (r < -PI) r += PI2;
 			r *= rotateMix;
@@ -82,7 +82,6 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 		}
 
 		if (translateMix != 0) {
-			float x, y;
 			spBone_localToWorld(target, self->data->offsetX, self->data->offsetY, &x, &y);
 			CONST_CAST(float, bone->worldX) += (x - bone->worldX) * translateMix;
 			CONST_CAST(float, bone->worldY) += (y - bone->worldY) * translateMix;
@@ -90,8 +89,8 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 		}
 
 		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;
 			CONST_CAST(float, bone->a) *= s;
 			CONST_CAST(float, bone->c) *= s;
@@ -104,10 +103,10 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 		}
 
 		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;
 			else if (r < -PI) r += PI2;
 			r = by + (r + offsetShearY) * shearMix;
@@ -119,3 +118,156 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
 		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);
 }
 
-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;
 	int deformLength;
 	float* deform;
@@ -62,7 +58,7 @@ void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int sta
 		bone = slot->bone;
 		x = bone->worldX;
 		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];
 			worldVertices[w] = vx * bone->a + vy * bone->b + x;
 			worldVertices[w + 1] = vx * bone->c + vy * bone->d + y;
@@ -78,7 +74,7 @@ void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int sta
 		skeletonBones = skeleton->bones;
 		if (deformLength == 0) {
 			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;
 				int n = bones[v++];
 				n += v;
@@ -93,7 +89,7 @@ void spVertexAttachment_computeWorldVertices1 (spVertexAttachment* self, int sta
 			}
 		} else {
 			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;
 				int n = bones[v++];
 				n += v;

File diff suppressed because it is too large
+ 218 - 225
spine-cocos2d-objc/Resources/goblins-mesh.json


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


File diff suppressed because it is too large
+ 236 - 243
spine-cocos2d-objc/Resources/spineboy.json


File diff suppressed because it is too large
+ 27 - 36
spine-cocos2d-objc/Resources/tank.json


File diff suppressed because it is too large
+ 218 - 225
spine-cocos2dx/example/Resources/common/goblins-mesh.json


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


File diff suppressed because it is too large
+ 236 - 243
spine-cocos2dx/example/Resources/common/spineboy.json


File diff suppressed because it is too large
+ 27 - 36
spine-cocos2dx/example/Resources/common/tank.json


File diff suppressed because it is too large
+ 218 - 225
spine-corona/data/goblins-mesh.json


File diff suppressed because it is too large
+ 102 - 109
spine-corona/data/raptor.json


File diff suppressed because it is too large
+ 236 - 243
spine-corona/data/spineboy.json


File diff suppressed because it is too large
+ 56 - 71
spine-corona/data/stretchyman.json


File diff suppressed because it is too large
+ 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": [
-	{ "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": "scale", "parent": "root", "x": 183.99, "y": -138 },
 	{ "name": "shear", "parent": "root", "x": -304, "y": -146 },
@@ -81,7 +74,7 @@
 				"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 ],
 				"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,
 				"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,
@@ -114,9 +107,9 @@
 			"images/spine": {
 				"type": "mesh",
 				"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 ],
-				"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,
 				"edges": [ 10, 12, 12, 14, 14, 16, 16, 18, 2, 0, 0, 18, 6, 8, 8, 10, 2, 4, 4, 6 ],
 				"width": 377,
@@ -127,9 +120,9 @@
 			"path": {
 				"type": "path",
 				"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,
-				"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": [
 					{ "time": 0, "color": "ffffffff" },
 					{ "time": 0.4333, "color": "ff0901ff" },
-					{ "time": 0.8999, "color": "2dff00ff" },
+					{ "time": 0.9, "color": "2dff00ff" },
 					{ "time": 1.3333, "color": "ffffffff" }
 				]
 			},
 			"images/spine10": {
 				"attachment": [
 					{ "time": 0, "name": "images/spine" },
-					{ "time": 0.6666, "name": "images/logo" },
+					{ "time": 0.6667, "name": "images/logo" },
 					{ "time": 1.3333, "name": "images/spine" }
 				]
 			},
 			"images/spine12": {
 				"attachment": [
 					{ "time": 0, "name": "images/spine" },
-					{ "time": 0.6666, "name": "linkedmesh" }
+					{ "time": 0.6667, "name": "linkedmesh" }
 				]
 			}
 		},
@@ -168,50 +161,50 @@
 						"y": 0,
 						"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 }
 				]
 			},
 			"scale": {
 				"scale": [
 					{ "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 }
 				]
 			},
 			"rotate": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": -125.33 },
+					{ "time": 0.6667, "angle": -125.34 },
 					{ "time": 1.3333, "angle": 0 }
 				]
 			},
 			"shear": {
 				"shear": [
 					{ "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 }
 				]
 			},
 			"transformconstrainttarget": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.6666, "angle": -74.59 },
+					{ "time": 0.6667, "angle": -74.6 },
 					{ "time": 1.3333, "angle": 0 }
 				],
 				"translate": [
 					{ "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 }
 				],
 				"scale": [
 					{ "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 }
 				],
 				"shear": [
 					{ "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 }
 				]
 			}
@@ -219,7 +212,7 @@
 		"transform": {
 			"transformconstraint": [
 				{ "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 }
 			]
 		},
@@ -230,11 +223,11 @@
 					{ "time": 1.3333, "position": 1 }
 				],
 				"spacing": [
-					{ "time": 0, "spacing": 40.0999 },
+					{ "time": 0, "spacing": 40.1 },
 					{ "time": 1.3333 }
 				],
 				"mix": [
-					{ "time": 0.6666, "rotateMix": 0.4729, "translateMix": 0.4729 },
+					{ "time": 0.6667, "rotateMix": 0.473, "translateMix": 0.473 },
 					{ "time": 1.3333 }
 				]
 			}
@@ -245,8 +238,8 @@
 					"images/spine": [
 						{ "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 }
 					]
@@ -257,16 +250,16 @@
 						{
 							"time": 0.3333,
 							"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,
-							"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,
-							"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": [
 			{ "time": 0 },
 			{
-				"time": 0.6666,
+				"time": 0.6667,
 				"offsets": [
 					{ "slot": "draworder2", "offset": 1 }
 				]

File diff suppressed because it is too large
+ 16 - 23
spine-corona/data/vine.json


File diff suppressed because it is too large
+ 218 - 225
spine-libgdx/spine-libgdx-tests/assets/goblins/goblins-mesh.json


BIN
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": [
 	{ "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 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": [
 	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
@@ -54,22 +47,22 @@
 "skins": {
 	"default": {
 		"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": {
-			"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": {
-			"shield": { "rotation": 93.49, "width": 70, "height": 72 }
+			"shield": { "rotation": 93.5, "width": 70, "height": 72 }
 		}
 	},
 	"goblin": {
 		"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": { "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": {
@@ -78,13 +71,13 @@
 				"y": -1.69,
 				"scaleX": 1.057,
 				"scaleY": 1.057,
-				"rotation": 33.84,
+				"rotation": 33.85,
 				"width": 37,
 				"height": 35
 			}
 		},
 		"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": {
@@ -99,60 +92,60 @@
 			}
 		},
 		"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": { "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": { "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": { "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": { "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": { "name": "goblin/right-arm", "x": 16.44, "y": -1.04, "rotation": 94.32, "width": 23, "height": 50 }
 		},
 		"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": { "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": { "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": { "name": "goblin/right-shoulder", "x": 15.68, "y": -1.03, "rotation": 130.65, "width": 39, "height": 45 }
 		},
 		"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": { "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": { "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": { "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": {
 		"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": { "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": { "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": { "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": {
@@ -161,52 +154,52 @@
 				"y": 2.39,
 				"scaleX": 0.896,
 				"scaleY": 0.896,
-				"rotation": 30.34,
+				"rotation": 30.35,
 				"width": 35,
 				"height": 40
 			}
 		},
 		"left lower leg": {
-			"left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.6, "rotation": 105.75, "width": 33, "height": 70 }
+			"left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.61, "rotation": 105.76, "width": 33, "height": 70 }
 		},
 		"left shoulder": {
-			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 }
+			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.81, "y": -0.43, "rotation": 61.22, "width": 28, "height": 46 }
 		},
 		"left upper leg": {
-			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 }
+			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.22, "y": -2.95, "rotation": 89.1, "width": 33, "height": 70 }
 		},
 		"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": { "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": { "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": { "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": { "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": { "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": { "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": { "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": { "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": { "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": { "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": {
 			"eyes": {
 				"attachment": [
-					{ "time": 0.6999, "name": "eyes closed" },
+					{ "time": 0.7, "name": "eyes closed" },
 					{ "time": 0.8, "name": null }
 				]
 			}
@@ -223,62 +216,62 @@
 		"bones": {
 			"left upper leg": {
 				"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.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": [
-					{ "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": {
 				"rotate": [
 					{ "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,
 						"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 ]
 					},
 					{ "time": 1, "angle": 42.45 }
 				],
 				"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.5, "x": 2.44, "y": 4.8 },
-					{ "time": 1, "x": 6.23, "y": 0 }
+					{ "time": 1, "x": 6.24, "y": 0 }
 				]
 			},
 			"left lower leg": {
 				"rotate": [
 					{ "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.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.8666, "angle": 3.53 },
+					{ "time": 0.8667, "angle": 3.53 },
 					{ "time": 1, "angle": -22.98 }
 				],
 				"translate": [
 					{ "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": 1, "x": 0, "y": 0 }
 				]
@@ -288,11 +281,11 @@
 					{ "time": 0, "angle": -3.69 },
 					{ "time": 0.1333, "angle": -10.42 },
 					{ "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.7333, "angle": 1.68 },
-					{ "time": 0.8666, "angle": -8.54 },
+					{ "time": 0.8667, "angle": -8.54 },
 					{ "time": 1, "angle": -3.69 }
 				]
 			},
@@ -311,70 +304,70 @@
 				"rotate": [
 					{
 						"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,
-						"angle": 19.78,
+						"angle": 19.79,
 						"curve": [ 0.307, 0, 0.787, 0.99 ]
 					},
-					{ "time": 1, "angle": -4.02 }
+					{ "time": 1, "angle": -4.03 }
 				]
 			},
 			"right hand": {
 				"rotate": [
-					{ "time": 0, "angle": 8.98 },
+					{ "time": 0, "angle": 8.99 },
 					{ "time": 0.6333, "angle": 0.51 },
-					{ "time": 1, "angle": 8.98 }
+					{ "time": 1, "angle": 8.99 }
 				]
 			},
 			"left shoulder": {
 				"rotate": [
 					{
 						"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,
-						"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": [
-					{ "time": 0, "x": 1.15, "y": 0.23 }
+					{ "time": 0, "x": 1.15, "y": 0.24 }
 				]
 			},
 			"left hand": {
 				"rotate": [
 					{
 						"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,
 						"angle": -27.28,
 						"curve": [ 0.241, 0, 0.75, 0.97 ]
 					},
-					{ "time": 1, "angle": -21.23 }
+					{ "time": 1, "angle": -21.24 }
 				]
 			},
 			"left arm": {
 				"rotate": [
 					{
 						"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,
 						"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": {
@@ -382,38 +375,38 @@
 					{ "time": 0, "angle": -10.28 },
 					{
 						"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,
-						"curve": [ 0.58, 0.17, 0.669, 0.99 ]
+						"curve": [ 0.58, 0.17, 0.67, 0.99 ]
 					},
 					{
 						"time": 0.6333,
 						"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 }
 				],
 				"translate": [
-					{ "time": 0, "x": -1.29, "y": 1.68 }
+					{ "time": 0, "x": -1.29, "y": 1.69 }
 				]
 			},
 			"right foot": {
 				"rotate": [
 					{ "time": 0, "angle": -5.25 },
 					{ "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 }
 				]
 			},
@@ -422,12 +415,12 @@
 					{
 						"time": 0,
 						"angle": -3.39,
-						"curve": [ 0.316, 0.01, 0.741, 0.98 ]
+						"curve": [ 0.316, 0.02, 0.741, 0.99 ]
 					},
 					{
 						"time": 0.1333,
 						"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.5, "angle": -19.53 },
@@ -442,7 +435,7 @@
 				"translate": [
 					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
 					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.6333, "x": 2.18, "y": 0.21 },
+					{ "time": 0.6333, "x": 2.19, "y": 0.21 },
 					{ "time": 1, "x": 0, "y": 0 }
 				]
 			},
@@ -456,31 +449,31 @@
 					{
 						"time": 0.1333,
 						"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,
 						"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 }
 				]
 			},
 			"neck": {
 				"rotate": [
 					{ "time": 0, "angle": 3.6 },
-					{ "time": 0.1333, "angle": 17.49 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
-					{ "time": 0.5, "angle": 5.17 },
+					{ "time": 0.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.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
+					{ "time": 0.8667, "angle": 2.29 },
 					{ "time": 1, "angle": 3.6 }
 				]
 			},
@@ -489,19 +482,19 @@
 					{
 						"time": 0,
 						"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,
-						"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.8666, "angle": 2.28 },
+					{ "time": 0.8667, "angle": 2.29 },
 					{ "time": 1, "angle": 3.6 }
 				]
 			}

BIN
spine-libgdx/spine-libgdx-tests/assets/goblins/goblins.skel


File diff suppressed because it is too large
+ 102 - 109
spine-libgdx/spine-libgdx-tests/assets/raptor/raptor.json


BIN
spine-libgdx/spine-libgdx-tests/assets/raptor/raptor.skel


File diff suppressed because it is too large
+ 306 - 313
spine-libgdx/spine-libgdx-tests/assets/spineboy-old/spineboy-old.json


BIN
spine-libgdx/spine-libgdx-tests/assets/spineboy-old/spineboy-old.skel


File diff suppressed because it is too large
+ 49 - 56
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-hover.json


BIN
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-hover.skel


File diff suppressed because it is too large
+ 45 - 45
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-mesh.json


BIN
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy-mesh.skel


File diff suppressed because it is too large
+ 236 - 243
spine-libgdx/spine-libgdx-tests/assets/spineboy/spineboy.json


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