浏览代码

Merge branch '4.1-beta' into spine-godot

# Conflicts:
#	.gitignore
#	formatters/build.gradle
Mario Zechner 3 年之前
父节点
当前提交
d9e1d05e1b
共有 100 个文件被更改,包括 1840 次插入1617 次删除
  1. 19 12
      .gitignore
  2. 154 2
      CHANGELOG.md
  3. 11 17
      CMakeLists.txt
  4. 10 10
      examples/alien/export/alien-ess.json
  5. 二进制
      examples/alien/export/alien-ess.skel
  6. 二进制
      examples/alien/export/alien-pma.png
  7. 69 67
      examples/alien/export/alien-pro.json
  8. 二进制
      examples/alien/export/alien-pro.skel
  9. 二进制
      examples/alien/export/alien.png
  10. 2 2
      examples/coin/export/coin-pro.json
  11. 二进制
      examples/coin/export/coin-pro.skel
  12. 二进制
      examples/dragon/dragon-ess.spine
  13. 49 69
      examples/dragon/export/dragon-ess.json
  14. 二进制
      examples/dragon/export/dragon-ess.skel
  15. 77 60
      examples/dragon/export/dragon-pma.atlas
  16. 二进制
      examples/dragon/export/dragon-pma.png
  17. 二进制
      examples/dragon/export/dragon-pma_2.png
  18. 二进制
      examples/dragon/export/dragon-pma_3.png
  19. 二进制
      examples/dragon/export/dragon-pma_4.png
  20. 二进制
      examples/dragon/export/dragon-pma_5.png
  21. 二进制
      examples/dragon/export/dragon-pma_6.png
  22. 73 60
      examples/dragon/export/dragon.atlas
  23. 二进制
      examples/dragon/export/dragon.png
  24. 二进制
      examples/dragon/export/dragon_2.png
  25. 二进制
      examples/dragon/export/dragon_3.png
  26. 二进制
      examples/dragon/export/dragon_4.png
  27. 二进制
      examples/dragon/export/dragon_5.png
  28. 二进制
      examples/dragon/export/dragon_6.png
  29. 二进制
      examples/dragon/images/left-wing01.png
  30. 二进制
      examples/dragon/images/left-wing02.png
  31. 二进制
      examples/dragon/images/left-wing03.png
  32. 二进制
      examples/dragon/images/left-wing04.png
  33. 二进制
      examples/dragon/images/left-wing05.png
  34. 二进制
      examples/dragon/images/left-wing06.png
  35. 二进制
      examples/dragon/images/left-wing07.png
  36. 二进制
      examples/dragon/images/left-wing08.png
  37. 二进制
      examples/dragon/images/left-wing09.png
  38. 二进制
      examples/dragon/images/right-wing01.png
  39. 二进制
      examples/dragon/images/right-wing02.png
  40. 二进制
      examples/dragon/images/right-wing03.png
  41. 二进制
      examples/dragon/images/right-wing04.png
  42. 二进制
      examples/dragon/images/right-wing05.png
  43. 二进制
      examples/dragon/images/right-wing06.png
  44. 二进制
      examples/dragon/images/right-wing07.png
  45. 二进制
      examples/dragon/images/right-wing08.png
  46. 二进制
      examples/dragon/images/right-wing09.png
  47. 43 139
      examples/export/runtimes.sh
  48. 3 3
      examples/goblins/export/goblins-ess.json
  49. 二进制
      examples/goblins/export/goblins-ess.skel
  50. 304 282
      examples/goblins/export/goblins-pro.json
  51. 二进制
      examples/goblins/export/goblins-pro.skel
  52. 2 2
      examples/hero/export/hero-ess.json
  53. 二进制
      examples/hero/export/hero-ess.skel
  54. 549 499
      examples/hero/export/hero-pro.json
  55. 二进制
      examples/hero/export/hero-pro.skel
  56. 二进制
      examples/mix-and-match/export/mix-and-match-pma.png
  57. 83 32
      examples/mix-and-match/export/mix-and-match-pro.json
  58. 二进制
      examples/mix-and-match/export/mix-and-match-pro.skel
  59. 二进制
      examples/mix-and-match/export/mix-and-match.png
  60. 二进制
      examples/owl/export/owl-pma.png
  61. 8 11
      examples/owl/export/owl-pro.json
  62. 二进制
      examples/owl/export/owl-pro.skel
  63. 二进制
      examples/owl/export/owl.png
  64. 2 2
      examples/powerup/export/powerup-ess.json
  65. 二进制
      examples/powerup/export/powerup-ess.skel
  66. 51 49
      examples/powerup/export/powerup-pro.json
  67. 二进制
      examples/powerup/export/powerup-pro.skel
  68. 二进制
      examples/raptor/export/raptor-pma.png
  69. 4 4
      examples/raptor/export/raptor-pro.json
  70. 二进制
      examples/raptor/export/raptor-pro.skel
  71. 二进制
      examples/raptor/export/raptor.png
  72. 二进制
      examples/raptor/raptor-pro.spine
  73. 2 2
      examples/speedy/export/speedy-ess.json
  74. 二进制
      examples/speedy/export/speedy-ess.skel
  75. 3 3
      examples/spineboy/export/spineboy-ess.json
  76. 二进制
      examples/spineboy/export/spineboy-ess.skel
  77. 二进制
      examples/spineboy/export/spineboy-pma.png
  78. 78 70
      examples/spineboy/export/spineboy-pro.json
  79. 二进制
      examples/spineboy/export/spineboy-pro.skel
  80. 二进制
      examples/spineboy/export/spineboy.png
  81. 2 2
      examples/spinosaurus/export/spinosaurus-ess.json
  82. 二进制
      examples/spinosaurus/export/spinosaurus-ess.skel
  83. 140 136
      examples/stretchyman/export/stretchyman-pro.json
  84. 二进制
      examples/stretchyman/export/stretchyman-pro.skel
  85. 二进制
      examples/tank/export/tank-pma.png
  86. 64 60
      examples/tank/export/tank-pro.json
  87. 二进制
      examples/tank/export/tank-pro.skel
  88. 二进制
      examples/tank/export/tank.png
  89. 2 2
      examples/vine/export/vine-pro.json
  90. 二进制
      examples/vine/export/vine-pro.skel
  91. 2 2
      examples/windmill/export/windmill-ess.json
  92. 二进制
      examples/windmill/export/windmill-ess.skel
  93. 二进制
      examples/windmill/export/windmill-pma.png
  94. 二进制
      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 }
+					{}
 				]
 			}
 		},

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


二进制
examples/alien/export/alien-pma.png


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


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


二进制
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,

二进制
examples/coin/export/coin-pro.skel


二进制
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 }
+						]
+					}
+				}
+			}
 		}
 	}
 }

二进制
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

二进制
examples/dragon/export/dragon-pma.png


二进制
examples/dragon/export/dragon-pma_2.png


二进制
examples/dragon/export/dragon-pma_3.png


二进制
examples/dragon/export/dragon-pma_4.png


二进制
examples/dragon/export/dragon-pma_5.png


二进制
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

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


二进制
examples/dragon/export/dragon_2.png


二进制
examples/dragon/export/dragon_3.png


二进制
examples/dragon/export/dragon_4.png


二进制
examples/dragon/export/dragon_5.png


二进制
examples/dragon/export/dragon_6.png


二进制
examples/dragon/images/left-wing01.png


二进制
examples/dragon/images/left-wing02.png


二进制
examples/dragon/images/left-wing03.png


二进制
examples/dragon/images/left-wing04.png


二进制
examples/dragon/images/left-wing05.png


二进制
examples/dragon/images/left-wing06.png


二进制
examples/dragon/images/left-wing07.png


二进制
examples/dragon/images/left-wing08.png


二进制
examples/dragon/images/left-wing09.png


二进制
examples/dragon/images/right-wing01.png


二进制
examples/dragon/images/right-wing02.png


二进制
examples/dragon/images/right-wing03.png


二进制
examples/dragon/images/right-wing04.png


二进制
examples/dragon/images/right-wing05.png


二进制
examples/dragon/images/right-wing06.png


二进制
examples/dragon/images/right-wing07.png


二进制
examples/dragon/images/right-wing08.png


二进制
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 }
 				]
 			}
 		},

二进制
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 ]
+							}
+						]
+					}
 				}
 			}
 		}

二进制
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,

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


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


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


二进制
examples/mix-and-match/export/mix-and-match-pma.png


文件差异内容过多而无法显示
+ 83 - 32
examples/mix-and-match/export/mix-and-match-pro.json


二进制
examples/mix-and-match/export/mix-and-match-pro.skel


二进制
examples/mix-and-match/export/mix-and-match.png


二进制
examples/owl/export/owl-pma.png


文件差异内容过多而无法显示
+ 8 - 11
examples/owl/export/owl-pro.json


二进制
examples/owl/export/owl-pro.skel


二进制
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,

二进制
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 ]
+							}
+						]
+					}
 				}
 			}
 		}

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


二进制
examples/raptor/export/raptor-pma.png


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


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


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


二进制
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,

二进制
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 }
 				]
 			}
 		},

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


二进制
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 }
 				]
 			}
 		},

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


二进制
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,

二进制
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 }
+						]
+					}
 				}
 			}
 		}

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


二进制
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 ]
+							}
+						]
+					}
 				}
 			}
 		},

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


二进制
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,

二进制
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,

二进制
examples/windmill/export/windmill-ess.skel


二进制
examples/windmill/export/windmill-pma.png


二进制
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;

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