Browse Source

Merge branch '4.1-beta' into spine-godot

# Conflicts:
#	.gitignore
#	formatters/build.gradle
Mario Zechner 3 years ago
parent
commit
d9e1d05e1b
100 changed files with 1840 additions and 1617 deletions
  1. 19 12
      .gitignore
  2. 154 2
      CHANGELOG.md
  3. 11 17
      CMakeLists.txt
  4. 10 10
      examples/alien/export/alien-ess.json
  5. BIN
      examples/alien/export/alien-ess.skel
  6. BIN
      examples/alien/export/alien-pma.png
  7. 69 67
      examples/alien/export/alien-pro.json
  8. BIN
      examples/alien/export/alien-pro.skel
  9. BIN
      examples/alien/export/alien.png
  10. 2 2
      examples/coin/export/coin-pro.json
  11. BIN
      examples/coin/export/coin-pro.skel
  12. BIN
      examples/dragon/dragon-ess.spine
  13. 49 69
      examples/dragon/export/dragon-ess.json
  14. BIN
      examples/dragon/export/dragon-ess.skel
  15. 77 60
      examples/dragon/export/dragon-pma.atlas
  16. BIN
      examples/dragon/export/dragon-pma.png
  17. BIN
      examples/dragon/export/dragon-pma_2.png
  18. BIN
      examples/dragon/export/dragon-pma_3.png
  19. BIN
      examples/dragon/export/dragon-pma_4.png
  20. BIN
      examples/dragon/export/dragon-pma_5.png
  21. BIN
      examples/dragon/export/dragon-pma_6.png
  22. 73 60
      examples/dragon/export/dragon.atlas
  23. BIN
      examples/dragon/export/dragon.png
  24. BIN
      examples/dragon/export/dragon_2.png
  25. BIN
      examples/dragon/export/dragon_3.png
  26. BIN
      examples/dragon/export/dragon_4.png
  27. BIN
      examples/dragon/export/dragon_5.png
  28. BIN
      examples/dragon/export/dragon_6.png
  29. BIN
      examples/dragon/images/left-wing01.png
  30. BIN
      examples/dragon/images/left-wing02.png
  31. BIN
      examples/dragon/images/left-wing03.png
  32. BIN
      examples/dragon/images/left-wing04.png
  33. BIN
      examples/dragon/images/left-wing05.png
  34. BIN
      examples/dragon/images/left-wing06.png
  35. BIN
      examples/dragon/images/left-wing07.png
  36. BIN
      examples/dragon/images/left-wing08.png
  37. BIN
      examples/dragon/images/left-wing09.png
  38. BIN
      examples/dragon/images/right-wing01.png
  39. BIN
      examples/dragon/images/right-wing02.png
  40. BIN
      examples/dragon/images/right-wing03.png
  41. BIN
      examples/dragon/images/right-wing04.png
  42. BIN
      examples/dragon/images/right-wing05.png
  43. BIN
      examples/dragon/images/right-wing06.png
  44. BIN
      examples/dragon/images/right-wing07.png
  45. BIN
      examples/dragon/images/right-wing08.png
  46. BIN
      examples/dragon/images/right-wing09.png
  47. 43 139
      examples/export/runtimes.sh
  48. 3 3
      examples/goblins/export/goblins-ess.json
  49. BIN
      examples/goblins/export/goblins-ess.skel
  50. 304 282
      examples/goblins/export/goblins-pro.json
  51. BIN
      examples/goblins/export/goblins-pro.skel
  52. 2 2
      examples/hero/export/hero-ess.json
  53. BIN
      examples/hero/export/hero-ess.skel
  54. 549 499
      examples/hero/export/hero-pro.json
  55. BIN
      examples/hero/export/hero-pro.skel
  56. BIN
      examples/mix-and-match/export/mix-and-match-pma.png
  57. 83 32
      examples/mix-and-match/export/mix-and-match-pro.json
  58. BIN
      examples/mix-and-match/export/mix-and-match-pro.skel
  59. BIN
      examples/mix-and-match/export/mix-and-match.png
  60. BIN
      examples/owl/export/owl-pma.png
  61. 8 11
      examples/owl/export/owl-pro.json
  62. BIN
      examples/owl/export/owl-pro.skel
  63. BIN
      examples/owl/export/owl.png
  64. 2 2
      examples/powerup/export/powerup-ess.json
  65. BIN
      examples/powerup/export/powerup-ess.skel
  66. 51 49
      examples/powerup/export/powerup-pro.json
  67. BIN
      examples/powerup/export/powerup-pro.skel
  68. BIN
      examples/raptor/export/raptor-pma.png
  69. 4 4
      examples/raptor/export/raptor-pro.json
  70. BIN
      examples/raptor/export/raptor-pro.skel
  71. BIN
      examples/raptor/export/raptor.png
  72. BIN
      examples/raptor/raptor-pro.spine
  73. 2 2
      examples/speedy/export/speedy-ess.json
  74. BIN
      examples/speedy/export/speedy-ess.skel
  75. 3 3
      examples/spineboy/export/spineboy-ess.json
  76. BIN
      examples/spineboy/export/spineboy-ess.skel
  77. BIN
      examples/spineboy/export/spineboy-pma.png
  78. 78 70
      examples/spineboy/export/spineboy-pro.json
  79. BIN
      examples/spineboy/export/spineboy-pro.skel
  80. BIN
      examples/spineboy/export/spineboy.png
  81. 2 2
      examples/spinosaurus/export/spinosaurus-ess.json
  82. BIN
      examples/spinosaurus/export/spinosaurus-ess.skel
  83. 140 136
      examples/stretchyman/export/stretchyman-pro.json
  84. BIN
      examples/stretchyman/export/stretchyman-pro.skel
  85. BIN
      examples/tank/export/tank-pma.png
  86. 64 60
      examples/tank/export/tank-pro.json
  87. BIN
      examples/tank/export/tank-pro.skel
  88. BIN
      examples/tank/export/tank.png
  89. 2 2
      examples/vine/export/vine-pro.json
  90. BIN
      examples/vine/export/vine-pro.skel
  91. 2 2
      examples/windmill/export/windmill-ess.json
  92. BIN
      examples/windmill/export/windmill-ess.skel
  93. BIN
      examples/windmill/export/windmill-pma.png
  94. BIN
      examples/windmill/export/windmill.png
  95. 1 1
      formatters/README.md
  96. 4 6
      formatters/build.gradle
  97. 7 8
      formatters/format.sh
  98. 3 1
      formatters/settings.gradle
  99. 1 1
      spine-c/README.md
  100. 18 1
      spine-c/spine-c/include/spine/Animation.h

+ 19 - 12
.gitignore

@@ -60,13 +60,6 @@ spine-monogame/example/obj
 spine-monogame/example/Content/bin/
 spine-monogame/example/Content/obj/
 
-spine-xna/bin
-spine-xna/obj
-spine-xna/example/bin
-spine-xna/example/obj
-spine-xna/example-content/obj/
-spine-xna/.vs/
-
 spine-unity/Assets/spine-csharp*
 !spine-unity/Assets/spine-csharp/Place spine-csharp src here.*
 !spine-unity/Assets/spine-csharp/add spine-csharp src here.*
@@ -152,8 +145,22 @@ spine-ts/spine-canvas/dist
 spine-ts/spine-webgl/dist
 spine-ts/spine-player/dist
 spine-ts/spine-threejs/dist
-spine-godot/godot
-spine-godot/spine_godot/spine-cpp
-spine-godot/spine_godot/__pycache__
-spine-godot/example/.import
-spine-godot/spine_godot/*.o
+spine-libgdx/gradle
+spine-libgdx/gradlew
+spine-libgdx/gradlew.bat
+spine-monogame/packages
+spine-monogame/spine-monogame/bin
+spine-monogame/spine-monogame/obj
+spine-monogame/spine-monogame-example/Content/bin
+spine-monogame/spine-monogame-example/Content/obj
+spine-monogame/spine-monogame-example/bin
+spine-monogame/spine-monogame-example/obj
+spine-libgdx/spine-libgdx/out
+spine-libgdx/spine-skeletonviewer/out
+spine-cocos2d-objc/cocos2d/
+cmake-build-release
+spine-cocos2dx/example-v4/build-ios
+spine-cocos2dx/example-v4/build-macos
+spine-cocos2dx/example/build-ios
+spine-cocos2dx/example/proj.android/app/.cxx
+spine-cocos2dx/example/build-win

+ 154 - 2
CHANGELOG.md

@@ -1,3 +1,142 @@
+# 4.1
+
+## C
+* **Additions**
+  * Support for sequences.
+  * Support for `shortestRotation` in animation state. See https://github.com/esotericsoftware/spine-runtimes/issues/2027.
+  * Added CMake parameter `SPINE_SANITIZE` which will enable sanitizers on macOS and Linux.
+  * Added `SPINE_MAJOR_VERSION`, `SPINE_MINOR_VERSION`, and `SPINE_VERSION_STRING`. Parsing skeleton .JSON and .skel files will report an error if the skeleton version does not match the runtime version.
+* **Breaking changes**
+  * `spRegionAttachment` and `spMeshAttachment` now contain a `spTextureRegion*` instead of encoding region fields directly.
+  * `sp_AttachmentLoader_newRegionAttachment()` and `spAttachmentLoader_newMeshAttachment()` now take an additional `Sequence*` parameter.
+  * `spMeshAttachment_updateUVs()` was renamed to `spMeshAttachment_updateRegion()`.
+  * `spRegionAttachment_updateOffset()` was renamed to `spRegionAttachment_updateRegion()`, `spRegionAttachment_setUVs()` was merged into `spRegionAttachment_updateRegion()`.
+  * `spSlot_getAttachmentTime()` and `spSlot_setAttachmentTime()` have been removed.
+  * `spVertexAttachment->deformAttachment` was renamed to `spVertexAttachment->timelineAttachment`.
+  * `spSkeleton_update()` has been removed.
+  * `spSkeleton->time` has been removed.
+
+### SFML
+  * Updated example to use SFML 2.5.1.
+  * Added dragon example.
+
+## C++
+* **Additions**
+  * Support for sequences.
+  * Support for `shortestRotation` in animation state. See https://github.com/esotericsoftware/spine-runtimes/issues/2027.
+  * Added CMake parameter `SPINE_SANITIZE` which will enable sanitizers on macOS and Linux.
+    * Added `SPINE_MAJOR_VERSION`, `SPINE_MINOR_VERSION`, and `SPINE_VERSION_STRING`. Parsing skeleton .JSON and .skel files will report an error if the skeleton version does not match the runtime version.
+* **Breaking changes**
+  * `RegionAttachment` and `MeshAttachment` now contain a `TextureRegion*` instead of encoding region fields directly.
+  * `AttachmentLoader::newRegionAttachment()` and `AttachmentLoader::newMeshAttachment()` now take an additional `Sequence*` parameter.
+  * `MeshAttachment::updateUVs()` was renamed to `MeshAttachment::updateRegion()`.
+  * `RegionAttachment::updateOffset()` was renamed to `RegionAttachment::updateRegion()`, `RegionAttachment::setUVs()` was merged into `updateRegion()`.
+  * `Slot::getAttachmentTime()` and `Slot::setAttachmentTime()` have been removed.
+  * `VertexAttachment::getDeformAttachment()` was renamed to `VertexAttachment::getTimelineAttachment()`.
+  * `Skeleton::update()` has been removed.
+  * `Skeleton::getTime()` has been removed.
+  
+### Cocos2d-x
+
+### SFML
+  * Updated example to use SFML 2.5.1.
+  * Added dragon example.
+
+### UE4
+  * Updated example project to UE 4.27
+
+## C# ##
+
+* **Additions**
+  * Full support for sequences.
+  * Support for `shortestRotation` in animation state. See https://github.com/esotericsoftware/spine-runtimes/issues/2027.
+  * `RegionAttachment` and `MeshAttachment` now provide a `Region` property. Use this property instead of the removed `RendererObject` property (see section *Breaking Changes* below).
+
+* **Breaking changes**
+  * Removed `RendererObject` property from `RegionAttachment` and `MeshAttachment`. Use `attachment.Region` property instead. Removed removed `IHasRendererObject` interface. Use `IHasTextureRegion` instead.
+  * Replaced `RegionAttachment.UpdateOffset` and `MeshAttachment.UpdateUVs` with `Attachment.UpdateRegion`. The caller must ensure that the attachment's region is not `null`.
+  * Removed `AttachmentRegionExtensions` methods `Attachment.SetRegion`, `MeshAttachment.SetRegion` and `RegionAttachment.SetRegion(region, update)`. Use `attachment.Region = region; if (update) attachment.UpdateRegion()` instead.
+  * `AttachmentLoader.NewRegionAttachment()` and `AttachmentLoader.NewMeshAttachment()` take an additional `Sequence` parameter.
+  * `VertexAttachment.DeformAttachment` property has been replaced with `VertexAttachment.TimelineAttachment`.
+  * `RegionAttachment.ComputeWorldVertices()` takes a `Slot` instead of a `Bone` as the first argument.
+  * Removed `Skeleton.Update(float deltaTime)` method.
+  * Removed `Slot.AttachmentTime` property.
+  * Removed extension method `AtlasRegion.GetSpineAtlasRect()` parameter `includeRotate` (with default value `true`). Most likely this method was never used with `includeRotate=false` in user code so no changes are required.
+  * `AtlasRegion.PackedWidth` and `AtlasRegion.PackedHeight` are swapped compared to 4.0 when packing rotation is equal to 90 degrees. Most likely this property was never accessed in user code so no changes are required.
+
+### Unity
+
+* **Officially supported Unity versions are 2017.1-2021.1**.
+
+* **Additions**
+  * `SpineAtlasAsset.CreateRuntimeInstance` methods now provide an optional `newCustomTextureLoader` parameter (defaults to `null`) which can be set to e.g. `(a) => new YourCustomTextureLoader(a)` to use your own `TextureLoader` subclass instead of `MaterialsTextureLoader`.
+  * `SkeletonAnimation`, `SkeletonMecanim` and `SkeletonGraphic` now provide an Inspector parameter `Advanced` - `Animation Update` with modes `In Update` **(previous behaviour, the default)**, `In FixedUpdate` and `Manual Update`. This allows to update animation in `FixedUpdate` when using the `SkeletonRootMotion` component (which is the recommended combination now, issuing a warning otherwise). The reason is that when root motion leads to a collision with a physics collider, it can introduce jittery excess movement when updating animation in `Update` due to more `Update` calls following a single `FixedUpdate` call.
+  * Added `SkeletonRootMotion` properties `PreviousRigidbodyRootMotion` and `AdditionalRigidbody2DMovement`. Setting or querying these movement vectors can be necessary when multiple scripts call `Rigidbody2D.MovePosition` on the same object where the last call overwrites the effect of preceding ones.
+  * `BoneFollower` and `BoneFollowerGraphic` now provide an additional `Follow Parent World Scale` parameter to allow following simple scale of parent bones (rotated/skewed scale can't be supported).
+  * Improved `Advanced - Fix Prefab Override MeshFilter` property for `SkeletonRenderer` (and subclasses`SkeletonAnimation` and `SkeletonMecanim`), now providing an additional option to use a global value which can be set in `Edit - Preferences - Spine`.
+  * Timeline naming improvements: `Spine AnimationState Clip` Inspector parameter `Custom Duration` changed and inverted to `Default Mix Duration` for more clarity. Shortened all Timeline add track menu entries from: `Spine.Unity.Playables - <track type>` to `Spine - <track type>`, `Spine Animation State Track` to `SkeletonAnimation Track`, `Spine AnimationState Graphic Track` to `SkeletonGraphic Track`, and `Spine Skeleton Flip Track` to `Skeleton Flip Track`.
+  * Timeline track appearance and Inspector: Tracks now show icons and track colors to make them easier to distinguish. When a Track is selected, the Inspector now shows an editable track name which was previously only editable at the Timeline asset.
+  * Added example component `SkeletonRenderTexture` to render a `SkeletonRenderer` to a `RenderTexture`, mainly for proper transparency. Added an example scene named `RenderTexture FadeOut Transparency` that demonstrates usage for a fadeout transparency effect.
+  * Added another fadeout example component named `SkeletonRenderTextureFadeout` which takes over transparency fadeout when enabled. You can use this component as-is, attach it in disabled state and enable it to start a fadeout effect.
+  * Timeline clips now offer an additional `Alpha` parameter for setting a custom constant mix alpha value other than 1.0, just as `TrackEntry.Alpha`. Defaults to 1.0.
+
+* **Breaking changes**
+
+* **Changes of default values**
+
+* **Deprecated**
+
+* **Restructuring (Non-Breaking)**
+
+### XNA/MonoGame
+* **Breaking change**: Removed spine-xna in favor of spine-monogame. See https://github.com/EsotericSoftware/spine-runtimes/issues/1949
+* Added new spine-monogame solution. See [spine-monogame/README.md](spine-monogame/README.md) for updated instructions on how to use spine-monogame.
+
+## Java
+* **Additions**
+  * Support for `shortestRotation` in animation state. See https://github.com/esotericsoftware/spine-runtimes/issues/2027.
+  * Support for sequences.
+* **Breaking changes**
+  * `AttachmentLoader#newRegionAttachment()` and `AttachmentLoader#newMeshAttachment()` take an additional `Sequence` parameter.
+  * `Slot#setAttachmentTime()` and `Slot#getAttachmentTime()` have been removed.
+  * `VertexAttachment#setDeformAttachment()` and `VertexAttachment#getDeformAttachment()` have been replaced with `VertexAttachment#setTimelineAttachment()` and `VertexAttachment#getTimelineAttachment()`.
+  * `RegionAttachment#updateOffset()` has been renamed to `RegionAttachment#updateRegion()`. The caller must ensure that the attachment's region is not `null`.
+  * `RegionAttachment#computeWorldVertices()` takes a `Slot` instead of a `Bone` as the first argument.
+
+
+### libGDX
+* `spine-libgdx`, `spine-libgdx-tests`, and `spine-skeletonviewer` are now fully Gradle-ified.
+* `spine-skeletonviewer` now supports quickly loading skeletons by dragging and dropping `.json` or `.skel` skeleton files onto the window.
+
+## Typescript/Javascript
+* **Additions**
+  * full support for sequences.
+  * Added `Promise` based `AssetManager.loadAll()`. Allows synchronous waiting via `await assetManager.loadAll()`, simplifying loader logic in applications.
+  * Support for `shortestRotation` in animation state. See https://github.com/esotericsoftware/spine-runtimes/issues/2027.
+  * Full support for sequences.
+* **Breaking changes**
+  * `AttachmentLoader#newRegionAttachment()` and `AttachmentLoader#newMeshAttachment()` take an additional `Sequence` parameter.
+  * `Slot#attachmentTime` and has been removed.
+  * `VertexAttachment#deformAttachment` has been replaced with `VertexAttachment#timelineAttachment`.
+  * `RegionAttachment#updateOffset()` has been renamed to `RegionAttachment#updateRegion()`. The caller must ensure that the attachment's region is not `null`.
+  * `RegionAttachment#computeWorldVertices()` takes a `Slot` instead of a `Bone` as the first argument.
+  * Removed `PlayerEditor`.
+
+### WebGL backend
+  * `PolygonBatcher.start()` now disables culling and restores the previous state on `PolygonBatcher.end()`.
+  * Added `SpineCanvas`, a simpler way to render a scene via spine-webgl. See `spine-ts/spine-webgl/examples/barebones.html` and `spine-ts/spine-webgl/examples/mix-and-match.html`.
+
+### Canvas backend
+  * Improved example.
+
+### Three.js backend
+  * Added orbital controls to THREJS example.
+  * `SkeletonMesh` takes an optional `SkeletonMeshMaterialCustomizer`, allowing modification of materials used by `SkeletonMesh`.
+  * Added `SkeletonMeshMaterial.alphaTest`, when > 0, alpha testing will be performed and fragments will not be written to the depth buffer, if depth writes are enabled. 
+
+### Player
+  * Added `SpinePlayer.dispose()` to explicitely dispose of all resources the player holds on to.
+
 # 4.0
 
 ## AS3
@@ -63,7 +202,7 @@
 * Generated normals are now correctly flipped for back faces.
 * Modifying parent materials updates material instances accordingly.
 * Only `.json` files that are actually encoding Spine skeletons will be loaded. Other `.json` files will be left to other importers.
-* Updated example project to UE 4.25.
+* Updated example project to UE 4.27.
 
 
 ## C# ##
@@ -110,7 +249,7 @@
   * Fixed Timeline not pausing (and resuming) clip playback on Director pause, this is now the default behaviour. If you require the old behaviour (e.g. to continue playing an idle animation during Director pause), there is now an additional parameter `Don't Pause with Director` provided that can be enabled for each Timeline clip.
   * Fixed Timeline `Spine AnimationState Clips` ignoring empty space on the Timeline after a clip's end. Timeline clips now also offer `Don't End with Clip` and `Clip End Mix Out Duration` parameters if you prefer the old behaviour of previous versions. By default when empty space follows the clip on the timeline, the empty animation is set on the track with a MixDuration of `Clip End Mix Out Duration`. Set `Don't End with Clip` to `true` to continue playing the clip's animation instead and mimic the old 3.8 behaviour. If you prefer pausing the animation instead of mixing out to the empty animation, set `Clip End Mix Out Duration` to a value less than 0, then the animation is paused instead.
 
-* **Additions**
+* **Additions and Improvements**
   * Additional **Fix Draw Order** parameter at SkeletonRenderer, defaults to `disabled` (previous behaviour).
     Applies only when 3+ submeshes are used (2+ materials with alternating order, e.g. "A B A").
 		If `true`, MaterialPropertyBlocks are assigned at each material to prevent aggressive batching of submeshes
@@ -159,6 +298,13 @@
   * Prefabs containing `SkeletonRenderer`, `SkeletonAnimation` and `SkeletonMecanim` now provide a proper Editor preview, including the preview thumbnail.
   * `SkeletonRenderer` (and subclasses`SkeletonAnimation` and `SkeletonMecanim`) now provide a property `Advanced - Fix Prefab Override MeshFilter`, which when enabled fixes the prefab always being marked as changed. It sets the MeshFilter's hide flags to `DontSaveInEditor`. Unfortunately this comes at the cost of references to the `MeshFilter` by other components being lost, therefore this parameter defaults to `false` to keep the safe existing behaviour.
   * `BoundingBoxFollower` and `BoundingBoxFollowerGraphic` now provide previously missing `usedByEffector` and `usedByComposite` parameters to be set at all generated colliders.
+  * `BoneFollower` and `BoneFollowerGraphic` now provide an additional `Follow Parent World Scale` parameter to allow following simple scale of parent bones (rotated/skewed scale can't be supported).
+  * Improved `Advanced - Fix Prefab Override MeshFilter` property for `SkeletonRenderer` (and subclasses`SkeletonAnimation` and `SkeletonMecanim`), now providing an additional option to use a global value which can be set in `Edit - Preferences - Spine`.
+  * Timeline naming improvements: `Spine AnimationState Clip` Inspector parameter `Custom Duration` changed and inverted to `Default Mix Duration` for more clarity. Shortened all Timeline add track menu entries from: `Spine.Unity.Playables - <track type>` to `Spine - <track type>`, `Spine Animation State Track` to `SkeletonAnimation Track`, `Spine AnimationState Graphic Track` to `SkeletonGraphic Track`, and `Spine Skeleton Flip Track` to `Skeleton Flip Track`.
+  * Timeline track appearance and Inspector: Tracks now show icons and track colors to make them easier to distinguish. When a Track is selected, the Inspector now shows an editable track name which was previously only editable at the Timeline asset.
+  * Added example component `SkeletonRenderTexture` to render a `SkeletonRenderer` to a `RenderTexture`, mainly for proper transparency. Added an example scene named `RenderTexture FadeOut Transparency` that demonstrates usage for a fadeout transparency effect.
+  * Added another fadeout example component named `SkeletonRenderTextureFadeout` which takes over transparency fadeout when enabled. You can use this component as-is, attach it in disabled state and enable it to start a fadeout effect.
+  * Timeline clips now offer an additional `Alpha` parameter for setting a custom constant mix alpha value other than 1.0, just as `TrackEntry.Alpha`. Defaults to 1.0.
 
 * **Changes of default values**
 
@@ -232,6 +378,8 @@
 ### Three.js backend
 * `SkeletonMesh` now takes an optional `SkeletonMeshMaterialParametersCustomizer` function that allows you to modify the `ShaderMaterialParameters` before the material is finalized. Use it to modify things like THREEJS' `Material.depthTest` etc. See #1590.
 * **Breaking change:** the global object `spine.canvas` no longer exists. All classes and functions are now exposed on the global `spine` object directly. Simply replace any reference to `spine.threejs.` in your source code with `spine.`.
+* **Breaking change:** the default fragment shader of `SkeletonMeshMaterial` now explicitely discards fragments with alpha < 0.5. See https://github.com/EsotericSoftware/spine-runtimes/issues/1985
+* **Breaking change:** reversal of the previous breaking change: the default fragment shader of `SkeletonMeshMaterial` does no longer discard fragments with alpha < 0.5. Pass a `SkeletonMeshMaterialParametersCustomizer` to the `SkeletonMesh` constructor, and modify `parameters.alphaTest` to be > 0.
 
 ### Player
 * Added `SpinePlayerConfig.rawDataURIs`. Allows to embed data URIs for skeletons, atlases and atlas page images directly in the HTML/JS without needing to load it from a separate file. See the example for a demonstration.
@@ -240,6 +388,7 @@
 * Added `SpinePlayerConfig.draw`. If set, the callback is called each frame, just after the skeleton is drawn.
 * Added `SpinePlayerConfig.downloader`. The `spine.Downloader` instance can be shared between players so assets are only downloaded once.
 * If `SpinePlayerConfig.jsonURL` ends with an anchor, the anchor text is used to find the skeleton in the specified JSON file.
+* Added `SpinePlayer.dispose()`, disposes all CPU and GPU side resources, removes all listeners, and removes the player DOM from the parent.
 
 # 3.8
 
@@ -625,6 +774,8 @@
   * Added `MeshAttachment#newLinkedMesh()`, creates a linked mesh linkted to either the original mesh, or the parent of the original mesh.
   * Added IK softness.
   * Added `AssetManager.setRawDataURI(path, data)`. Allows to embed data URIs for skeletons, atlases and atlas page images directly in the HTML/JS without needing to load it from a separate file.
+  * Added `AssetManager.loadAll()` to allow Promise/async/await based waiting for completion of asset load. See the `spine-canvas` examples.
+  * Added `Skeleton.getBoundRect()` helper method to calculate the bouding rectangle of the current pose, returning the result as `{ x, y, width, height }`. Note that this method will create temporary objects which can add to garbage collection pressure.
 
 ### WebGL backend
 * `Input` can now take a partially defined implementation of `InputListener`.
@@ -867,6 +1018,7 @@ This will automatically:
   * Support for audio events, see `audioPath`, `volume` and `balance` fields on event (data).
   * `TrackEntry` has an additional field called `holdPrevious`. It can be used to counter act a limitation of `AnimationState` resulting in "dipping" of parts of the animation. For a full discussion of the problem and the solution we've implemented, see this [forum thread](http://esotericsoftware.com/forum/Probably-Easy-Animation-mixing-with-multiple-tracks-10682?p=48130&hilit=holdprevious#p48130).
   * Added `AssetManager#setRawDataURI(path, data)`. Allows to set raw data URIs for a specific path, which in turn enables embedding assets into JavaScript/HTML.
+  * `PolygonBatcher` will now disable `CULL_FACE` and restore the state as it was before rendering.
 
 ### WebGL backend
 * Added `VertexEffect` interface, instances of which can be set on `SkeletonRenderer`. Allows to modify vertices before submitting them to GPU. See `SwirlEffect`, `JitterEffect`, and the example which allows to set effects.

+ 11 - 17
CMakeLists.txt

@@ -1,6 +1,11 @@
 cmake_minimum_required(VERSION 3.17)
 project(spine)
 
+set(CMAKE_INSTALL_PREFIX "./")
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(SPINE_SFML FALSE CACHE BOOL FALSE)
+set(SPINE_SANITIZE FALSE CACHE BOOL FALSE)
+
 if(MSVC)
 	message("MSCV detected")
 	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
@@ -8,13 +13,12 @@ if(MSVC)
 else()
 	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wunused-value -Wno-c++11-long-long -Wno-variadic-macros -Werror -Wextra -pedantic -Wnonportable-include-path -Wshadow -std=c89")
 	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wunused-value -Wno-c++11-long-long -Wno-variadic-macros -Werror -Wextra -Wnon-virtual-dtor -pedantic -Wnonportable-include-path -Wshadow -std=c++11 -fno-exceptions -fno-rtti")
-endif()
 
-set(CMAKE_INSTALL_PREFIX "./")
-set(CMAKE_VERBOSE_MAKEFILE ON)
-set(SPINE_SFML FALSE CACHE BOOL FALSE)
-set(SPINE_COCOS2D_OBJC FALSE CACHE BOOL FALSE)
-set(SPINE_COCOS2D_X FALSE CACHE BOOL FALSE)
+	if (${SPINE_SANITIZE})
+		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize=undefined")
+		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=undefined")
+	endif()
+endif()
 
 if((${SPINE_SFML}) OR (${CMAKE_CURRENT_BINARY_DIR} MATCHES "spine-sfml"))
 	add_subdirectory(spine-c)
@@ -23,15 +27,5 @@ if((${SPINE_SFML}) OR (${CMAKE_CURRENT_BINARY_DIR} MATCHES "spine-sfml"))
 	add_subdirectory(spine-sfml/cpp)
 endif()
 
-if((${SPINE_COCOS2D_OBJC}) OR (${CMAKE_CURRENT_BINARY_DIR} MATCHES "spine-cocos2d-objc"))
-	if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
-		add_subdirectory(spine-cocos2d-objc)
-	endif()
-endif()
-
-if((${SPINE_COCOS2D_X}) OR (${CMAKE_CURRENT_BINARY_DIR} MATCHES "spine-cocos2dx"))
-	add_subdirectory(spine-cocos2dx)
-endif()
-
 # add_subdirectory(spine-c/spine-c-unit-tests)
-add_subdirectory(spine-cpp/spine-cpp-unit-tests)
+add_subdirectory(spine-cpp/spine-cpp-unit-tests)

+ 10 - 10
examples/alien/export/alien-ess.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "zgiHK9o7sFk",
-	"spine": "4.0.31",
+	"hash": "F735snjE3r4",
+	"spine": "4.1.23-beta",
 	"x": -191.3,
 	"y": -4.51,
 	"width": 365.79,
@@ -245,24 +245,24 @@
 			},
 			"eye": {
 				"attachment": [
-					{ "time": 1.3667, "name": null }
+					{ "time": 1.3667 }
 				]
 			},
 			"eye-highlight": {
 				"attachment": [
-					{ "time": 1.3667, "name": null }
+					{ "time": 1.3667 }
 				]
 			},
 			"eye-pupil": {
 				"attachment": [
-					{ "time": 1.3667, "name": null }
+					{ "time": 1.3667 }
 				]
 			},
 			"head": {
 				"attachment": [
 					{ "time": 0.2333, "name": "burst01" },
 					{ "time": 0.4667, "name": "burst02" },
-					{ "time": 1.3667, "name": null }
+					{ "time": 1.3667 }
 				]
 			},
 			"splat01": {
@@ -279,7 +279,7 @@
 					{ "time": 1.3667, "name": "splat01" },
 					{ "time": 1.5667, "name": "splat02" },
 					{ "time": 1.7333, "name": "splat03" },
-					{ "time": 1.8667, "name": null }
+					{ "time": 1.8667 }
 				]
 			}
 		},
@@ -739,7 +739,7 @@
 		"slots": {
 			"eye-highlight": {
 				"attachment": [
-					{ "name": null }
+					{}
 				]
 			}
 		},
@@ -853,7 +853,7 @@
 		"slots": {
 			"eye-highlight": {
 				"attachment": [
-					{ "name": null }
+					{}
 				]
 			}
 		},
@@ -1037,7 +1037,7 @@
 		"slots": {
 			"eye-highlight": {
 				"attachment": [
-					{ "name": null }
+					{}
 				]
 			}
 		},

BIN
examples/alien/export/alien-ess.skel


BIN
examples/alien/export/alien-pma.png


File diff suppressed because it is too large
+ 69 - 67
examples/alien/export/alien-pro.json


BIN
examples/alien/export/alien-pro.skel


BIN
examples/alien/export/alien.png


+ 2 - 2
examples/coin/export/coin-pro.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "svidebPqqeg",
-	"spine": "4.0.31",
+	"hash": "oo0dBSCqNHM",
+	"spine": "4.1.23-beta",
 	"x": -152.5,
 	"y": -151,
 	"width": 305,

BIN
examples/coin/export/coin-pro.skel


BIN
examples/dragon/dragon-ess.spine


+ 49 - 69
examples/dragon/export/dragon-ess.json

@@ -1,13 +1,13 @@
 {
 "skeleton": {
-	"hash": "UIFpNNbbcQI",
-	"spine": "4.0.31",
+	"hash": "aPoA1GjXkVI",
+	"spine": "4.1.23-beta",
 	"x": -366.31,
-	"y": -286.62,
+	"y": -327.81,
 	"width": 660.39,
-	"height": 604.09,
+	"height": 643,
 	"images": "./images/",
-	"audio": ""
+	"audio": "././"
 },
 "bones": [
 	{ "name": "root", "y": -176.12 },
@@ -297,7 +297,7 @@
 "slots": [
 	{ "name": "left-rear-leg", "bone": "left-rear-leg", "attachment": "left-rear-leg" },
 	{ "name": "left-rear-thigh", "bone": "left-rear-thigh", "attachment": "left-rear-thigh" },
-	{ "name": "left-wing", "bone": "left-wing", "attachment": "left-wing01" },
+	{ "name": "left-wing", "bone": "left-wing", "attachment": "left-wing" },
 	{ "name": "tail6", "bone": "tail6", "attachment": "tail06" },
 	{ "name": "tail5", "bone": "tail5", "attachment": "tail05" },
 	{ "name": "tail4", "bone": "tail4", "attachment": "tail04" },
@@ -323,7 +323,7 @@
 	{ "name": "right-front-toe2", "bone": "right-front-toe2", "attachment": "front-toe-b" },
 	{ "name": "right-front-toe3", "bone": "right-front-toe3", "attachment": "front-toe-b" },
 	{ "name": "chin", "bone": "chin", "attachment": "chin" },
-	{ "name": "right-wing", "bone": "right-wing", "attachment": "right-wing01" },
+	{ "name": "right-wing", "bone": "right-wing", "attachment": "right-wing" },
 	{ "name": "head", "bone": "head", "attachment": "head" },
 	{ "name": "thiagobrayner", "bone": "root", "attachment": "thiagobrayner" }
 ],
@@ -376,15 +376,14 @@
 				"left-rear-thigh": { "x": 56.03, "y": 27.39, "rotation": 74.94, "width": 91, "height": 149 }
 			},
 			"left-wing": {
-				"left-wing01": { "x": 129.21, "y": -45.49, "rotation": -83.7, "width": 191, "height": 256 },
-				"left-wing02": { "x": 126.38, "y": -31.69, "rotation": -86.19, "width": 179, "height": 269 },
-				"left-wing03": { "x": 110.27, "y": -90.89, "rotation": -86.19, "width": 186, "height": 207 },
-				"left-wing04": { "x": -61.62, "y": -83.27, "rotation": -86.19, "width": 188, "height": 135 },
-				"left-wing05": { "x": -90.02, "y": -78.14, "rotation": -86.19, "width": 218, "height": 213 },
-				"left-wing06": { "x": -143.77, "y": -83.72, "rotation": -86.19, "width": 192, "height": 331 },
-				"left-wing07": { "x": -133.05, "y": -33.9, "rotation": -86.19, "width": 159, "height": 255 },
-				"left-wing08": { "x": 50.15, "y": -15.71, "rotation": -86.19, "width": 164, "height": 181 },
-				"left-wing09": { "x": 85.94, "y": -11.33, "rotation": -86.19, "width": 204, "height": 167 }
+				"left-wing": {
+					"x": -36.32,
+					"y": -44.53,
+					"rotation": -83.7,
+					"width": 264,
+					"height": 589,
+					"sequence": { "count": 9, "digits": 2 }
+				}
 			},
 			"right-front-leg": {
 				"right-front-leg": { "x": 17.8, "y": 4.23, "rotation": 37.63, "width": 101, "height": 89 }
@@ -417,15 +416,14 @@
 				"right-rear-toe": { "x": 47.46, "y": -7.64, "rotation": 134.34, "width": 109, "height": 77 }
 			},
 			"right-wing": {
-				"right-wing01": { "x": 170.08, "y": -23.68, "rotation": -130.34, "width": 219, "height": 310 },
-				"right-wing02": { "x": 171.15, "y": -19.33, "rotation": -130.34, "width": 203, "height": 305 },
-				"right-wing03": { "x": 166.46, "y": 29.24, "rotation": -130.34, "width": 272, "height": 247 },
-				"right-wing04": { "x": 42.94, "y": 134.06, "rotation": -130.34, "width": 279, "height": 144 },
-				"right-wing05": { "x": -8.84, "y": 142.59, "rotation": -130.34, "width": 251, "height": 229 },
-				"right-wing06": { "x": -123.33, "y": 111.22, "rotation": -130.34, "width": 200, "height": 366 },
-				"right-wing07": { "x": -40.17, "y": 118.03, "rotation": -130.34, "width": 200, "height": 263 },
-				"right-wing08": { "x": 48.02, "y": 28.76, "rotation": -130.34, "width": 234, "height": 254 },
-				"right-wing09": { "x": 128.1, "y": 21.13, "rotation": -130.34, "width": 248, "height": 204 }
+				"right-wing": {
+					"x": 35.09,
+					"y": 78.11,
+					"rotation": -130.34,
+					"width": 365,
+					"height": 643,
+					"sequence": { "count": 9, "digits": 2 }
+				}
 			},
 			"tail1": {
 				"tail01": { "x": 22.6, "y": -4.5, "rotation": 163.85, "width": 120, "height": 153 }
@@ -453,50 +451,6 @@
 ],
 "animations": {
 	"flying": {
-		"slots": {
-			"left-wing": {
-				"attachment": [
-					{ "time": 0.0667, "name": "left-wing02" },
-					{ "time": 0.1333, "name": "left-wing03" },
-					{ "time": 0.2, "name": "left-wing04" },
-					{ "time": 0.2667, "name": "left-wing05" },
-					{ "time": 0.3333, "name": "left-wing06" },
-					{ "time": 0.4, "name": "left-wing07" },
-					{ "time": 0.4667, "name": "left-wing08" },
-					{ "time": 0.5333, "name": "left-wing09" },
-					{ "time": 0.6, "name": "left-wing01" },
-					{ "time": 0.7333, "name": "left-wing02" },
-					{ "time": 0.8, "name": "left-wing03" },
-					{ "time": 0.8333, "name": "left-wing04" },
-					{ "time": 0.8667, "name": "left-wing05" },
-					{ "time": 0.9, "name": "left-wing06" },
-					{ "time": 0.9333, "name": "left-wing07" },
-					{ "time": 0.9667, "name": "left-wing08" },
-					{ "time": 1, "name": "left-wing01" }
-				]
-			},
-			"right-wing": {
-				"attachment": [
-					{ "time": 0.0667, "name": "right-wing02" },
-					{ "time": 0.1333, "name": "right-wing03" },
-					{ "time": 0.2, "name": "right-wing04" },
-					{ "time": 0.2667, "name": "right-wing05" },
-					{ "time": 0.3333, "name": "right-wing06" },
-					{ "time": 0.4, "name": "right-wing07" },
-					{ "time": 0.4667, "name": "right-wing08" },
-					{ "time": 0.5333, "name": "right-wing09" },
-					{ "time": 0.6, "name": "right-wing01" },
-					{ "time": 0.7333, "name": "right-wing02" },
-					{ "time": 0.8, "name": "right-wing03" },
-					{ "time": 0.8333, "name": "right-wing04" },
-					{ "time": 0.8667, "name": "right-wing05" },
-					{ "time": 0.9, "name": "right-wing06" },
-					{ "time": 0.9333, "name": "right-wing07" },
-					{ "time": 0.9667, "name": "right-wing08" },
-					{ "time": 1, "name": "right-wing01" }
-				]
-			}
-		},
 		"bones": {
 			"back": {
 				"rotate": [
@@ -1093,6 +1047,32 @@
 					{ "time": 1 }
 				]
 			}
+		},
+		"attachments": {
+			"default": {
+				"left-wing": {
+					"left-wing": {
+						"sequence": [
+							{ "mode": "loop", "delay": 0.0667 },
+							{ "time": 0.6 },
+							{ "time": 0.7333, "mode": "loop", "index": 1 },
+							{ "time": 0.8, "mode": "loop", "index": 2, "delay": 0.0333 },
+							{ "time": 0.9667, "index": 7 }
+						]
+					}
+				},
+				"right-wing": {
+					"right-wing": {
+						"sequence": [
+							{ "mode": "loop", "delay": 0.0667 },
+							{ "time": 0.6 },
+							{ "time": 0.7333, "mode": "loop", "index": 1 },
+							{ "time": 0.8, "mode": "loop", "index": 2, "delay": 0.0333 },
+							{ "time": 0.9667, "index": 7 }
+						]
+					}
+				}
+			}
 		}
 	}
 }

BIN
examples/dragon/export/dragon-ess.skel


+ 77 - 60
examples/dragon/export/dragon-pma.atlas

@@ -3,110 +3,127 @@ dragon-pma.png
 	filter: Linear, Linear
 	pma: true
 back
-	bounds: 2, 334, 190, 185
+	bounds: 564, 534, 190, 185
 chest
-	bounds: 2, 697, 136, 122
+	bounds: 2, 645, 136, 122
 chin
-	bounds: 611, 613, 214, 146
+	bounds: 140, 619, 214, 146
 front-toe-a
-	bounds: 2, 914, 29, 50
+	bounds: 2, 862, 29, 50
 	rotate: 90
 front-toe-b
-	bounds: 467, 887, 56, 57
+	bounds: 467, 835, 56, 57
+	rotate: 90
+head
+	bounds: 756, 398, 296, 260
 	rotate: 90
 left-front-leg
-	bounds: 599, 886, 84, 57
+	bounds: 599, 834, 84, 57
 left-front-thigh
-	bounds: 782, 871, 84, 72
+	bounds: 782, 819, 84, 72
 left-rear-leg
-	bounds: 465, 434, 206, 177
+	bounds: 356, 558, 206, 177
 left-rear-thigh
-	bounds: 216, 819, 91, 149
+	bounds: 216, 767, 91, 149
 	rotate: 90
 left-wing01
-	bounds: 403, 241, 191, 256
+	bounds: 2, 268, 264, 589
 	rotate: 90
 left-wing02
-	bounds: 673, 401, 179, 269
-	rotate: 90
-left-wing03
-	bounds: 194, 286, 186, 207
-	rotate: 90
-left-wing04
-	bounds: 140, 682, 188, 135
-left-wing06
-	bounds: 661, 207, 192, 331
+	bounds: 2, 2, 264, 589
 	rotate: 90
-left-wing07
-	bounds: 2, 521, 159, 255
-	rotate: 90
-left-wing08
-	bounds: 827, 582, 164, 181
-	rotate: 90
-left-wing09
-	bounds: 259, 474, 204, 167
 right-front-leg
-	bounds: 113, 821, 101, 89
+	bounds: 113, 769, 101, 89
 right-front-thigh
-	bounds: 758, 761, 108, 108
+	bounds: 758, 709, 108, 108
 right-rear-leg
-	bounds: 640, 773, 116, 100
+	bounds: 640, 721, 116, 100
 right-rear-thigh
-	bounds: 367, 794, 91, 149
+	bounds: 367, 742, 91, 149
 	rotate: 90
 right-rear-toe
-	bounds: 2, 833, 109, 77
-right-wing02
-	bounds: 635, 2, 203, 305
-	rotate: 90
-right-wing04
-	bounds: 330, 643, 279, 144
-right-wing06
-	bounds: 2, 84, 200, 366
-	rotate: 90
-right-wing07
-	bounds: 370, 39, 200, 263
-	rotate: 90
+	bounds: 2, 781, 109, 77
 tail01
-	bounds: 868, 748, 120, 153
+	bounds: 868, 696, 120, 153
 	rotate: 90
 tail02
-	bounds: 518, 789, 95, 120
+	bounds: 518, 737, 95, 120
 	rotate: 90
 tail03
-	bounds: 868, 870, 73, 92
+	bounds: 868, 818, 73, 92
 	rotate: 90
 tail04
-	bounds: 526, 887, 56, 71
+	bounds: 526, 835, 56, 71
 	rotate: 90
 tail05
-	bounds: 406, 891, 52, 59
+	bounds: 406, 839, 52, 59
 	rotate: 90
 tail06
-	bounds: 685, 875, 95, 68
+	bounds: 685, 823, 95, 68
 thiagobrayner
-	bounds: 54, 912, 350, 31
+	bounds: 54, 860, 350, 31
 
 dragon-pma_2.png
-	size: 1024, 512
+	size: 1024, 1024
 	filter: Linear, Linear
 	pma: true
-head
-	bounds: 2, 214, 296, 260
+left-wing03
+	bounds: 2, 534, 264, 589
+	rotate: 90
+left-wing04
+	bounds: 2, 268, 264, 589
 	rotate: 90
 left-wing05
-	bounds: 741, 39, 218, 213
+	bounds: 593, 209, 264, 589
+left-wing06
+	bounds: 2, 2, 264, 589
+	rotate: 90
+
+dragon-pma_3.png
+	size: 1024, 1024
+	filter: Linear, Linear
+	pma: true
+left-wing07
+	bounds: 2, 694, 264, 589
+	rotate: 90
+left-wing08
+	bounds: 2, 428, 264, 589
 	rotate: 90
+left-wing09
+	bounds: 593, 369, 264, 589
 right-wing01
-	bounds: 264, 200, 219, 310
+	bounds: 2, 2, 365, 643
+	rotate: 90
+
+dragon-pma_4.png
+	size: 1024, 1024
+	filter: Linear, Linear
+	pma: true
+right-wing02
+	bounds: 2, 369, 365, 643
 right-wing03
-	bounds: 485, 238, 272, 247
+	bounds: 369, 369, 365, 643
+right-wing04
+	bounds: 2, 2, 365, 643
 	rotate: 90
+
+dragon-pma_5.png
+	size: 1024, 1024
+	filter: Linear, Linear
+	pma: true
 right-wing05
-	bounds: 734, 259, 251, 229
+	bounds: 2, 369, 365, 643
+right-wing06
+	bounds: 369, 369, 365, 643
+right-wing07
+	bounds: 2, 2, 365, 643
 	rotate: 90
+
+dragon-pma_6.png
+	size: 1024, 1024
+	filter: Linear, Linear
+	pma: true
 right-wing08
-	bounds: 485, 2, 234, 254
-	rotate: 90
+	bounds: 2, 2, 365, 643
 right-wing09
-	bounds: 2, 8, 248, 204
+	bounds: 369, 2, 365, 643

BIN
examples/dragon/export/dragon-pma.png


BIN
examples/dragon/export/dragon-pma_2.png


BIN
examples/dragon/export/dragon-pma_3.png


BIN
examples/dragon/export/dragon-pma_4.png


BIN
examples/dragon/export/dragon-pma_5.png


BIN
examples/dragon/export/dragon-pma_6.png


+ 73 - 60
examples/dragon/export/dragon.atlas

@@ -2,109 +2,122 @@ dragon.png
 	size: 1024, 1024
 	filter: Linear, Linear
 back
-	bounds: 2, 334, 190, 185
+	bounds: 564, 534, 190, 185
 chest
-	bounds: 2, 697, 136, 122
+	bounds: 2, 645, 136, 122
 chin
-	bounds: 611, 613, 214, 146
+	bounds: 140, 619, 214, 146
 front-toe-a
-	bounds: 2, 914, 29, 50
+	bounds: 2, 862, 29, 50
 	rotate: 90
 front-toe-b
-	bounds: 467, 887, 56, 57
+	bounds: 467, 835, 56, 57
+	rotate: 90
+head
+	bounds: 756, 398, 296, 260
 	rotate: 90
 left-front-leg
-	bounds: 599, 886, 84, 57
+	bounds: 599, 834, 84, 57
 left-front-thigh
-	bounds: 782, 871, 84, 72
+	bounds: 782, 819, 84, 72
 left-rear-leg
-	bounds: 465, 434, 206, 177
+	bounds: 356, 558, 206, 177
 left-rear-thigh
-	bounds: 216, 819, 91, 149
+	bounds: 216, 767, 91, 149
 	rotate: 90
 left-wing01
-	bounds: 403, 241, 191, 256
+	bounds: 2, 268, 264, 589
 	rotate: 90
 left-wing02
-	bounds: 673, 401, 179, 269
-	rotate: 90
-left-wing03
-	bounds: 194, 286, 186, 207
-	rotate: 90
-left-wing04
-	bounds: 140, 682, 188, 135
-left-wing06
-	bounds: 661, 207, 192, 331
-	rotate: 90
-left-wing07
-	bounds: 2, 521, 159, 255
+	bounds: 2, 2, 264, 589
 	rotate: 90
-left-wing08
-	bounds: 827, 582, 164, 181
-	rotate: 90
-left-wing09
-	bounds: 259, 474, 204, 167
 right-front-leg
-	bounds: 113, 821, 101, 89
+	bounds: 113, 769, 101, 89
 right-front-thigh
-	bounds: 758, 761, 108, 108
+	bounds: 758, 709, 108, 108
 right-rear-leg
-	bounds: 640, 773, 116, 100
+	bounds: 640, 721, 116, 100
 right-rear-thigh
-	bounds: 367, 794, 91, 149
+	bounds: 367, 742, 91, 149
 	rotate: 90
 right-rear-toe
-	bounds: 2, 833, 109, 77
-right-wing02
-	bounds: 635, 2, 203, 305
-	rotate: 90
-right-wing04
-	bounds: 330, 643, 279, 144
-right-wing06
-	bounds: 2, 84, 200, 366
-	rotate: 90
-right-wing07
-	bounds: 370, 39, 200, 263
-	rotate: 90
+	bounds: 2, 781, 109, 77
 tail01
-	bounds: 868, 748, 120, 153
+	bounds: 868, 696, 120, 153
 	rotate: 90
 tail02
-	bounds: 518, 789, 95, 120
+	bounds: 518, 737, 95, 120
 	rotate: 90
 tail03
-	bounds: 868, 870, 73, 92
+	bounds: 868, 818, 73, 92
 	rotate: 90
 tail04
-	bounds: 526, 887, 56, 71
+	bounds: 526, 835, 56, 71
 	rotate: 90
 tail05
-	bounds: 406, 891, 52, 59
+	bounds: 406, 839, 52, 59
 	rotate: 90
 tail06
-	bounds: 685, 875, 95, 68
+	bounds: 685, 823, 95, 68
 thiagobrayner
-	bounds: 54, 912, 350, 31
+	bounds: 54, 860, 350, 31
 
 dragon_2.png
-	size: 1024, 512
+	size: 1024, 1024
 	filter: Linear, Linear
-head
-	bounds: 2, 214, 296, 260
+left-wing03
+	bounds: 2, 534, 264, 589
+	rotate: 90
+left-wing04
+	bounds: 2, 268, 264, 589
 	rotate: 90
 left-wing05
-	bounds: 741, 39, 218, 213
+	bounds: 593, 209, 264, 589
+left-wing06
+	bounds: 2, 2, 264, 589
+	rotate: 90
+
+dragon_3.png
+	size: 1024, 1024
+	filter: Linear, Linear
+left-wing07
+	bounds: 2, 694, 264, 589
 	rotate: 90
+left-wing08
+	bounds: 2, 428, 264, 589
+	rotate: 90
+left-wing09
+	bounds: 593, 369, 264, 589
 right-wing01
-	bounds: 264, 200, 219, 310
+	bounds: 2, 2, 365, 643
+	rotate: 90
+
+dragon_4.png
+	size: 1024, 1024
+	filter: Linear, Linear
+right-wing02
+	bounds: 2, 369, 365, 643
 right-wing03
-	bounds: 485, 238, 272, 247
+	bounds: 369, 369, 365, 643
+right-wing04
+	bounds: 2, 2, 365, 643
 	rotate: 90
+
+dragon_5.png
+	size: 1024, 1024
+	filter: Linear, Linear
 right-wing05
-	bounds: 734, 259, 251, 229
+	bounds: 2, 369, 365, 643
+right-wing06
+	bounds: 369, 369, 365, 643
+right-wing07
+	bounds: 2, 2, 365, 643
 	rotate: 90
+
+dragon_6.png
+	size: 1024, 1024
+	filter: Linear, Linear
 right-wing08
-	bounds: 485, 2, 234, 254
-	rotate: 90
+	bounds: 2, 2, 365, 643
 right-wing09
-	bounds: 2, 8, 248, 204
+	bounds: 369, 2, 365, 643

BIN
examples/dragon/export/dragon.png


BIN
examples/dragon/export/dragon_2.png


BIN
examples/dragon/export/dragon_3.png


BIN
examples/dragon/export/dragon_4.png


BIN
examples/dragon/export/dragon_5.png


BIN
examples/dragon/export/dragon_6.png


BIN
examples/dragon/images/left-wing01.png


BIN
examples/dragon/images/left-wing02.png


BIN
examples/dragon/images/left-wing03.png


BIN
examples/dragon/images/left-wing04.png


BIN
examples/dragon/images/left-wing05.png


BIN
examples/dragon/images/left-wing06.png


BIN
examples/dragon/images/left-wing07.png


BIN
examples/dragon/images/left-wing08.png


BIN
examples/dragon/images/left-wing09.png


BIN
examples/dragon/images/right-wing01.png


BIN
examples/dragon/images/right-wing02.png


BIN
examples/dragon/images/right-wing03.png


BIN
examples/dragon/images/right-wing04.png


BIN
examples/dragon/images/right-wing05.png


BIN
examples/dragon/images/right-wing06.png


BIN
examples/dragon/images/right-wing07.png


BIN
examples/dragon/images/right-wing08.png


BIN
examples/dragon/images/right-wing09.png


+ 43 - 139
examples/export/runtimes.sh

@@ -35,12 +35,6 @@ cp -f ../mix-and-match/export/*.json "$ROOT/spine-libgdx/spine-libgdx-tests/asse
 cp -f ../mix-and-match/export/*.skel "$ROOT/spine-libgdx/spine-libgdx-tests/assets/mix-and-match/"
 cp -f ../mix-and-match/export/*-pma.* "$ROOT/spine-libgdx/spine-libgdx-tests/assets/mix-and-match/"
 
-echo "spine-as3"
-rm "$ROOT/spine-as3/spine-as3-example/src/spineboy".*
-cp -f ../spineboy/export/spineboy-ess.json "$ROOT/spine-as3/spine-as3-example/src/"
-cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-as3/spine-as3-example/src/"
-cp -f ../spineboy/export/spineboy.png "$ROOT/spine-as3/spine-as3-example/src/"
-
 echo "spine-cocos2d-objc"
 rm "$ROOT/spine-cocos2d-objc/Resources/"*
 
@@ -65,7 +59,7 @@ cp -f ../tank/export/tank.atlas "$ROOT/spine-cocos2d-objc/Resources/"
 cp -f ../tank/export/tank.png "$ROOT/spine-cocos2d-objc/Resources/"
 
 echo "spine-cocos2dx"
-rm "$ROOT/spine-cocos2dx/example/Resources/common/"*
+rm -rf "$ROOT/spine-cocos2dx/example/Resources/common/"*
 
 cp -f ../coin/export/coin-pro.skel "$ROOT/spine-cocos2dx/example/Resources/common/"
 cp -f ../coin/export/coin.atlas "$ROOT/spine-cocos2dx/example/Resources/common/"
@@ -117,79 +111,6 @@ cp -f ../mix-and-match/export/mix-and-match-pro.skel "$ROOT/spine-cocos2dx/examp
 cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
 cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-cocos2dx/example-v4/Resources/common/"
 
-
-echo "spine-solar2d"
-rm "$ROOT/spine-solar2d/data/"*
-cp -f ../coin/export/coin-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../coin/export/coin.atlas "$ROOT/spine-solar2d/data"
-cp -f ../coin/export/coin.png "$ROOT/spine-solar2d/data"
-
-cp -f ../goblins/export/goblins-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../goblins/export/goblins.atlas "$ROOT/spine-solar2d/data"
-cp -f ../goblins/export/goblins.png "$ROOT/spine-solar2d/data"
-
-cp -f ../raptor/export/raptor-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../raptor/export/raptor.atlas "$ROOT/spine-solar2d/data"
-cp -f ../raptor/export/raptor.png "$ROOT/spine-solar2d/data"
-
-cp -f ../spineboy/export/spineboy-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-solar2d/data"
-cp -f ../spineboy/export/spineboy.png "$ROOT/spine-solar2d/data"
-
-cp -f ../tank/export/tank-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../tank/export/tank.atlas "$ROOT/spine-solar2d/data"
-cp -f ../tank/export/tank.png "$ROOT/spine-solar2d/data"
-
-cp -f ../vine/export/vine-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../vine/export/vine.atlas "$ROOT/spine-solar2d/data"
-cp -f ../vine/export/vine.png "$ROOT/spine-solar2d/data"
-
-cp -f ../stretchyman/export/stretchyman-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../stretchyman/export/stretchyman.atlas "$ROOT/spine-solar2d/data"
-cp -f ../stretchyman/export/stretchyman.png "$ROOT/spine-solar2d/data"
-
-cp -f ../owl/export/owl-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../owl/export/owl.atlas "$ROOT/spine-solar2d/data"
-cp -f ../owl/export/owl.png "$ROOT/spine-solar2d/data"
-
-cp -f ../mix-and-match/export/mix-and-match-pro.json "$ROOT/spine-solar2d/data"
-cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-solar2d/data"
-cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-solar2d/data"
-
-echo "spine-love"
-rm "$ROOT/spine-love/data/"*
-cp -f ../coin/export/coin-pro.json "$ROOT/spine-love/data"
-cp -f ../coin/export/coin.atlas "$ROOT/spine-love/data"
-cp -f ../coin/export/coin.png "$ROOT/spine-love/data"
-
-cp -f ../goblins/export/goblins-pro.json "$ROOT/spine-love/data"
-cp -f ../goblins/export/goblins.atlas "$ROOT/spine-love/data"
-cp -f ../goblins/export/goblins.png "$ROOT/spine-love/data"
-
-cp -f ../raptor/export/raptor-pro.json "$ROOT/spine-love/data"
-cp -f ../raptor/export/raptor.atlas "$ROOT/spine-love/data"
-cp -f ../raptor/export/raptor.png "$ROOT/spine-love/data"
-
-cp -f ../spineboy/export/spineboy-pro.json "$ROOT/spine-love/data"
-cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-love/data"
-cp -f ../spineboy/export/spineboy.png "$ROOT/spine-love/data"
-
-cp -f ../tank/export/tank-pro.json "$ROOT/spine-love/data"
-cp -f ../tank/export/tank.atlas "$ROOT/spine-love/data"
-cp -f ../tank/export/tank.png "$ROOT/spine-love/data"
-
-cp -f ../vine/export/vine-pro.json "$ROOT/spine-love/data"
-cp -f ../vine/export/vine.atlas "$ROOT/spine-love/data"
-cp -f ../vine/export/vine.png "$ROOT/spine-love/data"
-
-cp -f ../stretchyman/export/stretchyman-pro.json "$ROOT/spine-love/data"
-cp -f ../stretchyman/export/stretchyman.atlas "$ROOT/spine-love/data"
-cp -f ../stretchyman/export/stretchyman.png "$ROOT/spine-love/data"
-
-cp -f ../mix-and-match/export/mix-and-match-pro.json "$ROOT/spine-love/data"
-cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-love/data"
-cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-love/data"
-
 echo "spine-sfml-c"
 rm "$ROOT/spine-sfml/c/data/"*
 cp -f ../coin/export/coin-pro.json "$ROOT/spine-sfml/c/data/"
@@ -197,6 +118,11 @@ cp -f ../coin/export/coin-pro.skel "$ROOT/spine-sfml/c/data/"
 cp -f ../coin/export/coin-pma.atlas "$ROOT/spine-sfml/c/data/"
 cp -f ../coin/export/coin-pma.png "$ROOT/spine-sfml/c/data/"
 
+cp -f ../dragon/export/dragon-ess.json "$ROOT/spine-sfml/c/data/"
+cp -f ../dragon/export/dragon-ess.skel "$ROOT/spine-sfml/c/data/"
+cp -f ../dragon/export/dragon-pma.atlas "$ROOT/spine-sfml/c/data/"
+cp -f ../dragon/export/dragon-pma*.png "$ROOT/spine-sfml/c/data/"
+
 cp -f ../goblins/export/goblins-pro.json "$ROOT/spine-sfml/c/data/"
 cp -f ../goblins/export/goblins-pro.skel "$ROOT/spine-sfml/c/data/"
 cp -f ../goblins/export/goblins-pma.atlas "$ROOT/spine-sfml/c/data/"
@@ -244,6 +170,11 @@ cp -f ../coin/export/coin-pro.skel "$ROOT/spine-sfml/cpp/data/"
 cp -f ../coin/export/coin-pma.atlas "$ROOT/spine-sfml/cpp/data/"
 cp -f ../coin/export/coin-pma.png "$ROOT/spine-sfml/cpp/data/"
 
+cp -f ../dragon/export/dragon-ess.json "$ROOT/spine-sfml/cpp/data/"
+cp -f ../dragon/export/dragon-ess.skel "$ROOT/spine-sfml/cpp/data/"
+cp -f ../dragon/export/dragon-pma.atlas "$ROOT/spine-sfml/cpp/data/"
+cp -f ../dragon/export/dragon-pma*.png "$ROOT/spine-sfml/cpp/data/"
+
 cp -f ../goblins/export/goblins-pro.json "$ROOT/spine-sfml/cpp/data/"
 cp -f ../goblins/export/goblins-pro.skel "$ROOT/spine-sfml/cpp/data/"
 cp -f ../goblins/export/goblins-pma.atlas "$ROOT/spine-sfml/cpp/data/"
@@ -284,46 +215,6 @@ cp -f ../mix-and-match/export/mix-and-match-pro.skel "$ROOT/spine-sfml/cpp/data/
 cp -f ../mix-and-match/export/mix-and-match-pma.atlas "$ROOT/spine-sfml/cpp/data/"
 cp -f ../mix-and-match/export/mix-and-match-pma.png "$ROOT/spine-sfml/cpp/data/"
 
-echo "spine-starling"
-
-# Do not delete everything in src, especially goblins-mesh-starling.png/.xml
-cp -f ../coin/export/coin-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../coin/export/coin.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../coin/export/coin.png "$ROOT/spine-starling/spine-starling-example/src/"
-
-cp -f ../goblins/export/goblins-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../goblins/export/goblins.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../goblins/export/goblins.png "$ROOT/spine-starling/spine-starling-example/src/"
-
-cp -f ../raptor/export/raptor-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../raptor/export/raptor.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../raptor/export/raptor.png "$ROOT/spine-starling/spine-starling-example/src/"
-
-cp -f ../spineboy/export/spineboy-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../spineboy/export/spineboy.png "$ROOT/spine-starling/spine-starling-example/src/"
-
-cp -f ../tank/export/tank-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../tank/export/tank.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../tank/export/tank.png "$ROOT/spine-starling/spine-starling-example/src/"
-
-cp -f ../vine/export/vine-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../vine/export/vine.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../vine/export/vine.png "$ROOT/spine-starling/spine-starling-example/src/"
-
-cp -f ../stretchyman/export/stretchyman-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../stretchyman/export/stretchyman.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../stretchyman/export/stretchyman.png "$ROOT/spine-starling/spine-starling-example/src/"
-
-cp -f ../owl/export/owl-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../owl/export/owl.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../owl/export/owl.png "$ROOT/spine-starling/spine-starling-example/src/"
-
-cp -f ../mix-and-match/export/mix-and-match-pro.json "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../mix-and-match/export/mix-and-match-pro.skel "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-starling/spine-starling-example/src/"
-cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-starling/spine-starling-example/src/"
-
 echo "spine-ts"
 rm "$ROOT/spine-ts/spine-webgl/example/assets/"*
 cp -f ../coin/export/coin-pro.json "$ROOT/spine-ts/spine-webgl/example/assets/"
@@ -336,6 +227,11 @@ cp -f ../goblins/export/goblins-pro.skel "$ROOT/spine-ts/spine-webgl/example/ass
 cp -f ../goblins/export/goblins-pma.atlas "$ROOT/spine-ts/spine-webgl/example/assets/"
 cp -f ../goblins/export/goblins-pma.png "$ROOT/spine-ts/spine-webgl/example/assets/"
 
+cp -f ../dragon/export/dragon-ess.json "$ROOT/spine-ts/spine-webgl/example/assets/"
+cp -f ../dragon/export/dragon-ess.skel "$ROOT/spine-ts/spine-webgl/example/assets/"
+cp -f ../dragon/export/dragon-pma.atlas "$ROOT/spine-ts/spine-webgl/example/assets/"
+cp -f ../dragon/export/dragon-pma*.png "$ROOT/spine-ts/spine-webgl/example/assets/"
+
 cp -f ../raptor/export/raptor-pro.json "$ROOT/spine-ts/spine-webgl/example/assets/"
 cp -f ../raptor/export/raptor-pro.skel "$ROOT/spine-ts/spine-webgl/example/assets/"
 cp -f ../raptor/export/raptor-pma.atlas "$ROOT/spine-ts/spine-webgl/example/assets/"
@@ -391,31 +287,31 @@ cp -f ../spineboy/export/spineboy-pro.skel "$ROOT/spine-ts/spine-player/example/
 cp -f ../spineboy/export/spineboy-pma.atlas "$ROOT/spine-ts/spine-player/example/assets/"
 cp -f ../spineboy/export/spineboy-pma.png "$ROOT/spine-ts/spine-player/example/assets/"
 
-echo "spine-xna"
-rm "$ROOT/spine-xna/example/data/"*
-cp -f ../coin/export/coin-pro.json "$ROOT/spine-xna/example/data/"
-cp -f ../coin/export/coin-pro.skel "$ROOT/spine-xna/example/data/"
-cp -f ../coin/export/coin.atlas "$ROOT/spine-xna/example/data/"
-cp -f ../coin/export/coin.png "$ROOT/spine-xna/example/data/"
+echo "spine-monogame"
+rm "$ROOT/spine-monogame/spine-monogame-example/data/"*
+cp -f ../coin/export/coin-pro.json "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../coin/export/coin-pro.skel "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../coin/export/coin.atlas "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../coin/export/coin.png "$ROOT/spine-monogame/spine-monogame-example/data/"
 
-cp -f ../raptor/export/raptor-pro.json "$ROOT/spine-xna/example/data/"
+cp -f ../raptor/export/raptor-pro.json "$ROOT/spine-monogame/spine-monogame-example/data/"
 # Note: normalmap need to be created manually. Thus we use a separately prepared atlas and
 # diffuse map so that the maps always match. These atlas textures are copied to the target dir.
-cp -f ../raptor/manual-maps/raptor.atlas "$ROOT/spine-xna/example/data/"
-cp -f ../raptor/manual-maps/raptor.png "$ROOT/spine-xna/example/data/"
-cp -f ../raptor/manual-maps/raptor-normals.png "$ROOT/spine-xna/example/data/raptor_normals.png"
+cp -f ../raptor/manual-maps/raptor.atlas "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../raptor/manual-maps/raptor.png "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../raptor/manual-maps/raptor-normals.png "$ROOT/spine-monogame/spine-monogame-example/data/raptor_normals.png"
 
-cp -f ../spineboy/export/spineboy-pro.skel "$ROOT/spine-xna/example/data/"
-cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-xna/example/data/"
-cp -f ../spineboy/export/spineboy.png "$ROOT/spine-xna/example/data/"
+cp -f ../spineboy/export/spineboy-pro.skel "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../spineboy/export/spineboy.atlas "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../spineboy/export/spineboy.png "$ROOT/spine-monogame/spine-monogame-example/data/"
 
-cp -f ../tank/export/tank-pro.json "$ROOT/spine-xna/example/data/"
-cp -f ../tank/export/tank.atlas "$ROOT/spine-xna/example/data/"
-cp -f ../tank/export/tank.png "$ROOT/spine-xna/example/data/"
+cp -f ../tank/export/tank-pro.json "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../tank/export/tank.atlas "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../tank/export/tank.png "$ROOT/spine-monogame/spine-monogame-example/data/"
 
-cp -f ../mix-and-match/export/mix-and-match-pro.json "$ROOT/spine-xna/example/data/"
-cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-xna/example/data/"
-cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-xna/example/data/"
+cp -f ../mix-and-match/export/mix-and-match-pro.json "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../mix-and-match/export/mix-and-match.atlas "$ROOT/spine-monogame/spine-monogame-example/data/"
+cp -f ../mix-and-match/export/mix-and-match.png "$ROOT/spine-monogame/spine-monogame-example/data/"
 
 echo "spine-ue4"
 rm "$ROOT/spine-ue4/Content/GettingStarted/Assets/Raptor/raptor.json"
@@ -457,8 +353,16 @@ cp -f ../dragon/export/dragon-ess.json "$UNITY_TARGET_DIR/dragon.json"
 cp -f ../dragon/export/dragon-pma.atlas "$UNITY_TARGET_DIR/dragon.atlas.txt"
 $sed -i "s/dragon-pma.png/dragon.png/g" "$UNITY_TARGET_DIR/dragon.atlas.txt"
 $sed -i "s/dragon-pma_2.png/dragon2.png/g" "$UNITY_TARGET_DIR/dragon.atlas.txt"
+$sed -i "s/dragon-pma_3.png/dragon3.png/g" "$UNITY_TARGET_DIR/dragon.atlas.txt"
+$sed -i "s/dragon-pma_4.png/dragon4.png/g" "$UNITY_TARGET_DIR/dragon.atlas.txt"
+$sed -i "s/dragon-pma_5.png/dragon5.png/g" "$UNITY_TARGET_DIR/dragon.atlas.txt"
+$sed -i "s/dragon-pma_6.png/dragon6.png/g" "$UNITY_TARGET_DIR/dragon.atlas.txt"
 cp -f ../dragon/export/dragon-pma.png "$UNITY_TARGET_DIR/dragon.png"
 cp -f ../dragon/export/dragon-pma_2.png "$UNITY_TARGET_DIR/dragon2.png"
+cp -f ../dragon/export/dragon-pma_3.png "$UNITY_TARGET_DIR/dragon3.png"
+cp -f ../dragon/export/dragon-pma_4.png "$UNITY_TARGET_DIR/dragon4.png"
+cp -f ../dragon/export/dragon-pma_5.png "$UNITY_TARGET_DIR/dragon5.png"
+cp -f ../dragon/export/dragon-pma_6.png "$UNITY_TARGET_DIR/dragon6.png"
 
 UNITY_TARGET_DIR="$ROOT/spine-unity/Assets/Spine Examples/Spine Skeletons/Goblins"
 cp -f ../goblins/export/goblins-pro.json "$UNITY_TARGET_DIR/goblins.json"

+ 3 - 3
examples/goblins/export/goblins-ess.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "vsus27NzL88",
-	"spine": "4.0.31",
+	"hash": "djttFmlR6Co",
+	"spine": "4.1.23-beta",
 	"x": -92.53,
 	"y": -5.3,
 	"width": 234.03,
@@ -347,7 +347,7 @@
 			"eyes": {
 				"attachment": [
 					{ "time": 0.7, "name": "eyes-closed" },
-					{ "time": 0.8, "name": null }
+					{ "time": 0.8 }
 				]
 			}
 		},

BIN
examples/goblins/export/goblins-ess.skel


+ 304 - 282
examples/goblins/export/goblins-pro.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "PtTAK+zF95I",
-	"spine": "4.0.31",
+	"hash": "CdaHvXeCMjE",
+	"spine": "4.1.23-beta",
 	"x": -134.12,
 	"y": -3.28,
 	"width": 266.94,
@@ -571,7 +571,7 @@
 			"eyes": {
 				"attachment": [
 					{ "time": 0.7, "name": "eyes-closed" },
-					{ "time": 0.8, "name": null }
+					{ "time": 0.8 }
 				]
 			}
 		},
@@ -899,309 +899,331 @@
 				]
 			}
 		},
-		"deform": {
+		"attachments": {
 			"default": {
 				"right-hand-item": {
-					"dagger": [
-						{
-							"offset": 26,
-							"vertices": [ 2.34755, 0.1447 ],
-							"curve": [ 0.125, 0, 0.375, 1 ]
-						},
-						{
-							"time": 0.5,
-							"offset": 8,
-							"vertices": [ -1.19415, 4.31532, 0.07279, 6.41351, 1.66048, 6.18883, 1.75233, 3.59555 ],
-							"curve": [ 0.625, 0, 0.875, 1 ]
-						},
-						{
-							"time": 1,
-							"offset": 26,
-							"vertices": [ 2.34755, 0.1447 ]
-						}
-					]
+					"dagger": {
+						"deform": [
+							{
+								"offset": 26,
+								"vertices": [ 2.34755, 0.1447 ],
+								"curve": [ 0.125, 0, 0.375, 1 ]
+							},
+							{
+								"time": 0.5,
+								"offset": 8,
+								"vertices": [ -1.19415, 4.31532, 0.07279, 6.41351, 1.66048, 6.18883, 1.75233, 3.59555 ],
+								"curve": [ 0.625, 0, 0.875, 1 ]
+							},
+							{
+								"time": 1,
+								"offset": 26,
+								"vertices": [ 2.34755, 0.1447 ]
+							}
+						]
+					}
 				}
 			},
 			"goblin": {
 				"head": {
-					"head": [
-						{
-							"curve": [ 0.127, 0, 0.15, 1 ]
-						},
-						{
-							"time": 0.2,
-							"vertices": [ -10.97827, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08392, -1.08534, 0.08392, -1.08534, 0.08392, 0, 0, -2.22325, 2.66465, -4.83295, 2.70085, -5.70553, -0.51941, -3.15962, -1.61502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64742, 0.81612, -11.82286, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08392 ],
-							"curve": [ 0.242, 0, 0.325, 1 ]
-						},
-						{
-							"time": 0.3667,
-							"vertices": [ 10.69276, 4.05949, 3.66373, 1.85427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09018, 1.47305, 0.09018, 1.47305, 0.09018, 0, 0, 2.69653, -0.22738, 3.77135, 0.11418, 3.6893, 1.55352, 2.49595, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45881, -3.9113, 9.19594, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09018 ],
-							"curve": [ 0.574, 0, 0.617, 1 ]
-						},
-						{
-							"time": 0.7,
-							"vertices": [ -10.97827, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17551, -0.17183, -1.17551, -0.17183, -1.17551, -0.17183, 0, 0, -2.22325, 2.66465, -4.83295, 2.70085, -5.70553, -0.51941, -3.15962, -1.61502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64742, 0.81612, -11.82286, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17551, -0.17183 ],
-							"curve": [ 0.742, 0, 0.825, 1 ]
-						},
-						{
-							"time": 0.8667,
-							"vertices": [ 10.69276, 4.05949, 3.66373, 1.85427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446, 0.38687, 0.08446, 0.38687, 0.08446, 0, 0, 2.69653, -0.22738, 3.77135, 0.11418, 3.6893, 1.55352, 2.49595, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45881, -3.9113, 9.19594, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446 ],
-							"curve": [ 0.9, 0, 0.967, 1 ]
-						},
-						{ "time": 1 }
-					]
+					"head": {
+						"deform": [
+							{
+								"curve": [ 0.127, 0, 0.15, 1 ]
+							},
+							{
+								"time": 0.2,
+								"vertices": [ -10.97827, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08392, -1.08534, 0.08392, -1.08534, 0.08392, 0, 0, -2.22325, 2.66465, -4.83295, 2.70085, -5.70553, -0.51941, -3.15962, -1.61502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64742, 0.81612, -11.82286, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08392 ],
+								"curve": [ 0.242, 0, 0.325, 1 ]
+							},
+							{
+								"time": 0.3667,
+								"vertices": [ 10.69276, 4.05949, 3.66373, 1.85427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09018, 1.47305, 0.09018, 1.47305, 0.09018, 0, 0, 2.69653, -0.22738, 3.77135, 0.11418, 3.6893, 1.55352, 2.49595, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45881, -3.9113, 9.19594, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09018 ],
+								"curve": [ 0.574, 0, 0.617, 1 ]
+							},
+							{
+								"time": 0.7,
+								"vertices": [ -10.97827, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17551, -0.17183, -1.17551, -0.17183, -1.17551, -0.17183, 0, 0, -2.22325, 2.66465, -4.83295, 2.70085, -5.70553, -0.51941, -3.15962, -1.61502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64742, 0.81612, -11.82286, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17551, -0.17183 ],
+								"curve": [ 0.742, 0, 0.825, 1 ]
+							},
+							{
+								"time": 0.8667,
+								"vertices": [ 10.69276, 4.05949, 3.66373, 1.85427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446, 0.38687, 0.08446, 0.38687, 0.08446, 0, 0, 2.69653, -0.22738, 3.77135, 0.11418, 3.6893, 1.55352, 2.49595, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45881, -3.9113, 9.19594, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446 ],
+								"curve": [ 0.9, 0, 0.967, 1 ]
+							},
+							{ "time": 1 }
+						]
+					}
 				},
 				"left-foot": {
-					"left-foot": [
-						{
-							"offset": 8,
-							"vertices": [ 3.69298, 2.37573, -7.16969, 18.79733, -12.78162, 14.7778, -12.75776, 6.50514, -3.13476, 1.98906, -0.44402, 0.36629, 0, 0, -3.80085, 2.98474 ]
-						},
-						{ "time": 0.1333 },
-						{
-							"time": 0.2333,
-							"offset": 8,
-							"vertices": [ -3.96073, -2.34594, -5.80446, -12.47629, -2.2313, -12.99038, 2.02942, -9.1036, 0, 0, 0, 0, 0, 0, -1.35254, -5.2883 ]
-						},
-						{
-							"time": 0.3667,
-							"offset": 8,
-							"vertices": [ 0.66505, 0.33548, 0.33902, 2.69014, -0.48171, 2.54524, -1.13593, 1.38562, 0, 0, 0, 0, 0, 0, -0.11908, 0.79273 ]
-						},
-						{ "time": 0.5, "curve": "stepped" },
-						{ "time": 0.6333 },
-						{
-							"time": 0.7333,
-							"offset": 8,
-							"vertices": [ -2.97738, 9.40254, -6.91661, 19.92794, -10.55287, 18.41085, -12.37161, 12.38473, -4.72607, 6.30799, 0, 0, -1.48902, 4.88944, -7.06773, 10.70102 ]
-						},
-						{
-							"time": 0.8333,
-							"offset": 6,
-							"vertices": [ 1.05319, 1.56362, -2.52723, 7.9974, -5.52031, 17.14137, -8.93317, 15.79635, -10.73748, 10.22056, -4.23801, 5.36992, 0, 0, 0, 0, -5.83148, 8.55532 ]
-						},
-						{
-							"time": 1,
-							"offset": 8,
-							"vertices": [ 3.69298, 2.37573, -7.16969, 18.79733, -12.78162, 14.7778, -12.75776, 6.50514, -3.13476, 1.98906, -0.44402, 0.36629, 0, 0, -3.80085, 2.98474 ]
-						}
-					]
+					"left-foot": {
+						"deform": [
+							{
+								"offset": 8,
+								"vertices": [ 3.69298, 2.37573, -7.16969, 18.79733, -12.78162, 14.7778, -12.75776, 6.50514, -3.13476, 1.98906, -0.44402, 0.36629, 0, 0, -3.80085, 2.98474 ]
+							},
+							{ "time": 0.1333 },
+							{
+								"time": 0.2333,
+								"offset": 8,
+								"vertices": [ -3.96073, -2.34594, -5.80446, -12.47629, -2.2313, -12.99038, 2.02942, -9.1036, 0, 0, 0, 0, 0, 0, -1.35254, -5.2883 ]
+							},
+							{
+								"time": 0.3667,
+								"offset": 8,
+								"vertices": [ 0.66505, 0.33548, 0.33902, 2.69014, -0.48171, 2.54524, -1.13593, 1.38562, 0, 0, 0, 0, 0, 0, -0.11908, 0.79273 ]
+							},
+							{ "time": 0.5, "curve": "stepped" },
+							{ "time": 0.6333 },
+							{
+								"time": 0.7333,
+								"offset": 8,
+								"vertices": [ -2.97738, 9.40254, -6.91661, 19.92794, -10.55287, 18.41085, -12.37161, 12.38473, -4.72607, 6.30799, 0, 0, -1.48902, 4.88944, -7.06773, 10.70102 ]
+							},
+							{
+								"time": 0.8333,
+								"offset": 6,
+								"vertices": [ 1.05319, 1.56362, -2.52723, 7.9974, -5.52031, 17.14137, -8.93317, 15.79635, -10.73748, 10.22056, -4.23801, 5.36992, 0, 0, 0, 0, -5.83148, 8.55532 ]
+							},
+							{
+								"time": 1,
+								"offset": 8,
+								"vertices": [ 3.69298, 2.37573, -7.16969, 18.79733, -12.78162, 14.7778, -12.75776, 6.50514, -3.13476, 1.98906, -0.44402, 0.36629, 0, 0, -3.80085, 2.98474 ]
+							}
+						]
+					}
 				},
 				"pelvis": {
-					"pelvis": [
-						{},
-						{
-							"time": 0.1333,
-							"offset": 6,
-							"vertices": [ -0.6899, -4.13284 ]
-						},
-						{
-							"time": 0.3333,
-							"offset": 6,
-							"vertices": [ -1.04945, -3.10477 ]
-						},
-						{
-							"time": 0.7,
-							"offset": 6,
-							"vertices": [ -1.4245, -6.30617 ]
-						},
-						{
-							"time": 0.8667,
-							"offset": 6,
-							"vertices": [ -1.13542, -1.79036 ]
-						},
-						{ "time": 1 }
-					]
+					"pelvis": {
+						"deform": [
+							{},
+							{
+								"time": 0.1333,
+								"offset": 6,
+								"vertices": [ -0.6899, -4.13284 ]
+							},
+							{
+								"time": 0.3333,
+								"offset": 6,
+								"vertices": [ -1.04945, -3.10477 ]
+							},
+							{
+								"time": 0.7,
+								"offset": 6,
+								"vertices": [ -1.4245, -6.30617 ]
+							},
+							{
+								"time": 0.8667,
+								"offset": 6,
+								"vertices": [ -1.13542, -1.79036 ]
+							},
+							{ "time": 1 }
+						]
+					}
 				},
 				"right-foot": {
-					"right-foot": [
-						{},
-						{
-							"time": 0.1333,
-							"offset": 2,
-							"vertices": [ -2.81259, 2.63115, -2.35238, 3.89441, -1.99921, 4.8639, -0.93273, 5.57982, -0.48886, 5.09855, -0.34813, 3.42912, -0.17446, 1.36899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31305, 1.91372, -1.32986, 3.65703 ]
-						},
-						{
-							"time": 0.2333,
-							"offset": 2,
-							"vertices": [ -6.39088, 6.41246, -7.74575, 8.27192, -7.02471, 11.35894, -4.03471, 13.93454, -2.50399, 12.62963, -1.46125, 7.58915, -0.17446, 1.36899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84766, 2.61216, -4.53956, 7.92358 ]
-						},
-						{
-							"time": 0.3,
-							"offset": 2,
-							"vertices": [ -8.27185, 6.68822, -9.29764, 10.13797, -8.62231, 14.7134, -4.5863, 18.81939, -2.20304, 17.10709, -0.07795, 9.9046, 2.54452, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94625, 2.38008, -4.59399, 10.01888 ]
-						},
-						{
-							"time": 0.3667,
-							"offset": 2,
-							"vertices": [ -10.47684, 9.44176, -13.36883, 12.40983, -14.32569, 16.94392, -9.24463, 23.55674, -5.51712, 21.51378, -1.19582, 11.53193, 2.54452, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14848, 2.29389, -6.63419, 11.37127 ]
-						},
-						{
-							"time": 0.5,
-							"offset": 2,
-							"vertices": [ -5.42474, 4.36854, -10.59004, 7.04468, -11.64251, 11.55845, -6.19665, 20.12806, -1.45498, 18.05411, 4.8662, 6.41679, 2.81463, 0.27601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96412, 4.9483 ]
-						},
-						{ "time": 0.6333 },
-						{
-							"time": 0.7333,
-							"offset": 4,
-							"vertices": [ 1.31462, -6.84099, -0.87905, -12.54479, -5.9851, -14.08368, -7.15892, -11.63194, -5.6792, -4.83545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06164, -6.93844 ]
-						},
-						{
-							"time": 0.8,
-							"offset": 4,
-							"vertices": [ 0.65731, -3.4205, -0.43953, -6.2724, -2.99255, -7.04184, -3.57946, -5.81597, -2.8396, -2.41772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79688, -1.28021, 0, 0, 0, 0, -1.03082, -3.46922 ]
-						},
-						{ "time": 0.8667 }
-					]
+					"right-foot": {
+						"deform": [
+							{},
+							{
+								"time": 0.1333,
+								"offset": 2,
+								"vertices": [ -2.81259, 2.63115, -2.35238, 3.89441, -1.99921, 4.8639, -0.93273, 5.57982, -0.48886, 5.09855, -0.34813, 3.42912, -0.17446, 1.36899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31305, 1.91372, -1.32986, 3.65703 ]
+							},
+							{
+								"time": 0.2333,
+								"offset": 2,
+								"vertices": [ -6.39088, 6.41246, -7.74575, 8.27192, -7.02471, 11.35894, -4.03471, 13.93454, -2.50399, 12.62963, -1.46125, 7.58915, -0.17446, 1.36899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84766, 2.61216, -4.53956, 7.92358 ]
+							},
+							{
+								"time": 0.3,
+								"offset": 2,
+								"vertices": [ -8.27185, 6.68822, -9.29764, 10.13797, -8.62231, 14.7134, -4.5863, 18.81939, -2.20304, 17.10709, -0.07795, 9.9046, 2.54452, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94625, 2.38008, -4.59399, 10.01888 ]
+							},
+							{
+								"time": 0.3667,
+								"offset": 2,
+								"vertices": [ -10.47684, 9.44176, -13.36883, 12.40983, -14.32569, 16.94392, -9.24463, 23.55674, -5.51712, 21.51378, -1.19582, 11.53193, 2.54452, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14848, 2.29389, -6.63419, 11.37127 ]
+							},
+							{
+								"time": 0.5,
+								"offset": 2,
+								"vertices": [ -5.42474, 4.36854, -10.59004, 7.04468, -11.64251, 11.55845, -6.19665, 20.12806, -1.45498, 18.05411, 4.8662, 6.41679, 2.81463, 0.27601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96412, 4.9483 ]
+							},
+							{ "time": 0.6333 },
+							{
+								"time": 0.7333,
+								"offset": 4,
+								"vertices": [ 1.31462, -6.84099, -0.87905, -12.54479, -5.9851, -14.08368, -7.15892, -11.63194, -5.6792, -4.83545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06164, -6.93844 ]
+							},
+							{
+								"time": 0.8,
+								"offset": 4,
+								"vertices": [ 0.65731, -3.4205, -0.43953, -6.2724, -2.99255, -7.04184, -3.57946, -5.81597, -2.8396, -2.41772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79688, -1.28021, 0, 0, 0, 0, -1.03082, -3.46922 ]
+							},
+							{ "time": 0.8667 }
+						]
+					}
 				},
 				"right-hand": {
-					"right-hand": [
-						{
-							"offset": 4,
-							"vertices": [ -1.48417, 0.34736, 0, 0, 1.31152, 0.08085, 1.60296, 0.09882, 0.13673, 0.15471, 0, 0, 0, 0, -0.72862, -0.0449 ]
-						},
-						{ "time": 0.5 },
-						{
-							"time": 1,
-							"offset": 4,
-							"vertices": [ -1.48417, 0.34736, 0, 0, 1.31152, 0.08085, 1.60296, 0.09882, 0.13673, 0.15471, 0, 0, 0, 0, -0.72862, -0.0449 ]
-						}
-					]
+					"right-hand": {
+						"deform": [
+							{
+								"offset": 4,
+								"vertices": [ -1.48417, 0.34736, 0, 0, 1.31152, 0.08085, 1.60296, 0.09882, 0.13673, 0.15471, 0, 0, 0, 0, -0.72862, -0.0449 ]
+							},
+							{ "time": 0.5 },
+							{
+								"time": 1,
+								"offset": 4,
+								"vertices": [ -1.48417, 0.34736, 0, 0, 1.31152, 0.08085, 1.60296, 0.09882, 0.13673, 0.15471, 0, 0, 0, 0, -0.72862, -0.0449 ]
+							}
+						]
+					}
 				},
 				"right-lower-leg": {
-					"right-lower-leg": [
-						{},
-						{
-							"time": 0.6,
-							"offset": 6,
-							"vertices": [ 1.80396, -1.56553 ]
-						},
-						{ "time": 1 }
-					]
+					"right-lower-leg": {
+						"deform": [
+							{},
+							{
+								"time": 0.6,
+								"offset": 6,
+								"vertices": [ 1.80396, -1.56553 ]
+							},
+							{ "time": 1 }
+						]
+					}
 				},
 				"right-upper-leg": {
-					"right-upper-leg": [
-						{
-							"vertices": [ -6.03857, -1.46325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34685, -1.93102, -1.86047, -5.05266, -2.5014, -3.09985 ]
-						},
-						{ "time": 0.3333 },
-						{
-							"time": 0.8667,
-							"offset": 14,
-							"vertices": [ 0.13425, -2.35378, -1.33318, -5.99573, -1.35862, -4.43324 ]
-						},
-						{
-							"time": 1,
-							"vertices": [ -6.03857, -1.46325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34685, -1.93102, -1.86047, -5.05266, -2.5014, -3.09985 ]
-						}
-					]
+					"right-upper-leg": {
+						"deform": [
+							{
+								"vertices": [ -6.03857, -1.46325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34685, -1.93102, -1.86047, -5.05266, -2.5014, -3.09985 ]
+							},
+							{ "time": 0.3333 },
+							{
+								"time": 0.8667,
+								"offset": 14,
+								"vertices": [ 0.13425, -2.35378, -1.33318, -5.99573, -1.35862, -4.43324 ]
+							},
+							{
+								"time": 1,
+								"vertices": [ -6.03857, -1.46325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34685, -1.93102, -1.86047, -5.05266, -2.5014, -3.09985 ]
+							}
+						]
+					}
 				},
 				"torso": {
-					"torso": [
-						{
-							"offset": 2,
-							"vertices": [ 0.24821, 2.86673, 0.24821, 2.86673, 0.24821, 2.86673, 0.24821, 2.86673, 0.24821, 2.86673, 0.24821, 2.86673, -1.24131, 2.62652, -2.47492, 0.71183, -0.26363, -0.5308, 0.24821, 2.86673, 0.24821, 2.86673, 0, 0, 0, 0, 0, 0, 0, 0, 1.34461, 0.25215, 0.24821, 2.86673, 0.82507, 1.61798, 0.24821, 2.86673, 0, 0, -1.86431, -0.4326, 0.24821, 2.86673 ]
-						},
-						{
-							"time": 0.1333,
-							"offset": 2,
-							"vertices": [ 0.35589, 4.10914, 0.35589, 4.10914, 0.35589, 4.10914, 0.35589, 4.10914, 0.35589, 4.10914, 0.35589, 4.10914, 1.66908, 3.51187, -0.62355, 2.47979, 1.1045, 3.49684, -1.09009, 6.08429, 0.35589, 4.10914, 0, 0, 0, 0, 0, 0, 0, 0, 3.01291, 0.15693, 0.35589, 4.10914, -1.11398, 3.7954, 0.35589, 4.10914, 0, 0, -2.96167, 0.55563, -2.20741, 4.40587 ]
-						},
-						{
-							"time": 0.3,
-							"offset": 2,
-							"vertices": [ 0.2884, 3.32948, 0.2884, 3.32948, 0.2884, 3.32948, 0.2884, 3.32948, 0.2884, 3.32948, 0.2884, 3.32948, 6.32601, 0.19387, 7.84315, 1.94837, 7.08587, 3.64119, 4.52343, 4.46961, 0.2884, 3.32948, 0, 0, 0, 0, 0, 0, 0, 0, 4.36416, -1.83876, 0.2884, 3.32948, 4.2925, 3.60194, 0.2884, 3.32948, 0, 0, 3.72601, -0.19338, 0.2884, 3.32948 ]
-						},
-						{
-							"time": 0.5,
-							"offset": 2,
-							"vertices": [ 0.3133, 3.61659, 0.3133, 3.61659, 0.3133, 3.61659, 0.3133, 3.61659, 0.3133, 3.61659, 0.3133, 3.61659, 2.57273, 2.74457, 2.88831, 3.04797, 3.48442, 3.04655, 1.80035, 4.609, 0.3133, 3.61659, 0, 0, 0, 0, 0, 0, 0, 0, 3.53782, -0.82203, 0.3133, 3.61659, 1.80022, 3.63246, 0.3133, 3.61659, 0, 0, 0.62718, 0.33564, -1.22467, 3.79463 ]
-						},
-						{
-							"time": 0.6333,
-							"offset": 2,
-							"vertices": [ 0.44398, 5.125, 0.44398, 5.125, 0.44398, 5.125, 0.44398, 5.125, 0.44398, 5.125, 0.44398, 5.125, 1.19401, 3.60798, -0.53546, 3.49565, 1.1926, 4.5127, -1.002, 7.10015, 0.44398, 5.125, 0, 0, 0, 0, 0, 0, 0, 0, 3.101, 1.17278, 0.44398, 5.125, -1.02589, 4.81126, 0.44398, 5.125, 0, 0, -2.87358, 1.57149, -2.11931, 5.42173 ]
-						},
-						{
-							"time": 0.8667,
-							"offset": 2,
-							"vertices": [ 0.30385, 3.50647, 0.30385, 3.50647, 0.30385, 3.50647, 0.30385, 3.50647, 0.30385, 3.50647, 0.30385, 3.50647, 0.92587, 2.24385, 0.68874, 1.29945, 3.55433, 3.00604, 2.71494, 5.89962, 0.30385, 3.50647, 0, 0, 0, 0, 0, 0, 0, 0, 1.96775, 0.40548, 0.30385, 3.50647, 2.6104, 2.3545, 0.30385, 3.50647, 0, 0, 0.22709, -0.12851, -0.62826, 3.61437 ]
-						},
-						{
-							"time": 1,
-							"offset": 2,
-							"vertices": [ 0.32802, 3.78826, 0.32802, 3.78826, 0.32802, 3.78826, 0.32802, 3.78826, 0.32802, 3.78826, 0.32802, 3.78826, -1.1615, 3.54805, -2.39511, 1.63336, -0.18382, 0.39073, 0.32802, 3.78826, 0.32802, 3.78826, 0, 0, 0, 0, 0, 0, 0, 0, 1.42442, 1.17368, 0.32802, 3.78826, 0.90488, 2.53951, 0.32802, 3.78826, 0, 0, -1.7845, 0.48894, 0.32802, 3.78826 ]
-						}
-					]
+					"torso": {
+						"deform": [
+							{
+								"offset": 2,
+								"vertices": [ 0.24821, 2.86673, 0.24821, 2.86673, 0.24821, 2.86673, 0.24821, 2.86673, 0.24821, 2.86673, 0.24821, 2.86673, -1.24131, 2.62652, -2.47492, 0.71183, -0.26363, -0.5308, 0.24821, 2.86673, 0.24821, 2.86673, 0, 0, 0, 0, 0, 0, 0, 0, 1.34461, 0.25215, 0.24821, 2.86673, 0.82507, 1.61798, 0.24821, 2.86673, 0, 0, -1.86431, -0.4326, 0.24821, 2.86673 ]
+							},
+							{
+								"time": 0.1333,
+								"offset": 2,
+								"vertices": [ 0.35589, 4.10914, 0.35589, 4.10914, 0.35589, 4.10914, 0.35589, 4.10914, 0.35589, 4.10914, 0.35589, 4.10914, 1.66908, 3.51187, -0.62355, 2.47979, 1.1045, 3.49684, -1.09009, 6.08429, 0.35589, 4.10914, 0, 0, 0, 0, 0, 0, 0, 0, 3.01291, 0.15693, 0.35589, 4.10914, -1.11398, 3.7954, 0.35589, 4.10914, 0, 0, -2.96167, 0.55563, -2.20741, 4.40587 ]
+							},
+							{
+								"time": 0.3,
+								"offset": 2,
+								"vertices": [ 0.2884, 3.32948, 0.2884, 3.32948, 0.2884, 3.32948, 0.2884, 3.32948, 0.2884, 3.32948, 0.2884, 3.32948, 6.32601, 0.19387, 7.84315, 1.94837, 7.08587, 3.64119, 4.52343, 4.46961, 0.2884, 3.32948, 0, 0, 0, 0, 0, 0, 0, 0, 4.36416, -1.83876, 0.2884, 3.32948, 4.2925, 3.60194, 0.2884, 3.32948, 0, 0, 3.72601, -0.19338, 0.2884, 3.32948 ]
+							},
+							{
+								"time": 0.5,
+								"offset": 2,
+								"vertices": [ 0.3133, 3.61659, 0.3133, 3.61659, 0.3133, 3.61659, 0.3133, 3.61659, 0.3133, 3.61659, 0.3133, 3.61659, 2.57273, 2.74457, 2.88831, 3.04797, 3.48442, 3.04655, 1.80035, 4.609, 0.3133, 3.61659, 0, 0, 0, 0, 0, 0, 0, 0, 3.53782, -0.82203, 0.3133, 3.61659, 1.80022, 3.63246, 0.3133, 3.61659, 0, 0, 0.62718, 0.33564, -1.22467, 3.79463 ]
+							},
+							{
+								"time": 0.6333,
+								"offset": 2,
+								"vertices": [ 0.44398, 5.125, 0.44398, 5.125, 0.44398, 5.125, 0.44398, 5.125, 0.44398, 5.125, 0.44398, 5.125, 1.19401, 3.60798, -0.53546, 3.49565, 1.1926, 4.5127, -1.002, 7.10015, 0.44398, 5.125, 0, 0, 0, 0, 0, 0, 0, 0, 3.101, 1.17278, 0.44398, 5.125, -1.02589, 4.81126, 0.44398, 5.125, 0, 0, -2.87358, 1.57149, -2.11931, 5.42173 ]
+							},
+							{
+								"time": 0.8667,
+								"offset": 2,
+								"vertices": [ 0.30385, 3.50647, 0.30385, 3.50647, 0.30385, 3.50647, 0.30385, 3.50647, 0.30385, 3.50647, 0.30385, 3.50647, 0.92587, 2.24385, 0.68874, 1.29945, 3.55433, 3.00604, 2.71494, 5.89962, 0.30385, 3.50647, 0, 0, 0, 0, 0, 0, 0, 0, 1.96775, 0.40548, 0.30385, 3.50647, 2.6104, 2.3545, 0.30385, 3.50647, 0, 0, 0.22709, -0.12851, -0.62826, 3.61437 ]
+							},
+							{
+								"time": 1,
+								"offset": 2,
+								"vertices": [ 0.32802, 3.78826, 0.32802, 3.78826, 0.32802, 3.78826, 0.32802, 3.78826, 0.32802, 3.78826, 0.32802, 3.78826, -1.1615, 3.54805, -2.39511, 1.63336, -0.18382, 0.39073, 0.32802, 3.78826, 0.32802, 3.78826, 0, 0, 0, 0, 0, 0, 0, 0, 1.42442, 1.17368, 0.32802, 3.78826, 0.90488, 2.53951, 0.32802, 3.78826, 0, 0, -1.7845, 0.48894, 0.32802, 3.78826 ]
+							}
+						]
+					}
 				},
 				"undie-straps": {
-					"undie-straps": [
-						{
-							"offset": 2,
-							"vertices": [ -1.77697, 0.5476, -0.96145, -1.03793, -0.39148, -0.24072, -1.77697, 0.5476 ]
-						},
-						{
-							"time": 0.1333,
-							"offset": 2,
-							"vertices": [ -2.25684, -1.03177, -1.49719, -4.23862, -0.7447, -2.84907, -1.90072, 0.54478 ]
-						},
-						{
-							"time": 0.3333,
-							"offset": 2,
-							"vertices": [ -2.37974, -0.05432, -0.49433, 0.19437, -0.90861, 1.16519, -1.60956, 2.70799, 0.96186, 0.80615 ]
-						},
-						{
-							"time": 0.7,
-							"offset": 2,
-							"vertices": [ -0.91715, -2.76567, -0.62215, -3.63489, -0.84941, -2.26772, -2.56077, 0.52971 ]
-						},
-						{
-							"time": 0.8667,
-							"offset": 2,
-							"vertices": [ -2.56077, 0.52971, -1.58065, 0.32031, -1.3847, 0.32476, -2.56077, 0.52971 ]
-						},
-						{
-							"time": 1,
-							"offset": 2,
-							"vertices": [ -1.77697, 0.5476, -0.80128, 0.53413, -0.80128, 0.53413, -1.77697, 0.5476 ]
-						}
-					]
+					"undie-straps": {
+						"deform": [
+							{
+								"offset": 2,
+								"vertices": [ -1.77697, 0.5476, -0.96145, -1.03793, -0.39148, -0.24072, -1.77697, 0.5476 ]
+							},
+							{
+								"time": 0.1333,
+								"offset": 2,
+								"vertices": [ -2.25684, -1.03177, -1.49719, -4.23862, -0.7447, -2.84907, -1.90072, 0.54478 ]
+							},
+							{
+								"time": 0.3333,
+								"offset": 2,
+								"vertices": [ -2.37974, -0.05432, -0.49433, 0.19437, -0.90861, 1.16519, -1.60956, 2.70799, 0.96186, 0.80615 ]
+							},
+							{
+								"time": 0.7,
+								"offset": 2,
+								"vertices": [ -0.91715, -2.76567, -0.62215, -3.63489, -0.84941, -2.26772, -2.56077, 0.52971 ]
+							},
+							{
+								"time": 0.8667,
+								"offset": 2,
+								"vertices": [ -2.56077, 0.52971, -1.58065, 0.32031, -1.3847, 0.32476, -2.56077, 0.52971 ]
+							},
+							{
+								"time": 1,
+								"offset": 2,
+								"vertices": [ -1.77697, 0.5476, -0.80128, 0.53413, -0.80128, 0.53413, -1.77697, 0.5476 ]
+							}
+						]
+					}
 				},
 				"undies": {
-					"undies": [
-						{
-							"vertices": [ 0.43099, 0.722, 10.60295, -0.117, 2.29599, 0, 2.29599, 0, 2.29599, 0, 0.58799, 0.244, -2.40018, -0.65335, -2.2782, -0.77534, 2.29599, 0, 0.58799, -0.488, 4.98698, -0.117, 6.50797, -0.23399 ]
-						},
-						{
-							"time": 0.1333,
-							"vertices": [ 0.72659, 0.4332, 7.20417, -0.1638, 1.37759, 0, 1.37759, 0, 1.37759, 0, 1.25279, 0.0464, -0.99862, -2.95085, -1.37543, -3.07404, 1.37759, 0, 0.35279, -0.2928, 2.99219, -0.0702, 3.90478, -0.1404 ]
-						},
-						{
-							"time": 0.3333,
-							"vertices": [ 1.16999, 0, 2.10599, -0.23401, 0, 0, 0, 0, 0, 0, 2.24999, -0.24999, -0.4344, 0.60551, -1.55939, 0.48051 ]
-						},
-						{
-							"time": 0.5333,
-							"vertices": [ 1.16999, 0, -0.234, -0.936, -2.92499, 0.351, 0, 0, 0, 0, 0.5, -0.24999, -0.64079, -2.07915, -0.64079, -2.07915 ]
-						},
-						{
-							"time": 0.7,
-							"vertices": [ 1.86271, -0.11514, 4.66327, -0.091, -1.76428, 0.21171, 0, 0, -0.56833, 0.32833, -1.13833, -1.15111, -2.19996, -3.47068, -1.29719, -3.47068, 0, 0, 0, 0, 1.58785, -0.04643, 2.65942, 0.16715 ]
-						},
-						{
-							"time": 0.8333,
-							"vertices": [ 2.41688, -0.20726, 8.58108, 0.585, -0.83571, 0.10029, 0, 0, -1.02299, 0.59099, -2.449, -1.872, -1.625, 0, 0, 0, 0, 0, 0, 0, 2.85813, -0.08357, 4.78695, 0.30086 ]
-						},
-						{
-							"time": 0.8667,
-							"vertices": [ 2.0197, -0.02141, 8.98546, 0.4446, -0.20937, 0.08023, 0.4592, 0, -0.3592, 0.47279, -1.8416, -1.4488, -0.79153, 1.26421, 0.53286, 1.23981, 0.4592, 0, 0.1176, -0.0976, 3.2839, -0.09025, 5.13116, 0.19389 ]
-						},
-						{
-							"time": 1,
-							"vertices": [ 0.43099, 0.722, 10.60295, -0.117, 2.29599, 0, 2.29599, 0, 2.29599, 0, 0.58799, 0.244, -2.40018, -0.65335, -2.2782, -0.77534, 2.29599, 0, 0.58799, -0.488, 4.98698, -0.117, 6.50797, -0.23399 ]
-						}
-					]
+					"undies": {
+						"deform": [
+							{
+								"vertices": [ 0.43099, 0.722, 10.60295, -0.117, 2.29599, 0, 2.29599, 0, 2.29599, 0, 0.58799, 0.244, -2.40018, -0.65335, -2.2782, -0.77534, 2.29599, 0, 0.58799, -0.488, 4.98698, -0.117, 6.50797, -0.23399 ]
+							},
+							{
+								"time": 0.1333,
+								"vertices": [ 0.72659, 0.4332, 7.20417, -0.1638, 1.37759, 0, 1.37759, 0, 1.37759, 0, 1.25279, 0.0464, -0.99862, -2.95085, -1.37543, -3.07404, 1.37759, 0, 0.35279, -0.2928, 2.99219, -0.0702, 3.90478, -0.1404 ]
+							},
+							{
+								"time": 0.3333,
+								"vertices": [ 1.16999, 0, 2.10599, -0.23401, 0, 0, 0, 0, 0, 0, 2.24999, -0.24999, -0.4344, 0.60551, -1.55939, 0.48051 ]
+							},
+							{
+								"time": 0.5333,
+								"vertices": [ 1.16999, 0, -0.234, -0.936, -2.92499, 0.351, 0, 0, 0, 0, 0.5, -0.24999, -0.64079, -2.07915, -0.64079, -2.07915 ]
+							},
+							{
+								"time": 0.7,
+								"vertices": [ 1.86271, -0.11514, 4.66327, -0.091, -1.76428, 0.21171, 0, 0, -0.56833, 0.32833, -1.13833, -1.15111, -2.19996, -3.47068, -1.29719, -3.47068, 0, 0, 0, 0, 1.58785, -0.04643, 2.65942, 0.16715 ]
+							},
+							{
+								"time": 0.8333,
+								"vertices": [ 2.41688, -0.20726, 8.58108, 0.585, -0.83571, 0.10029, 0, 0, -1.02299, 0.59099, -2.449, -1.872, -1.625, 0, 0, 0, 0, 0, 0, 0, 2.85813, -0.08357, 4.78695, 0.30086 ]
+							},
+							{
+								"time": 0.8667,
+								"vertices": [ 2.0197, -0.02141, 8.98546, 0.4446, -0.20937, 0.08023, 0.4592, 0, -0.3592, 0.47279, -1.8416, -1.4488, -0.79153, 1.26421, 0.53286, 1.23981, 0.4592, 0, 0.1176, -0.0976, 3.2839, -0.09025, 5.13116, 0.19389 ]
+							},
+							{
+								"time": 1,
+								"vertices": [ 0.43099, 0.722, 10.60295, -0.117, 2.29599, 0, 2.29599, 0, 2.29599, 0, 0.58799, 0.244, -2.40018, -0.65335, -2.2782, -0.77534, 2.29599, 0, 0.58799, -0.488, 4.98698, -0.117, 6.50797, -0.23399 ]
+							}
+						]
+					}
 				}
 			}
 		}

BIN
examples/goblins/export/goblins-pro.skel


+ 2 - 2
examples/hero/export/hero-ess.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "cJR8Fbsu8Hg",
-	"spine": "4.0.31",
+	"hash": "oG+kkp8qkDs",
+	"spine": "4.1.23-beta",
 	"x": -87.83,
 	"y": 0.01,
 	"width": 319.3,

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


File diff suppressed because it is too large
+ 549 - 499
examples/hero/export/hero-pro.json


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


BIN
examples/mix-and-match/export/mix-and-match-pma.png


File diff suppressed because it is too large
+ 83 - 32
examples/mix-and-match/export/mix-and-match-pro.json


BIN
examples/mix-and-match/export/mix-and-match-pro.skel


BIN
examples/mix-and-match/export/mix-and-match.png


BIN
examples/owl/export/owl-pma.png


File diff suppressed because it is too large
+ 8 - 11
examples/owl/export/owl-pro.json


BIN
examples/owl/export/owl-pro.skel


BIN
examples/owl/export/owl.png


+ 2 - 2
examples/powerup/export/powerup-ess.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "oNeCFa8SiWU",
-	"spine": "4.0.31",
+	"hash": "g51gqFUAXaM",
+	"spine": "4.1.23-beta",
 	"x": -207.3,
 	"y": 119.41,
 	"width": 413.19,

BIN
examples/powerup/export/powerup-ess.skel


+ 51 - 49
examples/powerup/export/powerup-pro.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "1WHGXJIHCvk",
-	"spine": "4.0.31",
+	"hash": "/2dOCTLjcJ4",
+	"spine": "4.1.23-beta",
 	"x": -208.76,
 	"y": 119.41,
 	"width": 414.65,
@@ -661,55 +661,57 @@
 				]
 			}
 		},
-		"deform": {
+		"attachments": {
 			"default": {
 				"token": {
-					"token": [
-						{
-							"offset": 24,
-							"vertices": [ 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 0, 0, 0, 0, 0, 0, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 1.15849, 4.43445, 1.15849, 4.43445, 1.15849, 4.43445, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 1.02358, 4.49763, 1.15849, 4.43445, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443 ]
-						},
-						{
-							"time": 0.1333,
-							"offset": 24,
-							"vertices": [ 0.93183, 20.41183, 0.93183, 20.41183, 0, 0, 0, 0, 0, 0, 0, 0, 0.93183, 20.41183, 0.93183, 20.41183, 0.93183, 20.41183, 0, 0, 0.94709, 18.11185, 0.94709, 18.11185, 1.40152, 12.2491, 1.23232, 5.895, 1.23232, 5.895, 1.23232, 5.895, 1.23232, 5.895, 1.23232, 5.895, 1.40152, 12.2491, 1.40152, 12.2491, 1.38626, 14.54909, 1.38626, 14.54909, 1.38626, 14.54909, 1.38626, 14.54909, 1.38626, 14.54909 ]
-						},
-						{
-							"time": 0.3333,
-							"offset": 24,
-							"vertices": [ 0.95955, 23.54837, 0.95955, 23.54837, 0, 0, 0, 0, 0, 0, 0, 0, 0.95955, 23.54837, 0.95955, 23.54837, 0.95955, 23.54837, 0, 0, 0.97481, 21.24838, 0.97481, 21.24838, 1.30775, 14.49709, 1.13855, 8.14299, 1.13855, 8.14299, 1.13855, 8.14299, 1.13855, 8.14299, 1.13855, 8.14299, 1.28003, 11.36055, 1.30775, 14.49709, 1.29249, 16.79707, 1.29249, 16.79707, 1.29249, 16.79707, 1.29249, 16.79707, 1.29249, 16.79707 ]
-						},
-						{
-							"time": 0.5333,
-							"offset": 24,
-							"vertices": [ 1.40748, -10.36231, 1.40748, -10.36231, 0, 0, 0, 0, 0, 0, 0, 0, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 0, 0, 1.42274, -12.6623, 1.42274, -12.6623, 1.42274, -12.6623, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 1.11919, -12.52014, 1.42274, -12.6623, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231 ]
-						},
-						{
-							"time": 0.7,
-							"offset": 24,
-							"vertices": [ 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 0, 0, 0, 0, 0, 0, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 1.15849, 4.43445, 1.15849, 4.43445, 1.15849, 4.43445, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 1.02358, 4.49763, 1.15849, 4.43445, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443 ]
-						},
-						{
-							"time": 0.8333,
-							"offset": 24,
-							"vertices": [ 0.93183, 20.41183, 0.93183, 20.41183, 0, 0, 0, 0, 0, 0, 0, 0, 0.93183, 20.41183, 0.93183, 20.41183, 0.93183, 20.41183, 0, 0, 0.94709, 18.11185, 0.94709, 18.11185, 2.16758, 9.46033, 1.99838, 3.10623, 1.99838, 3.10623, 1.99838, 3.10623, 1.99838, 3.10623, 1.99838, 3.10623, 2.16758, 9.46033, 2.16758, 9.46033, 2.15232, 11.76031, 2.15232, 11.76031, 2.15232, 11.76031, 2.15232, 11.76031, 2.15232, 11.76031 ]
-						},
-						{
-							"time": 1.0333,
-							"offset": 24,
-							"vertices": [ 0.95955, 23.54837, 0.95955, 23.54837, 0, 0, 0, 0, 0, 0, 0, 0, 0.95955, 23.54837, 0.95955, 23.54837, 0.95955, 23.54837, 0, 0, 0.97481, 21.24838, 0.97481, 21.24838, 0.93016, 16.19705, 0.76096, 9.84296, 0.76096, 9.84296, 0.76096, 9.84296, 0.76096, 9.84296, 0.76096, 9.84296, 0.90244, 13.06052, 0.93016, 16.19705, 0.9149, 18.49704, 0.9149, 18.49704, 0.9149, 18.49704, 0.9149, 18.49704, 0.9149, 18.49704 ]
-						},
-						{
-							"time": 1.2333,
-							"offset": 24,
-							"vertices": [ 1.40748, -10.36231, 1.40748, -10.36231, 0, 0, 0, 0, 0, 0, 0, 0, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 0, 0, 1.42274, -12.6623, 1.42274, -12.6623, 1.42274, -12.6623, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 1.11919, -12.52014, 1.42274, -12.6623, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231 ]
-						},
-						{
-							"time": 1.4,
-							"offset": 24,
-							"vertices": [ 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 0, 0, 0, 0, 0, 0, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 1.15849, 4.43445, 1.15849, 4.43445, 1.15849, 4.43445, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 1.02358, 4.49763, 1.15849, 4.43445, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443 ]
-						}
-					]
+					"token": {
+						"deform": [
+							{
+								"offset": 24,
+								"vertices": [ 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 0, 0, 0, 0, 0, 0, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 1.15849, 4.43445, 1.15849, 4.43445, 1.15849, 4.43445, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 1.02358, 4.49763, 1.15849, 4.43445, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443 ]
+							},
+							{
+								"time": 0.1333,
+								"offset": 24,
+								"vertices": [ 0.93183, 20.41183, 0.93183, 20.41183, 0, 0, 0, 0, 0, 0, 0, 0, 0.93183, 20.41183, 0.93183, 20.41183, 0.93183, 20.41183, 0, 0, 0.94709, 18.11185, 0.94709, 18.11185, 1.40152, 12.2491, 1.23232, 5.895, 1.23232, 5.895, 1.23232, 5.895, 1.23232, 5.895, 1.23232, 5.895, 1.40152, 12.2491, 1.40152, 12.2491, 1.38626, 14.54909, 1.38626, 14.54909, 1.38626, 14.54909, 1.38626, 14.54909, 1.38626, 14.54909 ]
+							},
+							{
+								"time": 0.3333,
+								"offset": 24,
+								"vertices": [ 0.95955, 23.54837, 0.95955, 23.54837, 0, 0, 0, 0, 0, 0, 0, 0, 0.95955, 23.54837, 0.95955, 23.54837, 0.95955, 23.54837, 0, 0, 0.97481, 21.24838, 0.97481, 21.24838, 1.30775, 14.49709, 1.13855, 8.14299, 1.13855, 8.14299, 1.13855, 8.14299, 1.13855, 8.14299, 1.13855, 8.14299, 1.28003, 11.36055, 1.30775, 14.49709, 1.29249, 16.79707, 1.29249, 16.79707, 1.29249, 16.79707, 1.29249, 16.79707, 1.29249, 16.79707 ]
+							},
+							{
+								"time": 0.5333,
+								"offset": 24,
+								"vertices": [ 1.40748, -10.36231, 1.40748, -10.36231, 0, 0, 0, 0, 0, 0, 0, 0, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 0, 0, 1.42274, -12.6623, 1.42274, -12.6623, 1.42274, -12.6623, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 1.11919, -12.52014, 1.42274, -12.6623, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231 ]
+							},
+							{
+								"time": 0.7,
+								"offset": 24,
+								"vertices": [ 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 0, 0, 0, 0, 0, 0, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 1.15849, 4.43445, 1.15849, 4.43445, 1.15849, 4.43445, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 1.02358, 4.49763, 1.15849, 4.43445, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443 ]
+							},
+							{
+								"time": 0.8333,
+								"offset": 24,
+								"vertices": [ 0.93183, 20.41183, 0.93183, 20.41183, 0, 0, 0, 0, 0, 0, 0, 0, 0.93183, 20.41183, 0.93183, 20.41183, 0.93183, 20.41183, 0, 0, 0.94709, 18.11185, 0.94709, 18.11185, 2.16758, 9.46033, 1.99838, 3.10623, 1.99838, 3.10623, 1.99838, 3.10623, 1.99838, 3.10623, 1.99838, 3.10623, 2.16758, 9.46033, 2.16758, 9.46033, 2.15232, 11.76031, 2.15232, 11.76031, 2.15232, 11.76031, 2.15232, 11.76031, 2.15232, 11.76031 ]
+							},
+							{
+								"time": 1.0333,
+								"offset": 24,
+								"vertices": [ 0.95955, 23.54837, 0.95955, 23.54837, 0, 0, 0, 0, 0, 0, 0, 0, 0.95955, 23.54837, 0.95955, 23.54837, 0.95955, 23.54837, 0, 0, 0.97481, 21.24838, 0.97481, 21.24838, 0.93016, 16.19705, 0.76096, 9.84296, 0.76096, 9.84296, 0.76096, 9.84296, 0.76096, 9.84296, 0.76096, 9.84296, 0.90244, 13.06052, 0.93016, 16.19705, 0.9149, 18.49704, 0.9149, 18.49704, 0.9149, 18.49704, 0.9149, 18.49704, 0.9149, 18.49704 ]
+							},
+							{
+								"time": 1.2333,
+								"offset": 24,
+								"vertices": [ 1.40748, -10.36231, 1.40748, -10.36231, 0, 0, 0, 0, 0, 0, 0, 0, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 0, 0, 1.42274, -12.6623, 1.42274, -12.6623, 1.42274, -12.6623, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 0.6838, -1.83327, 1.11919, -12.52014, 1.42274, -12.6623, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231, 1.40748, -10.36231 ]
+							},
+							{
+								"time": 1.4,
+								"offset": 24,
+								"vertices": [ 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 0, 0, 0, 0, 0, 0, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 0, 0, 1.15849, 4.43445, 1.15849, 4.43445, 1.15849, 4.43445, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 0.73607, 5.7173, 1.02358, 4.49763, 1.15849, 4.43445, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443, 1.14323, 6.73443 ]
+							}
+						]
+					}
 				}
 			}
 		}

BIN
examples/powerup/export/powerup-pro.skel


BIN
examples/raptor/export/raptor-pma.png


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


BIN
examples/raptor/export/raptor-pro.skel


BIN
examples/raptor/export/raptor.png


BIN
examples/raptor/raptor-pro.spine


+ 2 - 2
examples/speedy/export/speedy-ess.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "Q9eFOmFPMXI",
-	"spine": "4.0.31",
+	"hash": "D5Ad2Zbw5iM",
+	"spine": "4.1.23-beta",
 	"x": -95.43,
 	"y": -18.79,
 	"width": 196.03,

BIN
examples/speedy/export/speedy-ess.skel


+ 3 - 3
examples/spineboy/export/spineboy-ess.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "lS/mQzJwi+I",
-	"spine": "4.0.31",
+	"hash": "SmUDxzck41o",
+	"spine": "4.1.23-beta",
 	"x": -221.27,
 	"y": -8.57,
 	"width": 470.72,
@@ -2926,7 +2926,7 @@
 					{ "time": 0.2, "name": "muzzle02" },
 					{ "time": 0.2667, "name": "muzzle03" },
 					{ "time": 0.3333, "name": "muzzle04" },
-					{ "time": 0.3667, "name": null }
+					{ "time": 0.3667 }
 				]
 			}
 		},

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


BIN
examples/spineboy/export/spineboy-pma.png


+ 78 - 70
examples/spineboy/export/spineboy-pro.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "IQgkYFQG8ng",
-	"spine": "4.0.31",
+	"hash": "itfFESDjM1c",
+	"spine": "4.1.23-beta",
 	"x": -188.63,
 	"y": -7.94,
 	"width": 418.45,
@@ -2427,19 +2427,19 @@
 			"side-glow1": {
 				"attachment": [
 					{ "name": "hoverglow-small" },
-					{ "time": 0.9667, "name": null }
+					{ "time": 0.9667 }
 				]
 			},
 			"side-glow2": {
 				"attachment": [
 					{ "time": 0.0667, "name": "hoverglow-small" },
-					{ "time": 1, "name": null }
+					{ "time": 1 }
 				]
 			},
 			"side-glow3": {
 				"attachment": [
 					{ "name": "hoverglow-small" },
-					{ "time": 0.9667, "name": null }
+					{ "time": 0.9667 }
 				]
 			}
 		},
@@ -3479,60 +3479,68 @@
 				{ "mixX": 0, "mixScaleX": 0, "mixShearY": 0 }
 			]
 		},
-		"deform": {
+		"attachments": {
 			"default": {
 				"front-foot": {
-					"front-foot": [
-						{
-							"offset": 26,
-							"vertices": [ -0.02832, -5.37024, -0.02832, -5.37024, 3.8188, -3.7757, -0.02832, -5.37024, -3.82159, 3.77847 ]
-						}
-					]
+					"front-foot": {
+						"deform": [
+							{
+								"offset": 26,
+								"vertices": [ -0.02832, -5.37024, -0.02832, -5.37024, 3.8188, -3.7757, -0.02832, -5.37024, -3.82159, 3.77847 ]
+							}
+						]
+					}
 				},
 				"front-shin": {
-					"front-shin": [
-						{
-							"offset": 14,
-							"vertices": [ 0.5298, -1.12677, -0.85507, -4.20587, -11.35158, -10.19225, -10.79865, -8.43765, -6.06447, -6.89757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.54892, -3.06021, 1.48463, -2.29663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.80437, -7.01817 ]
-						},
-						{
-							"time": 0.3667,
-							"offset": 14,
-							"vertices": [ 0.5298, -1.12677, -11.66571, -9.07211, -25.65866, -17.53735, -25.53217, -16.50978, -11.78232, -11.26097, 0, 0, 0.60487, -1.63589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.60487, -1.63589, 0, 0, -2.64522, -7.35739, 1.48463, -2.29663, 0, 0, 0, 0, 0, 0, 0.60487, -1.63589, 0.60487, -1.63589, 0.60487, -1.63589, 0.60487, -1.63589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.60487, -1.63589, 0, 0, -10.06873, -12.0999 ]
-						},
-						{
-							"time": 0.5333,
-							"offset": 14,
-							"vertices": [ 0.5298, -1.12677, -0.85507, -4.20587, -7.00775, -8.24771, -6.45482, -6.49312, -6.06447, -6.89757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.54892, -3.06021, 1.48463, -2.29663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.80437, -7.01817 ]
-						},
-						{
-							"time": 1,
-							"offset": 14,
-							"vertices": [ 0.5298, -1.12677, -0.85507, -4.20587, -11.35158, -10.19225, -10.79865, -8.43765, -6.06447, -6.89757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.54892, -3.06021, 1.48463, -2.29663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.80437, -7.01817 ]
-						}
-					]
+					"front-shin": {
+						"deform": [
+							{
+								"offset": 14,
+								"vertices": [ 0.5298, -1.12677, -0.85507, -4.20587, -11.35158, -10.19225, -10.79865, -8.43765, -6.06447, -6.89757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.54892, -3.06021, 1.48463, -2.29663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.80437, -7.01817 ]
+							},
+							{
+								"time": 0.3667,
+								"offset": 14,
+								"vertices": [ 0.5298, -1.12677, -11.66571, -9.07211, -25.65866, -17.53735, -25.53217, -16.50978, -11.78232, -11.26097, 0, 0, 0.60487, -1.63589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.60487, -1.63589, 0, 0, -2.64522, -7.35739, 1.48463, -2.29663, 0, 0, 0, 0, 0, 0, 0.60487, -1.63589, 0.60487, -1.63589, 0.60487, -1.63589, 0.60487, -1.63589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.60487, -1.63589, 0, 0, -10.06873, -12.0999 ]
+							},
+							{
+								"time": 0.5333,
+								"offset": 14,
+								"vertices": [ 0.5298, -1.12677, -0.85507, -4.20587, -7.00775, -8.24771, -6.45482, -6.49312, -6.06447, -6.89757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.54892, -3.06021, 1.48463, -2.29663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.80437, -7.01817 ]
+							},
+							{
+								"time": 1,
+								"offset": 14,
+								"vertices": [ 0.5298, -1.12677, -0.85507, -4.20587, -11.35158, -10.19225, -10.79865, -8.43765, -6.06447, -6.89757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.54892, -3.06021, 1.48463, -2.29663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.80437, -7.01817 ]
+							}
+						]
+					}
 				},
 				"hoverboard-board": {
-					"hoverboard-board": [
-						{
-							"curve": [ 0.067, 0, 0.2, 1 ]
-						},
-						{
-							"time": 0.2667,
-							"offset": 1,
-							"vertices": [ 2.45856, 0, 0, 0, 0, 0, 0, 0, 0, 3.55673, -3.0E-4, 3.55673, -3.0E-4, 0, 0, 0, 0, 0, 0, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, 0, 0, 0, 0, 0, 0, 0, 0, -4.90558, 0.11214, -9.40706, 6.2E-4, -6.34871, 4.3E-4, -6.34925, -6.57018, -6.34925, -6.57018, -6.34871, 4.3E-4, -2.3308, 1.7E-4, -2.33133, -6.57045, -2.33133, -6.57045, -2.3308, 1.7E-4, 0, 0, 1.2E-4, 2.45856, 1.2E-4, 2.45856, 1.2E-4, 2.45856, 1.2E-4, 2.45856, 3.3297, 4.44005, 3.3297, 4.44005, 3.3297, 4.44005, 1.2E-4, 2.45856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.46227, 1.7E-4, -2.46227, 1.7E-4, -2.52316, 1.1313, -2.52316, 1.1313, -2.52316, 1.1313, 1.2E-4, 2.45856, 1.2E-4, 2.45856, -9.40694, 2.45918, 1.88063, 0.44197, -2.9E-4, -3.54808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.52316, 1.1313, -2.52316, 1.1313, -2.52316, 1.1313, -2.46227, 1.7E-4, -2.46227, 1.7E-4, -2.46227, 1.7E-4, 0, 0, 0, 0, 1.2E-4, 2.45856 ],
-							"curve": [ 0.45, 0, 0.817, 1 ]
-						},
-						{ "time": 1 }
-					]
+					"hoverboard-board": {
+						"deform": [
+							{
+								"curve": [ 0.067, 0, 0.2, 1 ]
+							},
+							{
+								"time": 0.2667,
+								"offset": 1,
+								"vertices": [ 2.45856, 0, 0, 0, 0, 0, 0, 0, 0, 3.55673, -3.0E-4, 3.55673, -3.0E-4, 0, 0, 0, 0, 0, 0, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, -7.6E-4, -9.84158, 0, 0, 0, 0, 0, 0, 0, 0, -4.90558, 0.11214, -9.40706, 6.2E-4, -6.34871, 4.3E-4, -6.34925, -6.57018, -6.34925, -6.57018, -6.34871, 4.3E-4, -2.3308, 1.7E-4, -2.33133, -6.57045, -2.33133, -6.57045, -2.3308, 1.7E-4, 0, 0, 1.2E-4, 2.45856, 1.2E-4, 2.45856, 1.2E-4, 2.45856, 1.2E-4, 2.45856, 3.3297, 4.44005, 3.3297, 4.44005, 3.3297, 4.44005, 1.2E-4, 2.45856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.46227, 1.7E-4, -2.46227, 1.7E-4, -2.52316, 1.1313, -2.52316, 1.1313, -2.52316, 1.1313, 1.2E-4, 2.45856, 1.2E-4, 2.45856, -9.40694, 2.45918, 1.88063, 0.44197, -2.9E-4, -3.54808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.52316, 1.1313, -2.52316, 1.1313, -2.52316, 1.1313, -2.46227, 1.7E-4, -2.46227, 1.7E-4, -2.46227, 1.7E-4, 0, 0, 0, 0, 1.2E-4, 2.45856 ],
+								"curve": [ 0.45, 0, 0.817, 1 ]
+							},
+							{ "time": 1 }
+						]
+					}
 				},
 				"rear-foot": {
-					"rear-foot": [
-						{
-							"offset": 28,
-							"vertices": [ -1.93078, 1.34782, -0.31417, 2.33363, 3.05122, 0.33946, 2.31472, -2.01678, 2.17583, -2.05795, -0.04277, -2.99459, 1.15429, 0.26328, 0.97501, -0.67169 ]
-						}
-					]
+					"rear-foot": {
+						"deform": [
+							{
+								"offset": 28,
+								"vertices": [ -1.93078, 1.34782, -0.31417, 2.33363, 3.05122, 0.33946, 2.31472, -2.01678, 2.17583, -2.05795, -0.04277, -2.99459, 1.15429, 0.26328, 0.97501, -0.67169 ]
+							}
+						]
+					}
 				}
 			}
 		}
@@ -5203,7 +5211,7 @@
 			"portal-bg": {
 				"attachment": [
 					{ "name": "portal-bg" },
-					{ "time": 3, "name": null }
+					{ "time": 3 }
 				]
 			},
 			"portal-flare1": {
@@ -5214,7 +5222,7 @@
 					{ "time": 1.2, "name": "portal-flare1" },
 					{ "time": 1.2333, "name": "portal-flare2" },
 					{ "time": 1.2667, "name": "portal-flare1" },
-					{ "time": 1.3333, "name": null }
+					{ "time": 1.3333 }
 				]
 			},
 			"portal-flare2": {
@@ -5224,14 +5232,14 @@
 					{ "time": 1.1667, "name": "portal-flare1" },
 					{ "time": 1.2, "name": "portal-flare2" },
 					{ "time": 1.2333, "name": "portal-flare3" },
-					{ "time": 1.2667, "name": null }
+					{ "time": 1.2667 }
 				]
 			},
 			"portal-flare3": {
 				"attachment": [
 					{ "time": 1.2, "name": "portal-flare3" },
 					{ "time": 1.2333, "name": "portal-flare2" },
-					{ "time": 1.2667, "name": null }
+					{ "time": 1.2667 }
 				]
 			},
 			"portal-flare4": {
@@ -5239,33 +5247,33 @@
 					{ "time": 1.2, "name": "portal-flare2" },
 					{ "time": 1.2333, "name": "portal-flare1" },
 					{ "time": 1.2667, "name": "portal-flare2" },
-					{ "time": 1.3333, "name": null }
+					{ "time": 1.3333 }
 				]
 			},
 			"portal-flare5": {
 				"attachment": [
 					{ "time": 1.2333, "name": "portal-flare3" },
 					{ "time": 1.2667, "name": "portal-flare1" },
-					{ "time": 1.3333, "name": null }
+					{ "time": 1.3333 }
 				]
 			},
 			"portal-flare6": {
 				"attachment": [
 					{ "time": 1.2667, "name": "portal-flare3" },
-					{ "time": 1.3333, "name": null }
+					{ "time": 1.3333 }
 				]
 			},
 			"portal-flare7": {
 				"attachment": [
 					{ "time": 1.1333, "name": "portal-flare2" },
-					{ "time": 1.1667, "name": null }
+					{ "time": 1.1667 }
 				]
 			},
 			"portal-flare8": {
 				"attachment": [
 					{ "time": 1.2, "name": "portal-flare3" },
 					{ "time": 1.2333, "name": "portal-flare2" },
-					{ "time": 1.2667, "name": null }
+					{ "time": 1.2667 }
 				]
 			},
 			"portal-flare9": {
@@ -5273,7 +5281,7 @@
 					{ "time": 1.2, "name": "portal-flare2" },
 					{ "time": 1.2333, "name": "portal-flare3" },
 					{ "time": 1.2667, "name": "portal-flare1" },
-					{ "time": 1.3, "name": null }
+					{ "time": 1.3 }
 				]
 			},
 			"portal-flare10": {
@@ -5281,25 +5289,25 @@
 					{ "time": 1.2, "name": "portal-flare2" },
 					{ "time": 1.2333, "name": "portal-flare1" },
 					{ "time": 1.2667, "name": "portal-flare3" },
-					{ "time": 1.3, "name": null }
+					{ "time": 1.3 }
 				]
 			},
 			"portal-shade": {
 				"attachment": [
 					{ "name": "portal-shade" },
-					{ "time": 3, "name": null }
+					{ "time": 3 }
 				]
 			},
 			"portal-streaks1": {
 				"attachment": [
 					{ "name": "portal-streaks1" },
-					{ "time": 3, "name": null }
+					{ "time": 3 }
 				]
 			},
 			"portal-streaks2": {
 				"attachment": [
 					{ "name": "portal-streaks2" },
-					{ "time": 3, "name": null }
+					{ "time": 3 }
 				]
 			}
 		},
@@ -7696,7 +7704,7 @@
 					{ "time": 0.1, "name": "muzzle03" },
 					{ "time": 0.1333, "name": "muzzle04" },
 					{ "time": 0.1667, "name": "muzzle05" },
-					{ "time": 0.2, "name": null }
+					{ "time": 0.2 }
 				]
 			},
 			"muzzle-glow": {
@@ -7725,7 +7733,7 @@
 				],
 				"attachment": [
 					{ "time": 0.0333, "name": "muzzle-ring" },
-					{ "time": 0.2333, "name": null }
+					{ "time": 0.2333 }
 				]
 			},
 			"muzzle-ring2": {
@@ -7739,7 +7747,7 @@
 				],
 				"attachment": [
 					{ "time": 0.0333, "name": "muzzle-ring" },
-					{ "time": 0.2, "name": null }
+					{ "time": 0.2 }
 				]
 			},
 			"muzzle-ring3": {
@@ -7753,7 +7761,7 @@
 				],
 				"attachment": [
 					{ "time": 0.0333, "name": "muzzle-ring" },
-					{ "time": 0.2, "name": null }
+					{ "time": 0.2 }
 				]
 			},
 			"muzzle-ring4": {
@@ -7767,7 +7775,7 @@
 				],
 				"attachment": [
 					{ "time": 0.0333, "name": "muzzle-ring" },
-					{ "time": 0.2, "name": null }
+					{ "time": 0.2 }
 				]
 			}
 		},

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


BIN
examples/spineboy/export/spineboy.png


+ 2 - 2
examples/spinosaurus/export/spinosaurus-ess.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "Ytk7Zos6DR4",
-	"spine": "4.0.31",
+	"hash": "9GzkJCsNn3g",
+	"spine": "4.1.23-beta",
 	"x": -840,
 	"y": -766.03,
 	"width": 1680,

BIN
examples/spinosaurus/export/spinosaurus-ess.skel


+ 140 - 136
examples/stretchyman/export/stretchyman-pro.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "F+EPhClYhR8",
-	"spine": "4.0.31",
+	"hash": "QqiPXGOfONE",
+	"spine": "4.1.23-beta",
 	"x": -100.47,
 	"y": -9.21,
 	"width": 260.65,
@@ -1966,144 +1966,148 @@
 				{ "mix": 0 }
 			]
 		},
-		"deform": {
+		"attachments": {
 			"default": {
 				"back-leg-path": {
-					"back-leg-path": [
-						{
-							"curve": [ 0.158, 0, 0.475, 1 ]
-						},
-						{
-							"time": 0.6333,
-							"offset": 6,
-							"vertices": [ 7.58212, 6.44012, -6.24036, 7.74866, 0, 0, 0, 0, -8.65305, -6.0506, 5.82422, -8.80603 ],
-							"curve": [ 0.771, 0, 1.005, 0.48 ]
-						},
-						{
-							"time": 1.2,
-							"offset": 6,
-							"vertices": [ 1.75757, 1.49285, -1.44654, 1.79617, 0, 0, 0, 0, -2.00581, -1.40255, 1.35008, -2.04128 ],
-							"curve": [ 1.215, 0, 1.225, 0.03 ]
-						},
-						{
-							"time": 1.2333,
-							"offset": 6,
-							"vertices": [ 11.07889, 9.19726, -3.09299, 13.71402, 9.39429, 7.76639, -1.7065, 11.99242, 7.47175, 6.42206, -0.41247, 10.03589 ],
-							"curve": [ 1.246, 0.12, 1.254, 0.27 ]
-						},
-						{
-							"time": 1.2667,
-							"offset": 6,
-							"vertices": [ 10.10474, 8.7463, -2.36874, 12.63447, 8.81438, 7.65029, -1.30674, 11.31577, 7.34177, 6.62058, -0.31555, 9.81713 ],
-							"curve": [ 1.275, 0.62, 1.286, 0.79 ]
-						},
-						{
-							"time": 1.3,
-							"offset": 6,
-							"vertices": [ 3.4599, -0.42859, 1.07778, 1.47922, 2.60141, -1.15778, 1.78435, 0.60187, 1.62166, -1.84286, 2.4438, -0.3952 ],
-							"curve": [ 1.354, 0.76, 1.414, 1 ]
-						},
-						{
-							"time": 1.4333,
-							"offset": 6,
-							"vertices": [ -4.08505, -24.14874, 13.996, -20.09798, -4.08505, -24.14874, 13.996, -20.09798, -4.08505, -24.14874, 13.996, -20.09798 ]
-						},
-						{
-							"time": 1.5,
-							"vertices": [ 4.67719, -35.44354, 0, 0, -11.37146, 49.53738, 17.39343, -2.33365, 4.23248, 5.68374, -9.56653, -24.74756, 11.45203, -23.93552, -27.49841, -64.4725, 35.55432, -56.67893, 34.69244, -51.5341, 0, 0, 13.30164, -100.17206 ]
-						},
-						{
-							"time": 1.5333,
-							"vertices": [ 1.85684, -28.94159, 0, 0, -12.58768, 38.57599, 11.30969, 16.17496, -13.13428, 1.4907, -12.13364, -13.87851, 4.3075, -20.49398, -34.95135, -45.73811, 21.12878, -45.5335, 30.62613, -45.13649, 0, 0, -0.15961, -190.51059 ]
-						},
-						{
-							"time": 1.5667,
-							"vertices": [ -0.9635, -22.43964, 0, 0, -13.80389, 27.61459, 1.79449, 28.22318, -27.06714, -9.07224, -6.2052, -1.21002, 1.34003, -9.39124, -24.41541, -19.97638, 12.56061, -16.52356, 26.55981, -38.73888, 0, 0, -13.62085, -280.84912 ]
-						},
-						{
-							"time": 1.6,
-							"vertices": [ -0.64233, -14.95974, 0, 0, -9.20259, 18.40971, 13.73107, 41.19725, -42.90586, -9.10037, 4.13583, -3.71808, 4.12607, -1.04554, -17.52923, -15.07591, 15.79826, -11.47559, 17.70652, -25.82589, 0, 0, -9.08056, -187.23253 ]
-						},
-						{
-							"time": 1.6333,
-							"vertices": [ -0.32117, -7.47987, 0, 0, -4.60129, 9.20485, 3.14877, 52.3598, -63.25818, -29.05335, -8.042, -8.03761, 2.39843, -12.62472, -33.16191, -11.98693, 14.52224, -26.35249, 8.85326, -12.91294, 0, 0, -4.54028, -93.61627 ]
-						},
-						{ "time": 1.6667 }
-					]
+					"back-leg-path": {
+						"deform": [
+							{
+								"curve": [ 0.158, 0, 0.475, 1 ]
+							},
+							{
+								"time": 0.6333,
+								"offset": 6,
+								"vertices": [ 7.58212, 6.44012, -6.24036, 7.74866, 0, 0, 0, 0, -8.65305, -6.0506, 5.82422, -8.80603 ],
+								"curve": [ 0.771, 0, 1.005, 0.48 ]
+							},
+							{
+								"time": 1.2,
+								"offset": 6,
+								"vertices": [ 1.75757, 1.49285, -1.44654, 1.79617, 0, 0, 0, 0, -2.00581, -1.40255, 1.35008, -2.04128 ],
+								"curve": [ 1.215, 0, 1.225, 0.03 ]
+							},
+							{
+								"time": 1.2333,
+								"offset": 6,
+								"vertices": [ 11.07889, 9.19726, -3.09299, 13.71402, 9.39429, 7.76639, -1.7065, 11.99242, 7.47175, 6.42206, -0.41247, 10.03589 ],
+								"curve": [ 1.246, 0.12, 1.254, 0.27 ]
+							},
+							{
+								"time": 1.2667,
+								"offset": 6,
+								"vertices": [ 10.10474, 8.7463, -2.36874, 12.63447, 8.81438, 7.65029, -1.30674, 11.31577, 7.34177, 6.62058, -0.31555, 9.81713 ],
+								"curve": [ 1.275, 0.62, 1.286, 0.79 ]
+							},
+							{
+								"time": 1.3,
+								"offset": 6,
+								"vertices": [ 3.4599, -0.42859, 1.07778, 1.47922, 2.60141, -1.15778, 1.78435, 0.60187, 1.62166, -1.84286, 2.4438, -0.3952 ],
+								"curve": [ 1.354, 0.76, 1.414, 1 ]
+							},
+							{
+								"time": 1.4333,
+								"offset": 6,
+								"vertices": [ -4.08505, -24.14874, 13.996, -20.09798, -4.08505, -24.14874, 13.996, -20.09798, -4.08505, -24.14874, 13.996, -20.09798 ]
+							},
+							{
+								"time": 1.5,
+								"vertices": [ 4.67719, -35.44354, 0, 0, -11.37146, 49.53738, 17.39343, -2.33365, 4.23248, 5.68374, -9.56653, -24.74756, 11.45203, -23.93552, -27.49841, -64.4725, 35.55432, -56.67893, 34.69244, -51.5341, 0, 0, 13.30164, -100.17206 ]
+							},
+							{
+								"time": 1.5333,
+								"vertices": [ 1.85684, -28.94159, 0, 0, -12.58768, 38.57599, 11.30969, 16.17496, -13.13428, 1.4907, -12.13364, -13.87851, 4.3075, -20.49398, -34.95135, -45.73811, 21.12878, -45.5335, 30.62613, -45.13649, 0, 0, -0.15961, -190.51059 ]
+							},
+							{
+								"time": 1.5667,
+								"vertices": [ -0.9635, -22.43964, 0, 0, -13.80389, 27.61459, 1.79449, 28.22318, -27.06714, -9.07224, -6.2052, -1.21002, 1.34003, -9.39124, -24.41541, -19.97638, 12.56061, -16.52356, 26.55981, -38.73888, 0, 0, -13.62085, -280.84912 ]
+							},
+							{
+								"time": 1.6,
+								"vertices": [ -0.64233, -14.95974, 0, 0, -9.20259, 18.40971, 13.73107, 41.19725, -42.90586, -9.10037, 4.13583, -3.71808, 4.12607, -1.04554, -17.52923, -15.07591, 15.79826, -11.47559, 17.70652, -25.82589, 0, 0, -9.08056, -187.23253 ]
+							},
+							{
+								"time": 1.6333,
+								"vertices": [ -0.32117, -7.47987, 0, 0, -4.60129, 9.20485, 3.14877, 52.3598, -63.25818, -29.05335, -8.042, -8.03761, 2.39843, -12.62472, -33.16191, -11.98693, 14.52224, -26.35249, 8.85326, -12.91294, 0, 0, -4.54028, -93.61627 ]
+							},
+							{ "time": 1.6667 }
+						]
+					}
 				},
 				"front-leg-path": {
-					"front-leg-path": [
-						{
-							"curve": [ 0.075, 0, 0.189, 0.28 ]
-						},
-						{
-							"time": 0.3,
-							"vertices": [ 0.05087, -3.38688, 0, 0, 1.38452, 5.97834, -14.9041, 2.01206, 1.44487, -6.80281, -14.9041, 2.01206, 1.44487, -6.80281, -14.9041, 2.01206, 1.44487, -6.80281 ],
-							"curve": [ 0.323, 0.2, 0.345, 0.35 ]
-						},
-						{
-							"time": 0.3667,
-							"vertices": [ 0.07139, -4.75271, 0, 0, 1.94286, 8.38924, 4.65956, 20.90988, -6.00341, 18.98861, -0.14155, 20.92476, -9.36768, 15.5653, -12.20349, 23.97896, -19.98153, 9.06929 ],
-							"curve": [ 0.39, 0.31, 0.412, 0.53 ]
-						},
-						{
-							"time": 0.4333,
-							"vertices": [ 0.08487, -5.65058, 0, 0, 2.3099, 9.97411, 6.09287, 20.58425, -8.39331, 19.11554, -1.86437, 20.6089, -13.96917, 13.44183, -21.85559, 25.6709, -31.56034, 2.67548 ],
-							"curve": [ 0.438, 0.32, 0.451, 0.54 ]
-						},
-						{
-							"time": 0.4667,
-							"vertices": [ 0.09099, -6.05806, 0, 0, 2.47648, 10.69338, 6.80647, 9.95062, -1.39596, 12.12401, -2.58313, 9.97971, -7.97551, 5.429, -26.17287, 15.95288, -28.7332, -7.27536 ],
-							"curve": [ 0.491, 0.92, 0.521, 0.99 ]
-						},
-						{
-							"time": 0.5333,
-							"vertices": [ 0.0938, -6.24474, 0, 0, 2.55279, 11.0229, 3.37726, -9.77658, 9.35123, -4.41786, -6.66855, -9.74546, 2.31187, -11.58077, -31.90691, -3.35485, -19.89651, -25.173 ],
-							"curve": [ 0.54, 0.52, 0.553, 0.77 ]
-						},
-						{
-							"time": 0.5667,
-							"vertices": [ 0.12554, -7.9214, 0, 0, 0.6047, 13.76218, 28.2061, -4.72442, -24.72498, -10.04851, -1.08998, -15.00371, 3.89968, -14.73675, -45.72995, -9.44002, -7.51602, -33.5578, 22.59846, -13.40422, 0, 0, -21.81488, -287.65363 ],
-							"curve": [ 0.579, 1, 0.592, 1 ]
-						},
-						{
-							"time": 0.6,
-							"vertices": [ 0.12969, -8.14021, 0, 0, 0.35046, 14.11967, 49.51149, 65.25623, -80.01971, 39.68078, -0.36196, -15.68993, 4.10689, -15.14861, -62.03986, -28.71517, 2.78595, -56.47927, 41.45007, -31.91446, 0, 0, -19.75009, -6.99966 ]
-						},
-						{
-							"time": 0.6333,
-							"vertices": [ 0.16366, -9.90768, 0, 0, -1.90419, 16.9905, 99.3634, 33.16509, -81.26534, 35.35141, -0.72391, -31.37989, 8.2138, -30.29725, -84.11658, -22.14578, -6.24997, -61.22949, 46.91129, -33.41971, 0, 0, -31.98465, -262.01813 ]
-						},
-						{
-							"time": 0.6667,
-							"vertices": [ 0.18382, -11.1283, 0, 0, -2.13879, 19.08371, 85.97569, 24.69115, -94.39235, -5.64914, 3.63728, -14.95789, -10.54588, -27.66409, -78.76755, -2.82176, -20.92926, -42.81331, 26.18336, -20.74105, 0, 0, -159.67368, -300.67038 ]
-						},
-						{
-							"time": 0.7,
-							"vertices": [ 0.20398, -12.34892, 0, 0, -2.37338, 21.17692, 70.14705, -52.80042, -51.24022, -73.25025, 20.8386, -23.27967, -12.66359, -23.66, -39.22493, -9.41795, -5.46658, 10.6813, 1.18861, 10.38911, 0, 0, -400.93036, -315.42963 ]
-						},
-						{
-							"time": 0.7333,
-							"vertices": [ 0.13599, -8.23261, 0, 0, -1.58226, 14.11795, 46.76473, -35.2003, -34.16017, -48.83353, 13.89241, -15.51979, -8.4424, -15.77335, -26.14997, -6.27864, -3.64439, 7.12087, 0.8908, 26.32127, 0, 0, -439.48523, -177.52177 ]
-						},
-						{
-							"time": 0.7667,
-							"vertices": [ 0.06799, -4.11631, 0, 0, -0.79113, 7.05898, 23.38236, -17.60015, -17.08008, -24.41677, 6.94621, -7.7599, -4.2212, -7.88667, -13.07498, -3.13932, -1.8222, 3.56044, 6.0198, 23.00182, 0, 0, -365.68442, -226.89883 ]
-						},
-						{ "time": 0.8, "curve": "stepped" },
-						{ "time": 1.1 },
-						{
-							"time": 1.3,
-							"offset": 6,
-							"vertices": [ 22.24737, 20.71245, -17.43828, 31.85296, 22.24737, 20.71245, -17.43828, 31.85296, 22.24737, 20.71245, -17.43828, 31.85296 ]
-						},
-						{
-							"time": 1.4333,
-							"offset": 6,
-							"vertices": [ 50.92273, 30.30164, -15.21045, 57.26978, 50.92273, 30.30164, -15.21045, 57.26978, 50.92273, 30.30164, -15.21045, 57.26978 ]
-						},
-						{ "time": 1.8 }
-					]
+					"front-leg-path": {
+						"deform": [
+							{
+								"curve": [ 0.075, 0, 0.189, 0.28 ]
+							},
+							{
+								"time": 0.3,
+								"vertices": [ 0.05087, -3.38688, 0, 0, 1.38452, 5.97834, -14.9041, 2.01206, 1.44487, -6.80281, -14.9041, 2.01206, 1.44487, -6.80281, -14.9041, 2.01206, 1.44487, -6.80281 ],
+								"curve": [ 0.323, 0.2, 0.345, 0.35 ]
+							},
+							{
+								"time": 0.3667,
+								"vertices": [ 0.07139, -4.75271, 0, 0, 1.94286, 8.38924, 4.65956, 20.90988, -6.00341, 18.98861, -0.14155, 20.92476, -9.36768, 15.5653, -12.20349, 23.97896, -19.98153, 9.06929 ],
+								"curve": [ 0.39, 0.31, 0.412, 0.53 ]
+							},
+							{
+								"time": 0.4333,
+								"vertices": [ 0.08487, -5.65058, 0, 0, 2.3099, 9.97411, 6.09287, 20.58425, -8.39331, 19.11554, -1.86437, 20.6089, -13.96917, 13.44183, -21.85559, 25.6709, -31.56034, 2.67548 ],
+								"curve": [ 0.438, 0.32, 0.451, 0.54 ]
+							},
+							{
+								"time": 0.4667,
+								"vertices": [ 0.09099, -6.05806, 0, 0, 2.47648, 10.69338, 6.80647, 9.95062, -1.39596, 12.12401, -2.58313, 9.97971, -7.97551, 5.429, -26.17287, 15.95288, -28.7332, -7.27536 ],
+								"curve": [ 0.491, 0.92, 0.521, 0.99 ]
+							},
+							{
+								"time": 0.5333,
+								"vertices": [ 0.0938, -6.24474, 0, 0, 2.55279, 11.0229, 3.37726, -9.77658, 9.35123, -4.41786, -6.66855, -9.74546, 2.31187, -11.58077, -31.90691, -3.35485, -19.89651, -25.173 ],
+								"curve": [ 0.54, 0.52, 0.553, 0.77 ]
+							},
+							{
+								"time": 0.5667,
+								"vertices": [ 0.12554, -7.9214, 0, 0, 0.6047, 13.76218, 28.2061, -4.72442, -24.72498, -10.04851, -1.08998, -15.00371, 3.89968, -14.73675, -45.72995, -9.44002, -7.51602, -33.5578, 22.59846, -13.40422, 0, 0, -21.81488, -287.65363 ],
+								"curve": [ 0.579, 1, 0.592, 1 ]
+							},
+							{
+								"time": 0.6,
+								"vertices": [ 0.12969, -8.14021, 0, 0, 0.35046, 14.11967, 49.51149, 65.25623, -80.01971, 39.68078, -0.36196, -15.68993, 4.10689, -15.14861, -62.03986, -28.71517, 2.78595, -56.47927, 41.45007, -31.91446, 0, 0, -19.75009, -6.99966 ]
+							},
+							{
+								"time": 0.6333,
+								"vertices": [ 0.16366, -9.90768, 0, 0, -1.90419, 16.9905, 99.3634, 33.16509, -81.26534, 35.35141, -0.72391, -31.37989, 8.2138, -30.29725, -84.11658, -22.14578, -6.24997, -61.22949, 46.91129, -33.41971, 0, 0, -31.98465, -262.01813 ]
+							},
+							{
+								"time": 0.6667,
+								"vertices": [ 0.18382, -11.1283, 0, 0, -2.13879, 19.08371, 85.97569, 24.69115, -94.39235, -5.64914, 3.63728, -14.95789, -10.54588, -27.66409, -78.76755, -2.82176, -20.92926, -42.81331, 26.18336, -20.74105, 0, 0, -159.67368, -300.67038 ]
+							},
+							{
+								"time": 0.7,
+								"vertices": [ 0.20398, -12.34892, 0, 0, -2.37338, 21.17692, 70.14705, -52.80042, -51.24022, -73.25025, 20.8386, -23.27967, -12.66359, -23.66, -39.22493, -9.41795, -5.46658, 10.6813, 1.18861, 10.38911, 0, 0, -400.93036, -315.42963 ]
+							},
+							{
+								"time": 0.7333,
+								"vertices": [ 0.13599, -8.23261, 0, 0, -1.58226, 14.11795, 46.76473, -35.2003, -34.16017, -48.83353, 13.89241, -15.51979, -8.4424, -15.77335, -26.14997, -6.27864, -3.64439, 7.12087, 0.8908, 26.32127, 0, 0, -439.48523, -177.52177 ]
+							},
+							{
+								"time": 0.7667,
+								"vertices": [ 0.06799, -4.11631, 0, 0, -0.79113, 7.05898, 23.38236, -17.60015, -17.08008, -24.41677, 6.94621, -7.7599, -4.2212, -7.88667, -13.07498, -3.13932, -1.8222, 3.56044, 6.0198, 23.00182, 0, 0, -365.68442, -226.89883 ]
+							},
+							{ "time": 0.8, "curve": "stepped" },
+							{ "time": 1.1 },
+							{
+								"time": 1.3,
+								"offset": 6,
+								"vertices": [ 22.24737, 20.71245, -17.43828, 31.85296, 22.24737, 20.71245, -17.43828, 31.85296, 22.24737, 20.71245, -17.43828, 31.85296 ]
+							},
+							{
+								"time": 1.4333,
+								"offset": 6,
+								"vertices": [ 50.92273, 30.30164, -15.21045, 57.26978, 50.92273, 30.30164, -15.21045, 57.26978, 50.92273, 30.30164, -15.21045, 57.26978 ]
+							},
+							{ "time": 1.8 }
+						]
+					}
 				}
 			}
 		}

BIN
examples/stretchyman/export/stretchyman-pro.skel


BIN
examples/tank/export/tank-pma.png


+ 64 - 60
examples/tank/export/tank-pro.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "3P3VgYJ8Bxk",
-	"spine": "4.0.31",
+	"hash": "ulJOWXMG9PE",
+	"spine": "4.1.23-beta",
 	"x": -5852.65,
 	"y": -348.5,
 	"width": 7202.61,
@@ -3420,7 +3420,7 @@
 		"slots": {
 			"rock": {
 				"attachment": [
-					{ "name": null }
+					{}
 				]
 			},
 			"smoke-glow": {
@@ -3432,7 +3432,7 @@
 				],
 				"attachment": [
 					{ "time": 0.0667, "name": "smoke-glow" },
-					{ "time": 0.3, "name": null }
+					{ "time": 0.3 }
 				]
 			},
 			"smoke-puff1-bg": {
@@ -4049,7 +4049,7 @@
 				],
 				"attachment": [
 					{ "time": 0.0667, "name": "smoke-glow" },
-					{ "time": 0.2667, "name": null }
+					{ "time": 0.2667 }
 				]
 			}
 		},
@@ -4870,65 +4870,69 @@
 				]
 			}
 		},
-		"deform": {
+		"attachments": {
 			"default": {
 				"clipping": {
-					"clipping": [
-						{
-							"time": 0.0667,
-							"offset": 54,
-							"vertices": [ 4.59198, -4.59192 ]
-						},
-						{
-							"time": 0.1333,
-							"offset": 8,
-							"vertices": [ -8.97369, -1.88211, 9.11177, 1.02258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.73321, -45.16878, -30.31448, -84.4631, -32.24969, -108.78421, 70.26825, -36.90201 ]
-						},
-						{
-							"time": 0.1667,
-							"offset": 8,
-							"vertices": [ -11.32373, -1.65065, 11.42179, 0.53259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.36503, -69.18713, -4.45626, -121.90839, 5.46554, -115.23274, 71.78526, -33.85687 ]
-						},
-						{
-							"time": 0.2,
-							"offset": 8,
-							"vertices": [ -8.70522, 1.02196, 8.65102, -1.4101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.59198, -4.59192 ]
-						},
-						{
-							"time": 0.2333,
-							"offset": 8,
-							"vertices": [ -5.23146, 0.85796, 5.23882, -0.81519 ]
-						},
-						{
-							"time": 0.2667,
-							"offset": 54,
-							"vertices": [ 4.59198, -4.59192 ]
-						}
-					]
+					"clipping": {
+						"deform": [
+							{
+								"time": 0.0667,
+								"offset": 54,
+								"vertices": [ 4.59198, -4.59192 ]
+							},
+							{
+								"time": 0.1333,
+								"offset": 8,
+								"vertices": [ -8.97369, -1.88211, 9.11177, 1.02258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.73321, -45.16878, -30.31448, -84.4631, -32.24969, -108.78421, 70.26825, -36.90201 ]
+							},
+							{
+								"time": 0.1667,
+								"offset": 8,
+								"vertices": [ -11.32373, -1.65065, 11.42179, 0.53259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.36503, -69.18713, -4.45626, -121.90839, 5.46554, -115.23274, 71.78526, -33.85687 ]
+							},
+							{
+								"time": 0.2,
+								"offset": 8,
+								"vertices": [ -8.70522, 1.02196, 8.65102, -1.4101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.59198, -4.59192 ]
+							},
+							{
+								"time": 0.2333,
+								"offset": 8,
+								"vertices": [ -5.23146, 0.85796, 5.23882, -0.81519 ]
+							},
+							{
+								"time": 0.2667,
+								"offset": 54,
+								"vertices": [ 4.59198, -4.59192 ]
+							}
+						]
+					}
 				},
 				"smoke-glow": {
-					"smoke-glow": [
-						{
-							"time": 0.1333,
-							"vertices": [ -14.17073, 19.14352, 0, 0, -10.97961, -15.09065, -5.79558, -24.82121, 0.68117, -17.78759, -1.1179, -5.4463, 0, 0, 0, 0, 17.52957, 6.89397, -0.33841, -2.21582, 5.51004, 18.88118, -6.80153, 20.91101 ]
-						},
-						{
-							"time": 0.1667,
-							"vertices": [ -4.34264, 39.78125, 5.6649, -2.42686, -8.39346, -22.52338, -2.66431, 5.08595, -19.28093, 3.98568, -11.21397, 10.2879, 4.56749, 4.1329, -19.50706, -2.28786, 11.35747, 4.55941, 9.04341, -11.72194, 2.15381, 5.14344, -12.82158, 16.08209, -23.19814, 1.81836 ]
-						},
-						{
-							"time": 0.2,
-							"vertices": [ -3.95581, 36.12203, 37.20779, -0.87419, 21.29579, -15.76854, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 7.70584, -0.7169, -6.69733, -2.62048, 17.91826, 7.77333, -12.2858, 3.25454, -12.75876, 3.71516, 9.67891, 15.48546 ]
-						},
-						{
-							"time": 0.2333,
-							"vertices": [ -11.9371, 26.01078, 2.91821, -0.27533, 7.69899, -17.45375, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 7.70584, -0.7169, -6.69733, -2.62048, 17.91826, 7.77333, -4.30551, -6.01406, -12.75876, 3.71516, -5.10017, 17.59191 ]
-						},
-						{
-							"time": 0.2667,
-							"vertices": [ 0.5959, 23.58176, 20.74303, 0.93943, 7.69899, -17.45375, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 20.51733, 2.52203, 13.35544, 2.64274, 24.32408, -1.94308, 8.50604, -20.99353, 13.14276, 5.73959, 6.31876, 19.2114, 16.98909, 0.80981 ]
-						}
-					]
+					"smoke-glow": {
+						"deform": [
+							{
+								"time": 0.1333,
+								"vertices": [ -14.17073, 19.14352, 0, 0, -10.97961, -15.09065, -5.79558, -24.82121, 0.68117, -17.78759, -1.1179, -5.4463, 0, 0, 0, 0, 17.52957, 6.89397, -0.33841, -2.21582, 5.51004, 18.88118, -6.80153, 20.91101 ]
+							},
+							{
+								"time": 0.1667,
+								"vertices": [ -4.34264, 39.78125, 5.6649, -2.42686, -8.39346, -22.52338, -2.66431, 5.08595, -19.28093, 3.98568, -11.21397, 10.2879, 4.56749, 4.1329, -19.50706, -2.28786, 11.35747, 4.55941, 9.04341, -11.72194, 2.15381, 5.14344, -12.82158, 16.08209, -23.19814, 1.81836 ]
+							},
+							{
+								"time": 0.2,
+								"vertices": [ -3.95581, 36.12203, 37.20779, -0.87419, 21.29579, -15.76854, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 7.70584, -0.7169, -6.69733, -2.62048, 17.91826, 7.77333, -12.2858, 3.25454, -12.75876, 3.71516, 9.67891, 15.48546 ]
+							},
+							{
+								"time": 0.2333,
+								"vertices": [ -11.9371, 26.01078, 2.91821, -0.27533, 7.69899, -17.45375, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 7.70584, -0.7169, -6.69733, -2.62048, 17.91826, 7.77333, -4.30551, -6.01406, -12.75876, 3.71516, -5.10017, 17.59191 ]
+							},
+							{
+								"time": 0.2667,
+								"vertices": [ 0.5959, 23.58176, 20.74303, 0.93943, 7.69899, -17.45375, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 20.51733, 2.52203, 13.35544, 2.64274, 24.32408, -1.94308, 8.50604, -20.99353, 13.14276, 5.73959, 6.31876, 19.2114, 16.98909, 0.80981 ]
+							}
+						]
+					}
 				}
 			}
 		},

BIN
examples/tank/export/tank-pro.skel


BIN
examples/tank/export/tank.png


+ 2 - 2
examples/vine/export/vine-pro.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "mROo4Xkf3Fs",
-	"spine": "4.0.31",
+	"hash": "J/Kz2d3OlD0",
+	"spine": "4.1.23-beta",
 	"x": -87.7,
 	"y": -1.71,
 	"width": 227.65,

BIN
examples/vine/export/vine-pro.skel


+ 2 - 2
examples/windmill/export/windmill-ess.json

@@ -1,7 +1,7 @@
 {
 "skeleton": {
-	"hash": "tBKgYacI7e4",
-	"spine": "4.0.31",
+	"hash": "tB4/IVbSSaY",
+	"spine": "4.1.23-beta",
 	"x": -564.6,
 	"y": -335.4,
 	"width": 1124.2,

BIN
examples/windmill/export/windmill-ess.skel


BIN
examples/windmill/export/windmill-pma.png


BIN
examples/windmill/export/windmill.png


+ 1 - 1
formatters/README.md

@@ -4,7 +4,7 @@ This folder contains formatter configuration files to be used with IDEs as well
 You will need the following on your `PATH`:
 
 - JDK 10+
-- clang-format 12 (i.e. `brew install clang-format`). Also set the environment variable `CLANGFORMAT` to the path of the `clang-format` executable.
+- clang-format 12.0.1 (i.e. `brew install clang-format`). Also set the environment variable `CLANGFORMAT` to the path of the `clang-format` executable.
 - dotnet format (i.e. `dotnet tool install -g dotnet-format`, comes with dotnet 6 out of the box)
 - tsfmt, (i.e. `npm install -g typescript-formatter`)
 

+ 4 - 6
formatters/build.gradle

@@ -25,15 +25,13 @@ spotless {
                'spine-sfml/**/*.cpp',
                'spine-sfml/**/*.h',
                'spine-ue4/**/*.cpp',
-               'spine-ue4/**/*.h',
-               'spine-godot/spine_godot/**.h',
-               'spine-godot/spine_godot/**.cpp'
-        clangFormat("12.0.1").pathToExe("$System.env.CLANGFORMAT").style('file')
+               'spine-ue4/**/*.h'
+        clangFormat("13.0.1").pathToExe("$System.env.CLANGFORMAT").style('file')
     }
 
     typescript {
-        target 'spine-ts/**/*.ts'
-        targetExclude 'spine-ts/**/*.d.ts'
+        target 'spine-ts/**/src/*.ts'
+        targetExclude 'spine-ts/**/*.d.ts', 'spine-ts/**/node_modules/**/*.ts'
         tsfmt('7.2.2').tsfmtFile('formatters/tsfmt.json')
     }
 }

+ 7 - 8
formatters/format.sh

@@ -8,8 +8,7 @@ setup() {
 	cp $dir/.clang-format $dir/..
 	cp $dir/build.gradle $dir/..
 	cp $dir/settings.gradle $dir/..	
-	cp $dir/.editorconfig $dir/../spine-csharp
-	cp $dir/.editorconfig $dir/../spine-xna
+	cp $dir/.editorconfig $dir/../spine-csharp	
 	cp $dir/.editorconfig $dir/../spine-monogame
 	cp $dir/.editorconfig $dir/../spine-unity
 }
@@ -18,8 +17,7 @@ cleanup() {
 	rm $dir/../.clang-format
 	rm $dir/../build.gradle
 	rm $dir/../settings.gradle
-	rm $dir/../spine-csharp/.editorconfig	
-	rm $dir/../spine-xna/.editorconfig
+	rm $dir/../spine-csharp/.editorconfig		
 	rm $dir/../spine-monogame/.editorconfig
 	rm $dir/../spine-unity/.editorconfig
 }
@@ -30,10 +28,11 @@ setup
 # Execute spotless and dotnet-format
 pushd $dir/..
 ./formatters/gradlew spotlessApply
-dotnet-format spine-csharp/spine-csharp.sln
-dotnet-format -f spine-xna
-dotnet-format -f spine-monogame
-dotnet-format -f spine-unity
+if [ "$1" != "skipdotnet" ] ; then
+	dotnet-format spine-csharp/spine-csharp.sln
+	dotnet-format -f spine-monogame
+	dotnet-format -f spine-unity
+fi
 popd
 
 # Delete Gradle, dotnet-format, and clang-format config files in root

+ 3 - 1
formatters/settings.gradle

@@ -1 +1,3 @@
-include ':spine-libgdx'
+include ':spine-libgdx:spine-libgdx'
+include ':spine-libgdx:spine-libgdx-tests'
+include ':spine-libgdx:spine-skeletonviewer'

+ 1 - 1
spine-c/README.md

@@ -14,7 +14,7 @@ For the official legal terms governing the Spine Runtimes, please read the [Spin
 
 ## Spine version
 
-spine-c works with data exported from Spine 4.0.xx.
+spine-c works with data exported from Spine 4.1.xx.
 
 spine-c supports all Spine features.
 

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

@@ -34,6 +34,7 @@
 #include <spine/Event.h>
 #include <spine/Attachment.h>
 #include <spine/VertexAttachment.h>
+#include <spine/Sequence.h>
 #include <spine/Array.h>
 #include <stdint.h>
 
@@ -99,6 +100,7 @@ typedef enum {
 	SP_TIMELINE_SHEAR,
 	SP_TIMELINE_TRANSLATE,
 	SP_TIMELINE_DEFORM,
+	SP_TIMELINE_SEQUENCE,
 	SP_TIMELINE_IKCONSTRAINT,
 	SP_TIMELINE_PATHCONSTRAINTMIX,
 	SP_TIMELINE_RGB2,
@@ -131,7 +133,8 @@ typedef enum {
 	SP_PROPERTY_TRANSFORMCONSTRAINT = 1 << 15,
 	SP_PROPERTY_PATHCONSTRAINT_POSITION = 1 << 16,
 	SP_PROPERTY_PATHCONSTRAINT_SPACING = 1 << 17,
-	SP_PROPERTY_PATHCONSTRAINT_MIX = 1 << 18
+	SP_PROPERTY_PATHCONSTRAINT_MIX = 1 << 18,
+	SP_PROPERTY_SEQUENCE = 1 << 19
 } spProperty;
 
 #define SP_MAX_PROPERTY_IDS 3
@@ -399,6 +402,20 @@ SP_API void spDeformTimeline_setFrame(spDeformTimeline *self, int frameIndex, fl
 
 /**/
 
+typedef struct spSequenceTimeline {
+	spTimeline super;
+	int slotIndex;
+	spAttachment *attachment;
+} spSequenceTimeline;
+
+SP_API spSequenceTimeline *spSequenceTimeline_create(int framesCount, int slotIndex, spAttachment *attachment);
+
+SP_API void spSequenceTimeline_setFrame(spSequenceTimeline *self, int frameIndex, float time, int mode, int index, float delay);
+
+/**/
+
+/**/
+
 typedef struct spEventTimeline {
 	spTimeline super;
 	spEvent **const events;

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