Browse Source

Merge remote-tracking branch 'EsotericSoftware/3.6' into 3.6

Stephen Gowen 7 years ago
parent
commit
2228c98508
63 changed files with 2723 additions and 662 deletions
  1. 20 19
      CHANGELOG.md
  2. BIN
      spine-as3/spine-as3-example/lib/spine-as3.swc
  3. 1 0
      spine-as3/spine-as3/src/spine/Skeleton.as
  4. 1 1
      spine-libgdx/spine-libgdx/pom.xml
  5. BIN
      spine-starling/spine-starling-example/lib/spine-as3.swc
  6. BIN
      spine-starling/spine-starling/lib/spine-as3.swc
  7. 4 4
      spine-ts/README.md
  8. 12 5
      spine-ts/build/spine-all.d.ts
  9. 113 33
      spine-ts/build/spine-all.js
  10. 0 0
      spine-ts/build/spine-all.js.map
  11. 5 5
      spine-ts/build/spine-canvas.js
  12. 0 0
      spine-ts/build/spine-canvas.js.map
  13. 5 5
      spine-ts/build/spine-core.js
  14. 0 0
      spine-ts/build/spine-core.js.map
  15. 12 5
      spine-ts/build/spine-threejs.d.ts
  16. 113 33
      spine-ts/build/spine-threejs.js
  17. 0 0
      spine-ts/build/spine-threejs.js.map
  18. 5 5
      spine-ts/build/spine-webgl.js
  19. 0 0
      spine-ts/build/spine-webgl.js.map
  20. 5 5
      spine-ts/build/spine-widget.js
  21. 0 0
      spine-ts/build/spine-widget.js.map
  22. 5 5
      spine-ts/core/src/AssetManager.ts
  23. 20 28
      spine-ts/threejs/example/index.html
  24. 19 8
      spine-ts/threejs/src/MeshBatcher.ts
  25. 110 27
      spine-ts/threejs/src/SkeletonMesh.ts
  26. 130 2
      spine-unity/Assets/Examples/Getting Started/2 Controlling Animation.unity
  27. 137 66
      spine-unity/Assets/Examples/Getting Started/3 Controlling Animation Continued.unity
  28. 358 51
      spine-unity/Assets/Examples/Getting Started/5 Basic Platformer.unity
  29. 4 4
      spine-unity/Assets/Examples/Other Examples/Instantiate from Script.unity
  30. 716 0
      spine-unity/Assets/Examples/Other Examples/Per Instance Material Properties.unity
  31. 2 2
      spine-unity/Assets/Examples/Other Examples/Per Instance Material Properties.unity.meta
  32. 254 0
      spine-unity/Assets/Examples/Other Examples/SkeletonAnimationMulti.unity
  33. 8 0
      spine-unity/Assets/Examples/Other Examples/SkeletonAnimationMulti.unity.meta
  34. 120 1
      spine-unity/Assets/Examples/Other Examples/SpineGauge.unity
  35. 0 13
      spine-unity/Assets/Examples/Scripts/Getting Started Scripts/Raptor.cs
  36. 80 0
      spine-unity/Assets/Examples/Scripts/HandleEventWithAudioExample.cs
  37. 12 0
      spine-unity/Assets/Examples/Scripts/HandleEventWithAudioExample.cs.meta
  38. 33 0
      spine-unity/Assets/Examples/Scripts/MaterialPropertyBlockExample.cs
  39. 12 0
      spine-unity/Assets/Examples/Scripts/MaterialPropertyBlockExample.cs.meta
  40. 9 0
      spine-unity/Assets/Examples/Scripts/Sample Components/SkeletonAnimationMulti.meta
  41. 132 0
      spine-unity/Assets/Examples/Scripts/Sample Components/SkeletonAnimationMulti/SkeletonAnimationMulti.cs
  42. 12 0
      spine-unity/Assets/Examples/Scripts/Sample Components/SkeletonAnimationMulti/SkeletonAnimationMulti.cs.meta
  43. 1 1
      spine-unity/Assets/Examples/Scripts/Sample Components/SlotTintBlackFollower.cs
  44. 25 1
      spine-unity/Assets/Examples/Spine/Dragon/dragon.png.meta
  45. 25 1
      spine-unity/Assets/Examples/Spine/Dragon/dragon2.png.meta
  46. 4 1
      spine-unity/Assets/Examples/Spine/Goblins/goblins_Material.mat
  47. 76 62
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.atlas.txt
  48. 2 2
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.atlas.txt.meta
  49. 43 21
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.json
  50. 2 2
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.json.meta
  51. BIN
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.png
  52. 2 2
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.png.meta
  53. 3 3
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_Atlas.asset
  54. 2 2
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_Atlas.asset.meta
  55. 3 2
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_Material.mat
  56. 2 2
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_Material.mat.meta
  57. 3 3
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_SkeletonData.asset
  58. 2 2
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_SkeletonData.asset.meta
  59. BIN
      spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy.png
  60. 0 195
      spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy-unity.atlas
  61. 56 32
      spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy.png.meta
  62. 2 0
      spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy_Material Fill.mat
  63. 1 1
      spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy_Material.mat

+ 20 - 19
CHANGELOG.md

@@ -11,7 +11,7 @@
  * **Additions**
  * **Additions**
   * Added `Skeleton.getBounds` from reference implementation.
   * Added `Skeleton.getBounds` from reference implementation.
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
-  * Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).    
+  * Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).
   * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.
   * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.
   * Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.
   * Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
@@ -38,10 +38,10 @@
   * Removed `spVertexIndex`from public API.
   * Removed `spVertexIndex`from public API.
   * Listeners on `spAnimationState` or `spTrackEntry` will now be also called in case a track entry is disposed as part of dispoing the `spAnimationState`.
   * Listeners on `spAnimationState` or `spTrackEntry` will now be also called in case a track entry is disposed as part of dispoing the `spAnimationState`.
  * **Additions**
  * **Additions**
-  * Added support for local and relative transform constraint calculation, including additional fields in `spTransformConstraintData`.  
+  * Added support for local and relative transform constraint calculation, including additional fields in `spTransformConstraintData`.
   * Added `spPointAttachment`, additional method `spAtlasAttachmentLoadeR_newPointAttachment`.
   * Added `spPointAttachment`, additional method `spAtlasAttachmentLoadeR_newPointAttachment`.
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
-  * Added `spBone_localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).  	
+  * Added `spBone_localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).
    * Added two color tinting support, including `spTwoColorTimeline` and additional fields on `spSlot` and `spSlotData`.
    * Added two color tinting support, including `spTwoColorTimeline` and additional fields on `spSlot` and `spSlotData`.
   * Added `userData` field to `spTrackEntry`, so users can expose data in `spAnimationState` callbacks.
   * Added `userData` field to `spTrackEntry`, so users can expose data in `spAnimationState` callbacks.
   * Modified kvec.h used by SkeletonBinary.c to use Spine's MALLOC/FREE macros. That way there's only one place to inject custom allocators ([extension.h](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-c/spine-c/include/spine/extension.h)) [commit](https://github.com/EsotericSoftware/spine-runtimes/commit/c2cfbc6cb8709daa082726222d558188d75a004f)
   * Modified kvec.h used by SkeletonBinary.c to use Spine's MALLOC/FREE macros. That way there's only one place to inject custom allocators ([extension.h](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-c/spine-c/include/spine/extension.h)) [commit](https://github.com/EsotericSoftware/spine-runtimes/commit/c2cfbc6cb8709daa082726222d558188d75a004f)
@@ -95,10 +95,10 @@
   * Added `stride` parameter to `VertexAttachment.ComputeWorldVertices`.
   * Added `stride` parameter to `VertexAttachment.ComputeWorldVertices`.
   * Removed `RegionAttachment.Vertices` field. The vertices array is provided to `RegionAttachment.ComputeWorldVertices` by the API user now.
   * Removed `RegionAttachment.Vertices` field. The vertices array is provided to `RegionAttachment.ComputeWorldVertices` by the API user now.
   * Removed `RegionAttachment.UpdateWorldVertices`, added `RegionAttachment.ComputeWorldVertices`. The new method now computes the x/y positions of the 4 vertices of the corner and places them in the provided `worldVertices` array, starting at `offset`, then moving by `stride` array elements when advancing to the next vertex. This allows to directly compose the vertex buffer and avoids a copy. The computation of the full vertices, including vertex colors and texture coordinates, is now done by the backend's respective renderer.
   * Removed `RegionAttachment.UpdateWorldVertices`, added `RegionAttachment.ComputeWorldVertices`. The new method now computes the x/y positions of the 4 vertices of the corner and places them in the provided `worldVertices` array, starting at `offset`, then moving by `stride` array elements when advancing to the next vertex. This allows to directly compose the vertex buffer and avoids a copy. The computation of the full vertices, including vertex colors and texture coordinates, is now done by the backend's respective renderer.
- * **Additions**  
+ * **Additions**
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
-  * Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).  
-  * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.  
+  * Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).
+  * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.
   * Added `PointAttachment`, additional method `NewPointAttachment` in `AttachmentLoader` interface.
   * Added `PointAttachment`, additional method `NewPointAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `NewClippingAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `NewClippingAttachment` in `AttachmentLoader` interface.
   * Added `SkeletonClipper` and `Triangulator`, used to implement software clipping of attachments.
   * Added `SkeletonClipper` and `Triangulator`, used to implement software clipping of attachments.
@@ -110,10 +110,10 @@
    * **Two color tinting** is currently supported via extra UV2 and UV3 mesh vertex streams. To use Two color tinting, you need to:
    * **Two color tinting** is currently supported via extra UV2 and UV3 mesh vertex streams. To use Two color tinting, you need to:
      * switch on "Tint Black" under "Advanced...",
      * switch on "Tint Black" under "Advanced...",
      * use the new `Spine/Skeleton Tint Black` shader, or your own shader that treats the UV2 and UV3 streams similarly.
      * use the new `Spine/Skeleton Tint Black` shader, or your own shader that treats the UV2 and UV3 streams similarly.
-     * Additionally, for SkeletonGraphic, you can use `Spine/SkeletonGraphic Tint Black` (or the bundled SkeletonGraphicTintBlack material) or your own shader that uses UV2 and UV3 streams similarly. **Additional Shader Channels** TexCoord1 and TexCoord2 will need to be enabled from the Canvas component's inspector. These correspond to UV2 and UV3. 
+     * Additionally, for SkeletonGraphic, you can use `Spine/SkeletonGraphic Tint Black` (or the bundled SkeletonGraphicTintBlack material) or your own shader that uses UV2 and UV3 streams similarly. **Additional Shader Channels** TexCoord1 and TexCoord2 will need to be enabled from the Canvas component's inspector. These correspond to UV2 and UV3.
    * **Clipping** is now supported. Caution: The SkeletonAnimation switches to slightly slower mesh generation code when clipping so limit your use of `ClippingAttachment`s when using on large numbers of skeletons.
    * **Clipping** is now supported. Caution: The SkeletonAnimation switches to slightly slower mesh generation code when clipping so limit your use of `ClippingAttachment`s when using on large numbers of skeletons.
- * **SkeletonRenderer.initialFlip** Spine components such as SkeletonRenderer, SkeletonAnimation, SkeletonAnimator now has `initialFlipX` and `initialFlipY` fields which are also visible in the inspector under "Advanced...". It will allow you to set and preview a starting flip value for your skeleton component. This is applied immediately when the internal skeleton object is instantiated. 
- * **[SpineAttribute] Improvements** 
+ * **SkeletonRenderer.initialFlip** Spine components such as SkeletonRenderer, SkeletonAnimation, SkeletonAnimator now has `initialFlipX` and `initialFlipY` fields which are also visible in the inspector under "Advanced...". It will allow you to set and preview a starting flip value for your skeleton component. This is applied immediately when the internal skeleton object is instantiated.
+ * **[SpineAttribute] Improvements**
    * **Icons have been added to SpineAttributeDrawers**. This should make your default inspectors easier to understand at a glance.
    * **Icons have been added to SpineAttributeDrawers**. This should make your default inspectors easier to understand at a glance.
    * **Added Constraint Attributes** You can now use `[SpineIkConstraint]` `[SpineTransformConstraint]` `[SpinePathConstraint]`
    * **Added Constraint Attributes** You can now use `[SpineIkConstraint]` `[SpineTransformConstraint]` `[SpinePathConstraint]`
    * **SpineAttribute dataField** parameter can also now detect sibling fields within arrays and serializable structs/classes.
    * **SpineAttribute dataField** parameter can also now detect sibling fields within arrays and serializable structs/classes.
@@ -127,12 +127,12 @@
  * **SkeletonRenderer.OnPostProcessVertices** is a new callback that gives you a reference to the MeshGenerator after it has generated a mesh from the current skeleton pose. You can access `meshGenerator.VertexBuffer` or `meshGenerator.ColorBuffer` to modify these before they get pushed into the UnityEngine.Mesh for rendering. This can be useful for non-shader vertex effects.
  * **SkeletonRenderer.OnPostProcessVertices** is a new callback that gives you a reference to the MeshGenerator after it has generated a mesh from the current skeleton pose. You can access `meshGenerator.VertexBuffer` or `meshGenerator.ColorBuffer` to modify these before they get pushed into the UnityEngine.Mesh for rendering. This can be useful for non-shader vertex effects.
  * **Examples**
  * **Examples**
    * **Examples now use properties**. The code in the example scripts have been switched over to using properties instead of fields to encourage their use for consistency. This is in anticipation of both users who want to move the Spine folders to the Unity Plugins folder (compiled as a different assembly), and of Unity 2017's ability to manually define different assemblies for shorter compilation times.
    * **Examples now use properties**. The code in the example scripts have been switched over to using properties instead of fields to encourage their use for consistency. This is in anticipation of both users who want to move the Spine folders to the Unity Plugins folder (compiled as a different assembly), and of Unity 2017's ability to manually define different assemblies for shorter compilation times.
-   * **Mix And Match**. The mix-and-match example scene, code and data have been updated to reflect the current recommended setup for animation-compatible custom equip systems The underlying API has changed since 3.5 and the new API calls in MixAndMatch.cs is recommended. Documentation is in progress.  
+   * **Mix And Match**. The mix-and-match example scene, code and data have been updated to reflect the current recommended setup for animation-compatible custom equip systems The underlying API has changed since 3.5 and the new API calls in MixAndMatch.cs is recommended. Documentation is in progress.
    * **Sample Components**. `AtasRegionAttacher` and `SpriteAttacher` are now part of `Sample Components`, to reflect that they are meant to be used as sample code rather than production. A few other sample components have also been added. New imports of the unitypackage Examples folder will see a "Legacy" folder comprised of old sample components that no longer contain the most up-to-date and recommended workflows, but are kept in case old setups used them for production.
    * **Sample Components**. `AtasRegionAttacher` and `SpriteAttacher` are now part of `Sample Components`, to reflect that they are meant to be used as sample code rather than production. A few other sample components have also been added. New imports of the unitypackage Examples folder will see a "Legacy" folder comprised of old sample components that no longer contain the most up-to-date and recommended workflows, but are kept in case old setups used them for production.
  * **Spine folder**. In the unitypackage, the "spine-csharp" and "spine-unity" folders are now inside a "Spine" folder. This change will only affect fresh imports. Importing the unitypackage to update Spine-Unity in your existing project will update the appropriate files however you chose to arrange them, as long as the meta files are intact.
  * **Spine folder**. In the unitypackage, the "spine-csharp" and "spine-unity" folders are now inside a "Spine" folder. This change will only affect fresh imports. Importing the unitypackage to update Spine-Unity in your existing project will update the appropriate files however you chose to arrange them, as long as the meta files are intact.
  * **Breaking changes**
  * **Breaking changes**
    * The Sprite shaders module was updated to the latest version from the [source](https://github.com/traggett/UnitySpriteShaders/commits/master). Some changes were made to the underlying keyword structure. You may need to review the settings of your lit materials. Particularly, your Fixed Normals settings.
    * The Sprite shaders module was updated to the latest version from the [source](https://github.com/traggett/UnitySpriteShaders/commits/master). Some changes were made to the underlying keyword structure. You may need to review the settings of your lit materials. Particularly, your Fixed Normals settings.
-   * The `Spine/Skeleton Lit` shader was switched over to non-fixed-function code. It now no longer requires mesh normals and has fixed normals at the shader level. 
+   * The `Spine/Skeleton Lit` shader was switched over to non-fixed-function code. It now no longer requires mesh normals and has fixed normals at the shader level.
    * The old MeshGenerator classes, interfaces and code in `Spine.Unity.MeshGeneration` are now deprecated. All mesh-generating components now share the class `Spine.Unity.MeshGenerator` defined in `SpineMesh.cs`. MeshGenerator is a serializable class.
    * The old MeshGenerator classes, interfaces and code in `Spine.Unity.MeshGeneration` are now deprecated. All mesh-generating components now share the class `Spine.Unity.MeshGenerator` defined in `SpineMesh.cs`. MeshGenerator is a serializable class.
      * The `SkeletonRenderer.renderMeshes` optimization is currently non-functional.
      * The `SkeletonRenderer.renderMeshes` optimization is currently non-functional.
      * Old triangle-winding code has been removed from `SkeletonRenderer`. Please use shaders that have backface culling off.
      * Old triangle-winding code has been removed from `SkeletonRenderer`. Please use shaders that have backface culling off.
@@ -161,15 +161,15 @@
   * Removed `RegionAttachment.updateWorldVertices`, added `RegionAttachment.computeWorldVertices`. The new method now computes the x/y positions of the 4 vertices of the corner and places them in the provided `worldVertices` array, starting at `offset`, then moving by `stride` array elements when advancing to the next vertex. This allows to directly compose the vertex buffer and avoids a copy. The computation of the full vertices, including vertex colors and texture coordinates, is now done by the backend's respective renderer.
   * Removed `RegionAttachment.updateWorldVertices`, added `RegionAttachment.computeWorldVertices`. The new method now computes the x/y positions of the 4 vertices of the corner and places them in the provided `worldVertices` array, starting at `offset`, then moving by `stride` array elements when advancing to the next vertex. This allows to directly compose the vertex buffer and avoids a copy. The computation of the full vertices, including vertex colors and texture coordinates, is now done by the backend's respective renderer.
   * Skeleton attachments: Moved update of attached skeleton out of libGDX `SkeletonRenderer`, added overloaded method `Skeleton#updateWorldTransform(Bone), used for `SkeletonAttachment`. You now MUST call this new method
   * Skeleton attachments: Moved update of attached skeleton out of libGDX `SkeletonRenderer`, added overloaded method `Skeleton#updateWorldTransform(Bone), used for `SkeletonAttachment`. You now MUST call this new method
   with the bone of the parent skeleton to which the child skeleton is attached. See `SkeletonAttachmentTest` for and example.
   with the bone of the parent skeleton to which the child skeleton is attached. See `SkeletonAttachmentTest` for and example.
- * **Additions**  
+ * **Additions**
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
-  * Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).  
-  * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.  
+  * Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).
+  * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.
   * Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.
   * Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
   * Added `SkeletonClipper` and `Triangulator`, used to implement software clipping of attachments.
   * Added `SkeletonClipper` and `Triangulator`, used to implement software clipping of attachments.
   * `AnimationState#apply` returns boolean indicating if any timeline was applied or not.
   * `AnimationState#apply` returns boolean indicating if any timeline was applied or not.
-  * `Animation#apply` and `Timeline#apply`` now take enums `MixPose` and `MixDirection` instead of booleans  
+  * `Animation#apply` and `Timeline#apply`` now take enums `MixPose` and `MixDirection` instead of booleans
 
 
 ### libGDX
 ### libGDX
  * Fixed renderer to work with 3.6 changes
  * Fixed renderer to work with 3.6 changes
@@ -187,7 +187,7 @@
  * **Additions**
  * **Additions**
   * Added `Bone:localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).
   * Added `Bone:localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).
   * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.
   * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.
-  * Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.  
+  * Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
   * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
   * Added `SkeletonClipper` and `Triangulator`, used to implement software clipping of attachments.
   * Added `SkeletonClipper` and `Triangulator`, used to implement software clipping of attachments.
@@ -213,10 +213,10 @@
   * Removed `VertexAttachment.computeWorldVertices` overload, changed `VertexAttachment.computeWorldVerticesWith` to `VertexAttachment.computeWorldVertices`, added `stride` parameter.
   * Removed `VertexAttachment.computeWorldVertices` overload, changed `VertexAttachment.computeWorldVerticesWith` to `VertexAttachment.computeWorldVertices`, added `stride` parameter.
   * Removed `RegionAttachment.vertices` field. The vertices array is provided to `RegionAttachment.computeWorldVertices` by the API user now.
   * Removed `RegionAttachment.vertices` field. The vertices array is provided to `RegionAttachment.computeWorldVertices` by the API user now.
   * Removed `RegionAttachment.updateWorldVertices`, added `RegionAttachment.computeWorldVertices`. The new method now computes the x/y positions of the 4 vertices of the corner and places them in the provided `worldVertices` array, starting at `offset`, then moving by `stride` array elements when advancing to the next vertex. This allows to directly compose the vertex buffer and avoids a copy. The computation of the full vertices, including vertex colors and texture coordinates, is now done by the backend's respective renderer.
   * Removed `RegionAttachment.updateWorldVertices`, added `RegionAttachment.computeWorldVertices`. The new method now computes the x/y positions of the 4 vertices of the corner and places them in the provided `worldVertices` array, starting at `offset`, then moving by `stride` array elements when advancing to the next vertex. This allows to directly compose the vertex buffer and avoids a copy. The computation of the full vertices, including vertex colors and texture coordinates, is now done by the backend's respective renderer.
- * **Additions**  
+ * **Additions**
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
   * Added support for local and relative transform constraint calculation, including additional fields in `TransformConstraintData`
-  * Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).  
-  * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.  
+  * Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).
+  * Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.
   * Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.
   * Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
   * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
   * Added `SkeletonClipper` and `Triangulator`, used to implement software clipping of attachments.
   * Added `SkeletonClipper` and `Triangulator`, used to implement software clipping of attachments.
@@ -250,6 +250,7 @@
  * Fixed renderer to work with 3.6 changes. Two color tinting is not supported.
  * Fixed renderer to work with 3.6 changes. Two color tinting is not supported.
  * Added clipping support
  * Added clipping support
  * Added `VertexEffect` interface, instances of which can be set on `SkeletonMesh`. Allows to modify vertices before submitting them to GPU. See `SwirlEffect`, `JitterEffect`.
  * Added `VertexEffect` interface, instances of which can be set on `SkeletonMesh`. Allows to modify vertices before submitting them to GPU. See `SwirlEffect`, `JitterEffect`.
+ * Added support for multi-page atlases
 
 
 ### Widget backend
 ### Widget backend
  * Fixed WebGL context loss (see WebGL backend changes). Enabled automatically.
  * Fixed WebGL context loss (see WebGL backend changes). Enabled automatically.

BIN
spine-as3/spine-as3-example/lib/spine-as3.swc


+ 1 - 0
spine-as3/spine-as3/src/spine/Skeleton.as

@@ -218,6 +218,7 @@ package spine {
 		}
 		}
 
 
 		private function sortPathConstraintAttachment(skin : Skin, slotIndex : int, slotBone : Bone) : void {
 		private function sortPathConstraintAttachment(skin : Skin, slotIndex : int, slotBone : Bone) : void {
+			if (!skin.attachments.hasOwnProperty(slotIndex)) return;
 			var dict : Dictionary = skin.attachments[slotIndex];
 			var dict : Dictionary = skin.attachments[slotIndex];
 			if (!dict) return;
 			if (!dict) return;
 
 

+ 1 - 1
spine-libgdx/spine-libgdx/pom.xml

@@ -10,7 +10,7 @@
 	<groupId>com.esotericsoftware.spine</groupId>
 	<groupId>com.esotericsoftware.spine</groupId>
 	<artifactId>spine-libgdx</artifactId>
 	<artifactId>spine-libgdx</artifactId>
 	<packaging>jar</packaging>
 	<packaging>jar</packaging>
-	<version>3.7.0.1-SNAPSHOT</version>
+	<version>3.6.51.2-SNAPSHOT</version>
 
 
 	<name>spine-libgdx</name>
 	<name>spine-libgdx</name>
 	<description>Spine Runtime for libGDX</description>
 	<description>Spine Runtime for libGDX</description>

BIN
spine-starling/spine-starling-example/lib/spine-as3.swc


BIN
spine-starling/spine-starling/lib/spine-as3.swc


+ 4 - 4
spine-ts/README.md

@@ -20,11 +20,11 @@ The Spine Runtimes are developed with the intent to be used with data exported f
 
 
 spine-ts works with data exported from Spine 3.6.xx.
 spine-ts works with data exported from Spine 3.6.xx.
 
 
-spine-ts WebGL & Widget backends supports all Spine features. 
+spine-ts WebGL & Widget backends supports all Spine features.
 
 
-spine-ts Canvas does not support color tinting, mesh attachments and clipping. Only the alpha channel from tint colors is applied. Experimental support for mesh attachments can be enabled by setting `spine.canvas.SkeletonRenderer.useTriangleRendering` to true. Note that this method is slow and may lead to artifacts on some browsers. 
+spine-ts Canvas does not support color tinting, mesh attachments and clipping. Only the alpha channel from tint colors is applied. Experimental support for mesh attachments can be enabled by setting `spine.canvas.SkeletonRenderer.useTriangleRendering` to true. Note that this method is slow and may lead to artifacts on some browsers.
 
 
-spine-ts THREE.JS does not support color tinting, blend modes and clipping. The THREE.JS backend provides `SkeletonMesh.zOffset` to avoid z-fighting. Adjust to your near/far plane settings.
+spine-ts THREE.JS does not support two color tinting & blend modes. The THREE.JS backend provides `SkeletonMesh.zOffset` to avoid z-fighting. Adjust to your near/far plane settings.
 
 
 spine-ts does not yet support loading the binary format.
 spine-ts does not yet support loading the binary format.
 
 
@@ -115,7 +115,7 @@ You can disable two-color tinting like this:
 // If you use SceneRenderer, disable two-color tinting via the last constructor argument
 // If you use SceneRenderer, disable two-color tinting via the last constructor argument
 var sceneRenderer = new spine.SceneRenderer(canvas, gl, false);
 var sceneRenderer = new spine.SceneRenderer(canvas, gl, false);
 
 
-// If you use SkeletonRenderer and PolygonBatcher directly, 
+// If you use SkeletonRenderer and PolygonBatcher directly,
 // disable two-color tinting in the respective constructor
 // disable two-color tinting in the respective constructor
 // and use the shader returned by Shader.newColoredTextured()
 // and use the shader returned by Shader.newColoredTextured()
 // instead of Shader.newTwoColoredTextured()
 // instead of Shader.newTwoColoredTextured()

+ 12 - 5
spine-ts/build/spine-all.d.ts

@@ -1701,22 +1701,26 @@ declare module spine.threejs {
 	}
 	}
 }
 }
 declare module spine.threejs {
 declare module spine.threejs {
-	class MeshBatcher {
-		mesh: THREE.Mesh;
+	class MeshBatcher extends THREE.Mesh {
 		private static VERTEX_SIZE;
 		private static VERTEX_SIZE;
 		private vertexBuffer;
 		private vertexBuffer;
 		private vertices;
 		private vertices;
 		private verticesLength;
 		private verticesLength;
 		private indices;
 		private indices;
 		private indicesLength;
 		private indicesLength;
-		constructor(mesh: THREE.Mesh, maxVertices?: number);
+		constructor(maxVertices?: number);
+		clear(): void;
 		begin(): void;
 		begin(): void;
+		canBatch(verticesLength: number, indicesLength: number): boolean;
 		batch(vertices: ArrayLike<number>, verticesLength: number, indices: ArrayLike<number>, indicesLength: number, z?: number): void;
 		batch(vertices: ArrayLike<number>, verticesLength: number, indices: ArrayLike<number>, indicesLength: number, z?: number): void;
 		end(): void;
 		end(): void;
 	}
 	}
 }
 }
 declare module spine.threejs {
 declare module spine.threejs {
-	class SkeletonMesh extends THREE.Mesh {
+	class SkeletonMeshMaterial extends THREE.ShaderMaterial {
+		constructor();
+	}
+	class SkeletonMesh extends THREE.Object3D {
 		tempPos: Vector2;
 		tempPos: Vector2;
 		tempUv: Vector2;
 		tempUv: Vector2;
 		tempLight: Color;
 		tempLight: Color;
@@ -1725,7 +1729,8 @@ declare module spine.threejs {
 		state: AnimationState;
 		state: AnimationState;
 		zOffset: number;
 		zOffset: number;
 		vertexEffect: VertexEffect;
 		vertexEffect: VertexEffect;
-		private batcher;
+		private batches;
+		private nextBatchIndex;
 		private clipper;
 		private clipper;
 		static QUAD_TRIANGLES: number[];
 		static QUAD_TRIANGLES: number[];
 		static VERTEX_SIZE: number;
 		static VERTEX_SIZE: number;
@@ -1733,6 +1738,8 @@ declare module spine.threejs {
 		private tempColor;
 		private tempColor;
 		constructor(skeletonData: SkeletonData);
 		constructor(skeletonData: SkeletonData);
 		update(deltaTime: number): void;
 		update(deltaTime: number): void;
+		private clearBatches();
+		private nextBatch();
 		private updateGeometry();
 		private updateGeometry();
 	}
 	}
 }
 }

+ 113 - 33
spine-ts/build/spine-all.js

@@ -2001,6 +2001,7 @@ var spine;
 			path = this.pathPrefix + path;
 			path = this.pathPrefix + path;
 			this.toLoad++;
 			this.toLoad++;
 			AssetManager.downloadText(path, function (atlasData) {
 			AssetManager.downloadText(path, function (atlasData) {
+				var pagesLoaded = { count: 0 };
 				var atlasPages = new Array();
 				var atlasPages = new Array();
 				try {
 				try {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2021,11 +2022,10 @@ var spine;
 					return;
 					return;
 				}
 				}
 				var _loop_1 = function (atlasPage) {
 				var _loop_1 = function (atlasPage) {
-					var pagesLoaded = 0;
 					var pageLoadError = false;
 					var pageLoadError = false;
 					_this.loadTexture(atlasPage, function (imagePath, image) {
 					_this.loadTexture(atlasPage, function (imagePath, image) {
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							if (!pageLoadError) {
 							if (!pageLoadError) {
 								try {
 								try {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2056,8 +2056,8 @@ var spine;
 						}
 						}
 					}, function (imagePath, errorMessage) {
 					}, function (imagePath, errorMessage) {
 						pageLoadError = true;
 						pageLoadError = true;
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							if (error)
 							if (error)
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
@@ -9433,18 +9433,19 @@ var spine;
 (function (spine) {
 (function (spine) {
 	var threejs;
 	var threejs;
 	(function (threejs) {
 	(function (threejs) {
-		var MeshBatcher = (function () {
-			function MeshBatcher(mesh, maxVertices) {
+		var MeshBatcher = (function (_super) {
+			__extends(MeshBatcher, _super);
+			function MeshBatcher(maxVertices) {
 				if (maxVertices === void 0) { maxVertices = 10920; }
 				if (maxVertices === void 0) { maxVertices = 10920; }
-				this.verticesLength = 0;
-				this.indicesLength = 0;
+				var _this = _super.call(this) || this;
+				_this.verticesLength = 0;
+				_this.indicesLength = 0;
 				if (maxVertices > 10920)
 				if (maxVertices > 10920)
 					throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices);
 					throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices);
-				var vertices = this.vertices = new Float32Array(maxVertices * MeshBatcher.VERTEX_SIZE);
-				var indices = this.indices = new Uint16Array(maxVertices * 3);
-				this.mesh = mesh;
+				var vertices = _this.vertices = new Float32Array(maxVertices * MeshBatcher.VERTEX_SIZE);
+				var indices = _this.indices = new Uint16Array(maxVertices * 3);
 				var geo = new THREE.BufferGeometry();
 				var geo = new THREE.BufferGeometry();
-				var vertexBuffer = this.vertexBuffer = new THREE.InterleavedBuffer(vertices, MeshBatcher.VERTEX_SIZE);
+				var vertexBuffer = _this.vertexBuffer = new THREE.InterleavedBuffer(vertices, MeshBatcher.VERTEX_SIZE);
 				vertexBuffer.dynamic = true;
 				vertexBuffer.dynamic = true;
 				geo.addAttribute("position", new THREE.InterleavedBufferAttribute(vertexBuffer, 3, 0, false));
 				geo.addAttribute("position", new THREE.InterleavedBufferAttribute(vertexBuffer, 3, 0, false));
 				geo.addAttribute("color", new THREE.InterleavedBufferAttribute(vertexBuffer, 4, 3, false));
 				geo.addAttribute("color", new THREE.InterleavedBufferAttribute(vertexBuffer, 4, 3, false));
@@ -9453,12 +9454,27 @@ var spine;
 				geo.getIndex().dynamic = true;
 				geo.getIndex().dynamic = true;
 				geo.drawRange.start = 0;
 				geo.drawRange.start = 0;
 				geo.drawRange.count = 0;
 				geo.drawRange.count = 0;
-				mesh.geometry = geo;
+				_this.geometry = geo;
+				_this.material = new threejs.SkeletonMeshMaterial();
+				return _this;
 			}
 			}
+			MeshBatcher.prototype.clear = function () {
+				var geo = this.geometry;
+				geo.drawRange.start = 0;
+				geo.drawRange.count = 0;
+				this.material.uniforms.map.value = null;
+			};
 			MeshBatcher.prototype.begin = function () {
 			MeshBatcher.prototype.begin = function () {
 				this.verticesLength = 0;
 				this.verticesLength = 0;
 				this.indicesLength = 0;
 				this.indicesLength = 0;
 			};
 			};
+			MeshBatcher.prototype.canBatch = function (verticesLength, indicesLength) {
+				if (this.indicesLength + indicesLength >= this.indices.byteLength / 2)
+					return false;
+				if (this.verticesLength + verticesLength >= this.vertices.byteLength / 2)
+					return false;
+				return true;
+			};
 			MeshBatcher.prototype.batch = function (vertices, verticesLength, indices, indicesLength, z) {
 			MeshBatcher.prototype.batch = function (vertices, verticesLength, indices, indicesLength, z) {
 				if (z === void 0) { z = 0; }
 				if (z === void 0) { z = 0; }
 				var indexStart = this.verticesLength / MeshBatcher.VERTEX_SIZE;
 				var indexStart = this.verticesLength / MeshBatcher.VERTEX_SIZE;
@@ -9486,7 +9502,7 @@ var spine;
 				this.vertexBuffer.needsUpdate = true;
 				this.vertexBuffer.needsUpdate = true;
 				this.vertexBuffer.updateRange.offset = 0;
 				this.vertexBuffer.updateRange.offset = 0;
 				this.vertexBuffer.updateRange.count = this.verticesLength;
 				this.vertexBuffer.updateRange.count = this.verticesLength;
-				var geo = this.mesh.geometry;
+				var geo = this.geometry;
 				geo.getIndex().needsUpdate = true;
 				geo.getIndex().needsUpdate = true;
 				geo.getIndex().updateRange.offset = 0;
 				geo.getIndex().updateRange.offset = 0;
 				geo.getIndex().updateRange.count = this.indicesLength;
 				geo.getIndex().updateRange.count = this.indicesLength;
@@ -9494,7 +9510,7 @@ var spine;
 				geo.drawRange.count = this.indicesLength;
 				geo.drawRange.count = this.indicesLength;
 			};
 			};
 			return MeshBatcher;
 			return MeshBatcher;
-		}());
+		}(THREE.Mesh));
 		MeshBatcher.VERTEX_SIZE = 9;
 		MeshBatcher.VERTEX_SIZE = 9;
 		threejs.MeshBatcher = MeshBatcher;
 		threejs.MeshBatcher = MeshBatcher;
 	})(threejs = spine.threejs || (spine.threejs = {}));
 	})(threejs = spine.threejs || (spine.threejs = {}));
@@ -9503,6 +9519,29 @@ var spine;
 (function (spine) {
 (function (spine) {
 	var threejs;
 	var threejs;
 	(function (threejs) {
 	(function (threejs) {
+		var SkeletonMeshMaterial = (function (_super) {
+			__extends(SkeletonMeshMaterial, _super);
+			function SkeletonMeshMaterial() {
+				var _this = this;
+				var vertexShader = "\n\t\t\t\tattribute vec4 color;\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvarying vec4 vColor;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tvColor = color;\n\t\t\t\t\tgl_Position = projectionMatrix*modelViewMatrix*vec4(position,1.0);\n\t\t\t\t}\n\t\t\t";
+				var fragmentShader = "\n\t\t\t\tuniform sampler2D map;\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvarying vec4 vColor;\n\t\t\t\tvoid main(void) {\n\t\t\t\t\tgl_FragColor = texture2D(map, vUv)*vColor;\n\t\t\t\t}\n\t\t\t";
+				var parameters = {
+					uniforms: {
+						map: { type: "t", value: null }
+					},
+					vertexShader: vertexShader,
+					fragmentShader: fragmentShader,
+					side: THREE.DoubleSide,
+					transparent: true,
+					alphaTest: 0.5
+				};
+				_this = _super.call(this, parameters) || this;
+				return _this;
+			}
+			;
+			return SkeletonMeshMaterial;
+		}(THREE.ShaderMaterial));
+		threejs.SkeletonMeshMaterial = SkeletonMeshMaterial;
 		var SkeletonMesh = (function (_super) {
 		var SkeletonMesh = (function (_super) {
 			__extends(SkeletonMesh, _super);
 			__extends(SkeletonMesh, _super);
 			function SkeletonMesh(skeletonData) {
 			function SkeletonMesh(skeletonData) {
@@ -9512,17 +9551,14 @@ var spine;
 				_this.tempLight = new spine.Color();
 				_this.tempLight = new spine.Color();
 				_this.tempDark = new spine.Color();
 				_this.tempDark = new spine.Color();
 				_this.zOffset = 0.1;
 				_this.zOffset = 0.1;
+				_this.batches = new Array();
+				_this.nextBatchIndex = 0;
 				_this.clipper = new spine.SkeletonClipping();
 				_this.clipper = new spine.SkeletonClipping();
 				_this.vertices = spine.Utils.newFloatArray(1024);
 				_this.vertices = spine.Utils.newFloatArray(1024);
 				_this.tempColor = new spine.Color();
 				_this.tempColor = new spine.Color();
 				_this.skeleton = new spine.Skeleton(skeletonData);
 				_this.skeleton = new spine.Skeleton(skeletonData);
 				var animData = new spine.AnimationStateData(skeletonData);
 				var animData = new spine.AnimationStateData(skeletonData);
 				_this.state = new spine.AnimationState(animData);
 				_this.state = new spine.AnimationState(animData);
-				var material = _this.material = new THREE.MeshBasicMaterial();
-				material.side = THREE.DoubleSide;
-				material.transparent = true;
-				material.alphaTest = 0.5;
-				_this.batcher = new threejs.MeshBatcher(_this);
 				return _this;
 				return _this;
 			}
 			}
 			SkeletonMesh.prototype.update = function (deltaTime) {
 			SkeletonMesh.prototype.update = function (deltaTime) {
@@ -9533,12 +9569,29 @@ var spine;
 				skeleton.updateWorldTransform();
 				skeleton.updateWorldTransform();
 				this.updateGeometry();
 				this.updateGeometry();
 			};
 			};
+			SkeletonMesh.prototype.clearBatches = function () {
+				for (var i = 0; i < this.batches.length; i++) {
+					this.batches[i].clear();
+					this.batches[i].visible = false;
+				}
+				this.nextBatchIndex = 0;
+			};
+			SkeletonMesh.prototype.nextBatch = function () {
+				if (this.batches.length == this.nextBatchIndex) {
+					var batch_1 = new threejs.MeshBatcher();
+					this.add(batch_1);
+					this.batches.push(batch_1);
+				}
+				var batch = this.batches[this.nextBatchIndex++];
+				batch.visible = true;
+				return batch;
+			};
 			SkeletonMesh.prototype.updateGeometry = function () {
 			SkeletonMesh.prototype.updateGeometry = function () {
+				this.clearBatches();
 				var tempPos = this.tempPos;
 				var tempPos = this.tempPos;
 				var tempUv = this.tempUv;
 				var tempUv = this.tempUv;
 				var tempLight = this.tempLight;
 				var tempLight = this.tempLight;
 				var tempDark = this.tempDark;
 				var tempDark = this.tempDark;
-				var geometry = this.geometry;
 				var numVertices = 0;
 				var numVertices = 0;
 				var verticesLength = 0;
 				var verticesLength = 0;
 				var indicesLength = 0;
 				var indicesLength = 0;
@@ -9548,8 +9601,8 @@ var spine;
 				var triangles = null;
 				var triangles = null;
 				var uvs = null;
 				var uvs = null;
 				var drawOrder = this.skeleton.drawOrder;
 				var drawOrder = this.skeleton.drawOrder;
-				var batcher = this.batcher;
-				batcher.begin();
+				var batch = this.nextBatch();
+				batch.begin();
 				var z = 0;
 				var z = 0;
 				var zOffset = this.zOffset;
 				var zOffset = this.zOffset;
 				for (var i = 0, n = drawOrder.length; i < n; i++) {
 				for (var i = 0, n = drawOrder.length; i < n; i++) {
@@ -9590,17 +9643,16 @@ var spine;
 					else
 					else
 						continue;
 						continue;
 					if (texture != null) {
 					if (texture != null) {
-						if (!this.material.map) {
-							var mat = this.material;
-							mat.map = texture.texture;
-							mat.needsUpdate = true;
-						}
 						var skeleton = slot.bone.skeleton;
 						var skeleton = slot.bone.skeleton;
 						var skeletonColor = skeleton.color;
 						var skeletonColor = skeleton.color;
 						var slotColor = slot.color;
 						var slotColor = slot.color;
 						var alpha = skeletonColor.a * slotColor.a * attachmentColor.a;
 						var alpha = skeletonColor.a * slotColor.a * attachmentColor.a;
 						var color = this.tempColor;
 						var color = this.tempColor;
 						color.set(skeletonColor.r * slotColor.r * attachmentColor.r, skeletonColor.g * slotColor.g * attachmentColor.g, skeletonColor.b * slotColor.b * attachmentColor.b, alpha);
 						color.set(skeletonColor.r * slotColor.r * attachmentColor.r, skeletonColor.g * slotColor.g * attachmentColor.g, skeletonColor.b * slotColor.b * attachmentColor.b, alpha);
+						var finalVertices = void 0;
+						var finalVerticesLength = void 0;
+						var finalIndices = void 0;
+						var finalIndicesLength = void 0;
 						if (clipper.isClipping()) {
 						if (clipper.isClipping()) {
 							clipper.clipTriangles(vertices, numFloats, triangles, triangles.length, uvs, color, null, false);
 							clipper.clipTriangles(vertices, numFloats, triangles, triangles.length, uvs, color, null, false);
 							var clippedVertices = clipper.clippedVertices;
 							var clippedVertices = clipper.clippedVertices;
@@ -9626,7 +9678,10 @@ var spine;
 									verts[v + 7] = tempUv.y;
 									verts[v + 7] = tempUv.y;
 								}
 								}
 							}
 							}
-							batcher.batch(clippedVertices, clippedVertices.length, clippedTriangles, clippedTriangles.length, z);
+							finalVertices = clippedVertices;
+							finalVerticesLength = clippedVertices.length;
+							finalIndices = clippedTriangles;
+							finalIndicesLength = clippedTriangles.length;
 						}
 						}
 						else {
 						else {
 							var verts = vertices;
 							var verts = vertices;
@@ -9660,15 +9715,40 @@ var spine;
 									verts[v + 5] = uvs[u + 1];
 									verts[v + 5] = uvs[u + 1];
 								}
 								}
 							}
 							}
-							batcher.batch(vertices, numFloats, triangles, triangles.length, z);
+							finalVertices = vertices;
+							finalVerticesLength = numFloats;
+							finalIndices = triangles;
+							finalIndicesLength = triangles.length;
 						}
 						}
+						if (finalVerticesLength == 0 || finalIndicesLength == 0)
+							continue;
+						if (!batch.canBatch(finalVerticesLength, finalIndicesLength)) {
+							batch.end();
+							batch = this.nextBatch();
+							batch.begin();
+						}
+						var batchMaterial = batch.material;
+						if (batchMaterial.uniforms.map.value == null) {
+							batchMaterial.uniforms.map.value = texture.texture;
+						}
+						if (batchMaterial.uniforms.map.value != texture.texture) {
+							batch.end();
+							batch = this.nextBatch();
+							batch.begin();
+							batchMaterial = batch.material;
+							batchMaterial.uniforms.map.value = texture.texture;
+						}
+						batchMaterial.needsUpdate = true;
+						batch.batch(finalVertices, finalVerticesLength, finalIndices, finalIndicesLength, z);
 						z += zOffset;
 						z += zOffset;
 					}
 					}
+					clipper.clipEndWithSlot(slot);
 				}
 				}
-				batcher.end();
+				clipper.clipEnd();
+				batch.end();
 			};
 			};
 			return SkeletonMesh;
 			return SkeletonMesh;
-		}(THREE.Mesh));
+		}(THREE.Object3D));
 		SkeletonMesh.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
 		SkeletonMesh.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
 		SkeletonMesh.VERTEX_SIZE = 2 + 2 + 4;
 		SkeletonMesh.VERTEX_SIZE = 2 + 2 + 4;
 		threejs.SkeletonMesh = SkeletonMesh;
 		threejs.SkeletonMesh = SkeletonMesh;

File diff suppressed because it is too large
+ 0 - 0
spine-ts/build/spine-all.js.map


+ 5 - 5
spine-ts/build/spine-canvas.js

@@ -2001,6 +2001,7 @@ var spine;
 			path = this.pathPrefix + path;
 			path = this.pathPrefix + path;
 			this.toLoad++;
 			this.toLoad++;
 			AssetManager.downloadText(path, function (atlasData) {
 			AssetManager.downloadText(path, function (atlasData) {
+				var pagesLoaded = { count: 0 };
 				var atlasPages = new Array();
 				var atlasPages = new Array();
 				try {
 				try {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2021,11 +2022,10 @@ var spine;
 					return;
 					return;
 				}
 				}
 				var _loop_1 = function (atlasPage) {
 				var _loop_1 = function (atlasPage) {
-					var pagesLoaded = 0;
 					var pageLoadError = false;
 					var pageLoadError = false;
 					_this.loadTexture(atlasPage, function (imagePath, image) {
 					_this.loadTexture(atlasPage, function (imagePath, image) {
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							if (!pageLoadError) {
 							if (!pageLoadError) {
 								try {
 								try {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2056,8 +2056,8 @@ var spine;
 						}
 						}
 					}, function (imagePath, errorMessage) {
 					}, function (imagePath, errorMessage) {
 						pageLoadError = true;
 						pageLoadError = true;
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							if (error)
 							if (error)
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);

File diff suppressed because it is too large
+ 0 - 0
spine-ts/build/spine-canvas.js.map


+ 5 - 5
spine-ts/build/spine-core.js

@@ -2001,6 +2001,7 @@ var spine;
 			path = this.pathPrefix + path;
 			path = this.pathPrefix + path;
 			this.toLoad++;
 			this.toLoad++;
 			AssetManager.downloadText(path, function (atlasData) {
 			AssetManager.downloadText(path, function (atlasData) {
+				var pagesLoaded = { count: 0 };
 				var atlasPages = new Array();
 				var atlasPages = new Array();
 				try {
 				try {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2021,11 +2022,10 @@ var spine;
 					return;
 					return;
 				}
 				}
 				var _loop_1 = function (atlasPage) {
 				var _loop_1 = function (atlasPage) {
-					var pagesLoaded = 0;
 					var pageLoadError = false;
 					var pageLoadError = false;
 					_this.loadTexture(atlasPage, function (imagePath, image) {
 					_this.loadTexture(atlasPage, function (imagePath, image) {
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							if (!pageLoadError) {
 							if (!pageLoadError) {
 								try {
 								try {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2056,8 +2056,8 @@ var spine;
 						}
 						}
 					}, function (imagePath, errorMessage) {
 					}, function (imagePath, errorMessage) {
 						pageLoadError = true;
 						pageLoadError = true;
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							if (error)
 							if (error)
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);

File diff suppressed because it is too large
+ 0 - 0
spine-ts/build/spine-core.js.map


+ 12 - 5
spine-ts/build/spine-threejs.d.ts

@@ -1235,22 +1235,26 @@ declare module spine.threejs {
 	}
 	}
 }
 }
 declare module spine.threejs {
 declare module spine.threejs {
-	class MeshBatcher {
-		mesh: THREE.Mesh;
+	class MeshBatcher extends THREE.Mesh {
 		private static VERTEX_SIZE;
 		private static VERTEX_SIZE;
 		private vertexBuffer;
 		private vertexBuffer;
 		private vertices;
 		private vertices;
 		private verticesLength;
 		private verticesLength;
 		private indices;
 		private indices;
 		private indicesLength;
 		private indicesLength;
-		constructor(mesh: THREE.Mesh, maxVertices?: number);
+		constructor(maxVertices?: number);
+		clear(): void;
 		begin(): void;
 		begin(): void;
+		canBatch(verticesLength: number, indicesLength: number): boolean;
 		batch(vertices: ArrayLike<number>, verticesLength: number, indices: ArrayLike<number>, indicesLength: number, z?: number): void;
 		batch(vertices: ArrayLike<number>, verticesLength: number, indices: ArrayLike<number>, indicesLength: number, z?: number): void;
 		end(): void;
 		end(): void;
 	}
 	}
 }
 }
 declare module spine.threejs {
 declare module spine.threejs {
-	class SkeletonMesh extends THREE.Mesh {
+	class SkeletonMeshMaterial extends THREE.ShaderMaterial {
+		constructor();
+	}
+	class SkeletonMesh extends THREE.Object3D {
 		tempPos: Vector2;
 		tempPos: Vector2;
 		tempUv: Vector2;
 		tempUv: Vector2;
 		tempLight: Color;
 		tempLight: Color;
@@ -1259,7 +1263,8 @@ declare module spine.threejs {
 		state: AnimationState;
 		state: AnimationState;
 		zOffset: number;
 		zOffset: number;
 		vertexEffect: VertexEffect;
 		vertexEffect: VertexEffect;
-		private batcher;
+		private batches;
+		private nextBatchIndex;
 		private clipper;
 		private clipper;
 		static QUAD_TRIANGLES: number[];
 		static QUAD_TRIANGLES: number[];
 		static VERTEX_SIZE: number;
 		static VERTEX_SIZE: number;
@@ -1267,6 +1272,8 @@ declare module spine.threejs {
 		private tempColor;
 		private tempColor;
 		constructor(skeletonData: SkeletonData);
 		constructor(skeletonData: SkeletonData);
 		update(deltaTime: number): void;
 		update(deltaTime: number): void;
+		private clearBatches();
+		private nextBatch();
 		private updateGeometry();
 		private updateGeometry();
 	}
 	}
 }
 }

+ 113 - 33
spine-ts/build/spine-threejs.js

@@ -2001,6 +2001,7 @@ var spine;
 			path = this.pathPrefix + path;
 			path = this.pathPrefix + path;
 			this.toLoad++;
 			this.toLoad++;
 			AssetManager.downloadText(path, function (atlasData) {
 			AssetManager.downloadText(path, function (atlasData) {
+				var pagesLoaded = { count: 0 };
 				var atlasPages = new Array();
 				var atlasPages = new Array();
 				try {
 				try {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2021,11 +2022,10 @@ var spine;
 					return;
 					return;
 				}
 				}
 				var _loop_1 = function (atlasPage) {
 				var _loop_1 = function (atlasPage) {
-					var pagesLoaded = 0;
 					var pageLoadError = false;
 					var pageLoadError = false;
 					_this.loadTexture(atlasPage, function (imagePath, image) {
 					_this.loadTexture(atlasPage, function (imagePath, image) {
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							if (!pageLoadError) {
 							if (!pageLoadError) {
 								try {
 								try {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2056,8 +2056,8 @@ var spine;
 						}
 						}
 					}, function (imagePath, errorMessage) {
 					}, function (imagePath, errorMessage) {
 						pageLoadError = true;
 						pageLoadError = true;
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							if (error)
 							if (error)
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
@@ -6604,18 +6604,19 @@ var spine;
 (function (spine) {
 (function (spine) {
 	var threejs;
 	var threejs;
 	(function (threejs) {
 	(function (threejs) {
-		var MeshBatcher = (function () {
-			function MeshBatcher(mesh, maxVertices) {
+		var MeshBatcher = (function (_super) {
+			__extends(MeshBatcher, _super);
+			function MeshBatcher(maxVertices) {
 				if (maxVertices === void 0) { maxVertices = 10920; }
 				if (maxVertices === void 0) { maxVertices = 10920; }
-				this.verticesLength = 0;
-				this.indicesLength = 0;
+				var _this = _super.call(this) || this;
+				_this.verticesLength = 0;
+				_this.indicesLength = 0;
 				if (maxVertices > 10920)
 				if (maxVertices > 10920)
 					throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices);
 					throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices);
-				var vertices = this.vertices = new Float32Array(maxVertices * MeshBatcher.VERTEX_SIZE);
-				var indices = this.indices = new Uint16Array(maxVertices * 3);
-				this.mesh = mesh;
+				var vertices = _this.vertices = new Float32Array(maxVertices * MeshBatcher.VERTEX_SIZE);
+				var indices = _this.indices = new Uint16Array(maxVertices * 3);
 				var geo = new THREE.BufferGeometry();
 				var geo = new THREE.BufferGeometry();
-				var vertexBuffer = this.vertexBuffer = new THREE.InterleavedBuffer(vertices, MeshBatcher.VERTEX_SIZE);
+				var vertexBuffer = _this.vertexBuffer = new THREE.InterleavedBuffer(vertices, MeshBatcher.VERTEX_SIZE);
 				vertexBuffer.dynamic = true;
 				vertexBuffer.dynamic = true;
 				geo.addAttribute("position", new THREE.InterleavedBufferAttribute(vertexBuffer, 3, 0, false));
 				geo.addAttribute("position", new THREE.InterleavedBufferAttribute(vertexBuffer, 3, 0, false));
 				geo.addAttribute("color", new THREE.InterleavedBufferAttribute(vertexBuffer, 4, 3, false));
 				geo.addAttribute("color", new THREE.InterleavedBufferAttribute(vertexBuffer, 4, 3, false));
@@ -6624,12 +6625,27 @@ var spine;
 				geo.getIndex().dynamic = true;
 				geo.getIndex().dynamic = true;
 				geo.drawRange.start = 0;
 				geo.drawRange.start = 0;
 				geo.drawRange.count = 0;
 				geo.drawRange.count = 0;
-				mesh.geometry = geo;
+				_this.geometry = geo;
+				_this.material = new threejs.SkeletonMeshMaterial();
+				return _this;
 			}
 			}
+			MeshBatcher.prototype.clear = function () {
+				var geo = this.geometry;
+				geo.drawRange.start = 0;
+				geo.drawRange.count = 0;
+				this.material.uniforms.map.value = null;
+			};
 			MeshBatcher.prototype.begin = function () {
 			MeshBatcher.prototype.begin = function () {
 				this.verticesLength = 0;
 				this.verticesLength = 0;
 				this.indicesLength = 0;
 				this.indicesLength = 0;
 			};
 			};
+			MeshBatcher.prototype.canBatch = function (verticesLength, indicesLength) {
+				if (this.indicesLength + indicesLength >= this.indices.byteLength / 2)
+					return false;
+				if (this.verticesLength + verticesLength >= this.vertices.byteLength / 2)
+					return false;
+				return true;
+			};
 			MeshBatcher.prototype.batch = function (vertices, verticesLength, indices, indicesLength, z) {
 			MeshBatcher.prototype.batch = function (vertices, verticesLength, indices, indicesLength, z) {
 				if (z === void 0) { z = 0; }
 				if (z === void 0) { z = 0; }
 				var indexStart = this.verticesLength / MeshBatcher.VERTEX_SIZE;
 				var indexStart = this.verticesLength / MeshBatcher.VERTEX_SIZE;
@@ -6657,7 +6673,7 @@ var spine;
 				this.vertexBuffer.needsUpdate = true;
 				this.vertexBuffer.needsUpdate = true;
 				this.vertexBuffer.updateRange.offset = 0;
 				this.vertexBuffer.updateRange.offset = 0;
 				this.vertexBuffer.updateRange.count = this.verticesLength;
 				this.vertexBuffer.updateRange.count = this.verticesLength;
-				var geo = this.mesh.geometry;
+				var geo = this.geometry;
 				geo.getIndex().needsUpdate = true;
 				geo.getIndex().needsUpdate = true;
 				geo.getIndex().updateRange.offset = 0;
 				geo.getIndex().updateRange.offset = 0;
 				geo.getIndex().updateRange.count = this.indicesLength;
 				geo.getIndex().updateRange.count = this.indicesLength;
@@ -6665,7 +6681,7 @@ var spine;
 				geo.drawRange.count = this.indicesLength;
 				geo.drawRange.count = this.indicesLength;
 			};
 			};
 			return MeshBatcher;
 			return MeshBatcher;
-		}());
+		}(THREE.Mesh));
 		MeshBatcher.VERTEX_SIZE = 9;
 		MeshBatcher.VERTEX_SIZE = 9;
 		threejs.MeshBatcher = MeshBatcher;
 		threejs.MeshBatcher = MeshBatcher;
 	})(threejs = spine.threejs || (spine.threejs = {}));
 	})(threejs = spine.threejs || (spine.threejs = {}));
@@ -6674,6 +6690,29 @@ var spine;
 (function (spine) {
 (function (spine) {
 	var threejs;
 	var threejs;
 	(function (threejs) {
 	(function (threejs) {
+		var SkeletonMeshMaterial = (function (_super) {
+			__extends(SkeletonMeshMaterial, _super);
+			function SkeletonMeshMaterial() {
+				var _this = this;
+				var vertexShader = "\n\t\t\t\tattribute vec4 color;\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvarying vec4 vColor;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tvColor = color;\n\t\t\t\t\tgl_Position = projectionMatrix*modelViewMatrix*vec4(position,1.0);\n\t\t\t\t}\n\t\t\t";
+				var fragmentShader = "\n\t\t\t\tuniform sampler2D map;\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvarying vec4 vColor;\n\t\t\t\tvoid main(void) {\n\t\t\t\t\tgl_FragColor = texture2D(map, vUv)*vColor;\n\t\t\t\t}\n\t\t\t";
+				var parameters = {
+					uniforms: {
+						map: { type: "t", value: null }
+					},
+					vertexShader: vertexShader,
+					fragmentShader: fragmentShader,
+					side: THREE.DoubleSide,
+					transparent: true,
+					alphaTest: 0.5
+				};
+				_this = _super.call(this, parameters) || this;
+				return _this;
+			}
+			;
+			return SkeletonMeshMaterial;
+		}(THREE.ShaderMaterial));
+		threejs.SkeletonMeshMaterial = SkeletonMeshMaterial;
 		var SkeletonMesh = (function (_super) {
 		var SkeletonMesh = (function (_super) {
 			__extends(SkeletonMesh, _super);
 			__extends(SkeletonMesh, _super);
 			function SkeletonMesh(skeletonData) {
 			function SkeletonMesh(skeletonData) {
@@ -6683,17 +6722,14 @@ var spine;
 				_this.tempLight = new spine.Color();
 				_this.tempLight = new spine.Color();
 				_this.tempDark = new spine.Color();
 				_this.tempDark = new spine.Color();
 				_this.zOffset = 0.1;
 				_this.zOffset = 0.1;
+				_this.batches = new Array();
+				_this.nextBatchIndex = 0;
 				_this.clipper = new spine.SkeletonClipping();
 				_this.clipper = new spine.SkeletonClipping();
 				_this.vertices = spine.Utils.newFloatArray(1024);
 				_this.vertices = spine.Utils.newFloatArray(1024);
 				_this.tempColor = new spine.Color();
 				_this.tempColor = new spine.Color();
 				_this.skeleton = new spine.Skeleton(skeletonData);
 				_this.skeleton = new spine.Skeleton(skeletonData);
 				var animData = new spine.AnimationStateData(skeletonData);
 				var animData = new spine.AnimationStateData(skeletonData);
 				_this.state = new spine.AnimationState(animData);
 				_this.state = new spine.AnimationState(animData);
-				var material = _this.material = new THREE.MeshBasicMaterial();
-				material.side = THREE.DoubleSide;
-				material.transparent = true;
-				material.alphaTest = 0.5;
-				_this.batcher = new threejs.MeshBatcher(_this);
 				return _this;
 				return _this;
 			}
 			}
 			SkeletonMesh.prototype.update = function (deltaTime) {
 			SkeletonMesh.prototype.update = function (deltaTime) {
@@ -6704,12 +6740,29 @@ var spine;
 				skeleton.updateWorldTransform();
 				skeleton.updateWorldTransform();
 				this.updateGeometry();
 				this.updateGeometry();
 			};
 			};
+			SkeletonMesh.prototype.clearBatches = function () {
+				for (var i = 0; i < this.batches.length; i++) {
+					this.batches[i].clear();
+					this.batches[i].visible = false;
+				}
+				this.nextBatchIndex = 0;
+			};
+			SkeletonMesh.prototype.nextBatch = function () {
+				if (this.batches.length == this.nextBatchIndex) {
+					var batch_1 = new threejs.MeshBatcher();
+					this.add(batch_1);
+					this.batches.push(batch_1);
+				}
+				var batch = this.batches[this.nextBatchIndex++];
+				batch.visible = true;
+				return batch;
+			};
 			SkeletonMesh.prototype.updateGeometry = function () {
 			SkeletonMesh.prototype.updateGeometry = function () {
+				this.clearBatches();
 				var tempPos = this.tempPos;
 				var tempPos = this.tempPos;
 				var tempUv = this.tempUv;
 				var tempUv = this.tempUv;
 				var tempLight = this.tempLight;
 				var tempLight = this.tempLight;
 				var tempDark = this.tempDark;
 				var tempDark = this.tempDark;
-				var geometry = this.geometry;
 				var numVertices = 0;
 				var numVertices = 0;
 				var verticesLength = 0;
 				var verticesLength = 0;
 				var indicesLength = 0;
 				var indicesLength = 0;
@@ -6719,8 +6772,8 @@ var spine;
 				var triangles = null;
 				var triangles = null;
 				var uvs = null;
 				var uvs = null;
 				var drawOrder = this.skeleton.drawOrder;
 				var drawOrder = this.skeleton.drawOrder;
-				var batcher = this.batcher;
-				batcher.begin();
+				var batch = this.nextBatch();
+				batch.begin();
 				var z = 0;
 				var z = 0;
 				var zOffset = this.zOffset;
 				var zOffset = this.zOffset;
 				for (var i = 0, n = drawOrder.length; i < n; i++) {
 				for (var i = 0, n = drawOrder.length; i < n; i++) {
@@ -6761,17 +6814,16 @@ var spine;
 					else
 					else
 						continue;
 						continue;
 					if (texture != null) {
 					if (texture != null) {
-						if (!this.material.map) {
-							var mat = this.material;
-							mat.map = texture.texture;
-							mat.needsUpdate = true;
-						}
 						var skeleton = slot.bone.skeleton;
 						var skeleton = slot.bone.skeleton;
 						var skeletonColor = skeleton.color;
 						var skeletonColor = skeleton.color;
 						var slotColor = slot.color;
 						var slotColor = slot.color;
 						var alpha = skeletonColor.a * slotColor.a * attachmentColor.a;
 						var alpha = skeletonColor.a * slotColor.a * attachmentColor.a;
 						var color = this.tempColor;
 						var color = this.tempColor;
 						color.set(skeletonColor.r * slotColor.r * attachmentColor.r, skeletonColor.g * slotColor.g * attachmentColor.g, skeletonColor.b * slotColor.b * attachmentColor.b, alpha);
 						color.set(skeletonColor.r * slotColor.r * attachmentColor.r, skeletonColor.g * slotColor.g * attachmentColor.g, skeletonColor.b * slotColor.b * attachmentColor.b, alpha);
+						var finalVertices = void 0;
+						var finalVerticesLength = void 0;
+						var finalIndices = void 0;
+						var finalIndicesLength = void 0;
 						if (clipper.isClipping()) {
 						if (clipper.isClipping()) {
 							clipper.clipTriangles(vertices, numFloats, triangles, triangles.length, uvs, color, null, false);
 							clipper.clipTriangles(vertices, numFloats, triangles, triangles.length, uvs, color, null, false);
 							var clippedVertices = clipper.clippedVertices;
 							var clippedVertices = clipper.clippedVertices;
@@ -6797,7 +6849,10 @@ var spine;
 									verts[v + 7] = tempUv.y;
 									verts[v + 7] = tempUv.y;
 								}
 								}
 							}
 							}
-							batcher.batch(clippedVertices, clippedVertices.length, clippedTriangles, clippedTriangles.length, z);
+							finalVertices = clippedVertices;
+							finalVerticesLength = clippedVertices.length;
+							finalIndices = clippedTriangles;
+							finalIndicesLength = clippedTriangles.length;
 						}
 						}
 						else {
 						else {
 							var verts = vertices;
 							var verts = vertices;
@@ -6831,15 +6886,40 @@ var spine;
 									verts[v + 5] = uvs[u + 1];
 									verts[v + 5] = uvs[u + 1];
 								}
 								}
 							}
 							}
-							batcher.batch(vertices, numFloats, triangles, triangles.length, z);
+							finalVertices = vertices;
+							finalVerticesLength = numFloats;
+							finalIndices = triangles;
+							finalIndicesLength = triangles.length;
 						}
 						}
+						if (finalVerticesLength == 0 || finalIndicesLength == 0)
+							continue;
+						if (!batch.canBatch(finalVerticesLength, finalIndicesLength)) {
+							batch.end();
+							batch = this.nextBatch();
+							batch.begin();
+						}
+						var batchMaterial = batch.material;
+						if (batchMaterial.uniforms.map.value == null) {
+							batchMaterial.uniforms.map.value = texture.texture;
+						}
+						if (batchMaterial.uniforms.map.value != texture.texture) {
+							batch.end();
+							batch = this.nextBatch();
+							batch.begin();
+							batchMaterial = batch.material;
+							batchMaterial.uniforms.map.value = texture.texture;
+						}
+						batchMaterial.needsUpdate = true;
+						batch.batch(finalVertices, finalVerticesLength, finalIndices, finalIndicesLength, z);
 						z += zOffset;
 						z += zOffset;
 					}
 					}
+					clipper.clipEndWithSlot(slot);
 				}
 				}
-				batcher.end();
+				clipper.clipEnd();
+				batch.end();
 			};
 			};
 			return SkeletonMesh;
 			return SkeletonMesh;
-		}(THREE.Mesh));
+		}(THREE.Object3D));
 		SkeletonMesh.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
 		SkeletonMesh.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
 		SkeletonMesh.VERTEX_SIZE = 2 + 2 + 4;
 		SkeletonMesh.VERTEX_SIZE = 2 + 2 + 4;
 		threejs.SkeletonMesh = SkeletonMesh;
 		threejs.SkeletonMesh = SkeletonMesh;

File diff suppressed because it is too large
+ 0 - 0
spine-ts/build/spine-threejs.js.map


+ 5 - 5
spine-ts/build/spine-webgl.js

@@ -2001,6 +2001,7 @@ var spine;
 			path = this.pathPrefix + path;
 			path = this.pathPrefix + path;
 			this.toLoad++;
 			this.toLoad++;
 			AssetManager.downloadText(path, function (atlasData) {
 			AssetManager.downloadText(path, function (atlasData) {
+				var pagesLoaded = { count: 0 };
 				var atlasPages = new Array();
 				var atlasPages = new Array();
 				try {
 				try {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2021,11 +2022,10 @@ var spine;
 					return;
 					return;
 				}
 				}
 				var _loop_1 = function (atlasPage) {
 				var _loop_1 = function (atlasPage) {
-					var pagesLoaded = 0;
 					var pageLoadError = false;
 					var pageLoadError = false;
 					_this.loadTexture(atlasPage, function (imagePath, image) {
 					_this.loadTexture(atlasPage, function (imagePath, image) {
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							if (!pageLoadError) {
 							if (!pageLoadError) {
 								try {
 								try {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2056,8 +2056,8 @@ var spine;
 						}
 						}
 					}, function (imagePath, errorMessage) {
 					}, function (imagePath, errorMessage) {
 						pageLoadError = true;
 						pageLoadError = true;
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							if (error)
 							if (error)
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);

File diff suppressed because it is too large
+ 0 - 0
spine-ts/build/spine-webgl.js.map


+ 5 - 5
spine-ts/build/spine-widget.js

@@ -2001,6 +2001,7 @@ var spine;
 			path = this.pathPrefix + path;
 			path = this.pathPrefix + path;
 			this.toLoad++;
 			this.toLoad++;
 			AssetManager.downloadText(path, function (atlasData) {
 			AssetManager.downloadText(path, function (atlasData) {
+				var pagesLoaded = { count: 0 };
 				var atlasPages = new Array();
 				var atlasPages = new Array();
 				try {
 				try {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
 					var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2021,11 +2022,10 @@ var spine;
 					return;
 					return;
 				}
 				}
 				var _loop_1 = function (atlasPage) {
 				var _loop_1 = function (atlasPage) {
-					var pagesLoaded = 0;
 					var pageLoadError = false;
 					var pageLoadError = false;
 					_this.loadTexture(atlasPage, function (imagePath, image) {
 					_this.loadTexture(atlasPage, function (imagePath, image) {
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							if (!pageLoadError) {
 							if (!pageLoadError) {
 								try {
 								try {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
 									var atlas = new spine.TextureAtlas(atlasData, function (path) {
@@ -2056,8 +2056,8 @@ var spine;
 						}
 						}
 					}, function (imagePath, errorMessage) {
 					}, function (imagePath, errorMessage) {
 						pageLoadError = true;
 						pageLoadError = true;
-						pagesLoaded++;
-						if (pagesLoaded == atlasPages.length) {
+						pagesLoaded.count++;
+						if (pagesLoaded.count == atlasPages.length) {
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
 							if (error)
 							if (error)
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
 								error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);

File diff suppressed because it is too large
+ 0 - 0
spine-ts/build/spine-widget.js.map


+ 5 - 5
spine-ts/core/src/AssetManager.ts

@@ -147,6 +147,7 @@ module spine {
 			this.toLoad++;
 			this.toLoad++;
 
 
 			AssetManager.downloadText(path, (atlasData: string): void => {
 			AssetManager.downloadText(path, (atlasData: string): void => {
+				var pagesLoaded: any = { count: 0 };
 				var atlasPages = new Array<string>();
 				var atlasPages = new Array<string>();
 				try {
 				try {
 					let atlas = new spine.TextureAtlas(atlasData, (path: string) => {
 					let atlas = new spine.TextureAtlas(atlasData, (path: string) => {
@@ -166,12 +167,11 @@ module spine {
 				}
 				}
 
 
 				for (let atlasPage of atlasPages) {
 				for (let atlasPage of atlasPages) {
-					let pagesLoaded = 0;
 					let pageLoadError = false;
 					let pageLoadError = false;
 					this.loadTexture(atlasPage, (imagePath: string, image: HTMLImageElement) => {
 					this.loadTexture(atlasPage, (imagePath: string, image: HTMLImageElement) => {
-						pagesLoaded++;
+						pagesLoaded.count++;
 
 
-						if (pagesLoaded == atlasPages.length) {
+						if (pagesLoaded.count == atlasPages.length) {
 							if (!pageLoadError) {
 							if (!pageLoadError) {
 								try {
 								try {
 									let atlas = new spine.TextureAtlas(atlasData, (path: string) => {
 									let atlas = new spine.TextureAtlas(atlasData, (path: string) => {
@@ -197,9 +197,9 @@ module spine {
 						}
 						}
 					}, (imagePath: string, errorMessage: string) => {
 					}, (imagePath: string, errorMessage: string) => {
 						pageLoadError = true;
 						pageLoadError = true;
-						pagesLoaded++;
+						pagesLoaded.count++;
 
 
-						if (pagesLoaded == atlasPages.length) {
+						if (pagesLoaded.count == atlasPages.length) {
 							this.errors[path] = `Couldn't load texture atlas page ${imagePath}} of atlas ${path}`;
 							this.errors[path] = `Couldn't load texture atlas page ${imagePath}} of atlas ${path}`;
 							if (error) error(path, `Couldn't load texture atlas page ${imagePath} of atlas ${path}`);
 							if (error) error(path, `Couldn't load texture atlas page ${imagePath} of atlas ${path}`);
 							this.toLoad--;
 							this.toLoad--;

+ 20 - 28
spine-ts/threejs/example/index.html

@@ -19,6 +19,11 @@ var assetManager;
 var canvas;
 var canvas;
 var lastFrameTime = Date.now() / 1000;
 var lastFrameTime = Date.now() / 1000;
 
 
+var baseUrl = "assets/";
+var skeletonFile = "raptor-pro.json";
+var atlasFile = skeletonFile.replace("-pro", "").replace("-ess", "").replace(".json", ".atlas");
+var animation = "walk";
+
 function init () {
 function init () {
 	// create the THREE.JS camera, scene and renderer (WebGL)
 	// create the THREE.JS camera, scene and renderer (WebGL)
 	var width = window.innerWidth, height = window.innerHeight;
 	var width = window.innerWidth, height = window.innerHeight;
@@ -32,10 +37,9 @@ function init () {
 	canvas = renderer.domElement;
 	canvas = renderer.domElement;
 
 
 	// load the assets required to display the Raptor model
 	// load the assets required to display the Raptor model
-	assetManager = new spine.threejs.AssetManager();
-	assetManager.loadText("assets/raptor-pro.json");
-	assetManager.loadText("assets/raptor.atlas");
-	assetManager.loadTexture("assets/raptor.png");
+	assetManager = new spine.threejs.AssetManager(baseUrl);
+	assetManager.loadText(skeletonFile);
+	assetManager.loadTextureAtlas(atlasFile);
 
 
 	requestAnimationFrame(load);
 	requestAnimationFrame(load);
 }
 }
@@ -50,39 +54,27 @@ function load (name, scale) {
 
 
 		// Load the texture atlas using name.atlas and name.png from the AssetManager.
 		// Load the texture atlas using name.atlas and name.png from the AssetManager.
 		// The function passed to TextureAtlas is used to resolve relative paths.
 		// The function passed to TextureAtlas is used to resolve relative paths.
-		atlas = new spine.TextureAtlas(assetManager.get("assets/raptor.atlas"), function(path) {
-			return assetManager.get("assets/" + path);
-		});
-		var skeletonData = loadSkeleton("raptor-pro", 0.4);
+		atlas = assetManager.get(atlasFile);
+
+		// Create a AtlasAttachmentLoader that resolves region, mesh, boundingbox and path attachments
+		atlasLoader = new spine.AtlasAttachmentLoader(atlas);
+
+		// Create a SkeletonJson instance for parsing the .json file.
+		var skeletonJson = new spine.SkeletonJson(atlasLoader);
+
+		// Set the scale to apply during parsing, parse the file, and create a new skeleton.
+		skeletonJson.scale = 0.4;
+		var skeletonData = skeletonJson.readSkeletonData(assetManager.get(skeletonFile));
 
 
 		// Create a SkeletonMesh from the data and attach it to the scene
 		// Create a SkeletonMesh from the data and attach it to the scene
 		skeletonMesh = new spine.threejs.SkeletonMesh(skeletonData);
 		skeletonMesh = new spine.threejs.SkeletonMesh(skeletonData);
-		skeletonMesh.state.setAnimation(0, "walk", true);
+		skeletonMesh.state.setAnimation(0, animation, true);
 		mesh.add(skeletonMesh);
 		mesh.add(skeletonMesh);
 
 
 		requestAnimationFrame(render);
 		requestAnimationFrame(render);
 	} else requestAnimationFrame(load);
 	} else requestAnimationFrame(load);
 }
 }
 
 
-function loadSkeleton (name, scale) {
-	// Load the texture atlas using name.atlas and name.png from the AssetManager.
-	// The function passed to TextureAtlas is used to resolve relative paths.
-	atlas = new spine.TextureAtlas(assetManager.get("assets/" + name.replace("-pro", "") + ".atlas"), function(path) {
-		return assetManager.get("assets/" + path);
-	});
-
-	// Create a AtlasAttachmentLoader that resolves region, mesh, boundingbox and path attachments
-	atlasLoader = new spine.AtlasAttachmentLoader(atlas);
-
-	// Create a SkeletonJson instance for parsing the .json file.
-	var skeletonJson = new spine.SkeletonJson(atlasLoader);
-
-	// Set the scale to apply during parsing, parse the file, and create a new skeleton.
-	skeletonJson.scale = scale;
-	var skeletonData = skeletonJson.readSkeletonData(assetManager.get("assets/" + name + ".json"));
-	return skeletonData;
-}
-
 var lastTime = Date.now();
 var lastTime = Date.now();
 function render() {
 function render() {
 	// calculate delta time for animation purposes
 	// calculate delta time for animation purposes

+ 19 - 8
spine-ts/threejs/src/MeshBatcher.ts

@@ -29,9 +29,7 @@
  *****************************************************************************/
  *****************************************************************************/
 
 
 module spine.threejs {
 module spine.threejs {
-	export class MeshBatcher {
-		mesh: THREE.Mesh;
-
+	export class MeshBatcher extends THREE.Mesh {
 		private static VERTEX_SIZE = 9;
 		private static VERTEX_SIZE = 9;
 		private vertexBuffer: THREE.InterleavedBuffer;
 		private vertexBuffer: THREE.InterleavedBuffer;
 		private vertices: Float32Array;
 		private vertices: Float32Array;
@@ -39,12 +37,11 @@ module spine.threejs {
 		private indices: Uint16Array;
 		private indices: Uint16Array;
 		private indicesLength = 0;
 		private indicesLength = 0;
 
 
-		constructor (mesh: THREE.Mesh, maxVertices: number = 10920) {
+		constructor (maxVertices: number = 10920) {
+			super();
 			if (maxVertices > 10920) throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices);
 			if (maxVertices > 10920) throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices);
-
 			let vertices = this.vertices = new Float32Array(maxVertices * MeshBatcher.VERTEX_SIZE);
 			let vertices = this.vertices = new Float32Array(maxVertices * MeshBatcher.VERTEX_SIZE);
 			let indices = this.indices = new Uint16Array(maxVertices * 3);
 			let indices = this.indices = new Uint16Array(maxVertices * 3);
-			this.mesh = mesh;
 			let geo = new THREE.BufferGeometry();
 			let geo = new THREE.BufferGeometry();
 			let vertexBuffer = this.vertexBuffer = new THREE.InterleavedBuffer(vertices, MeshBatcher.VERTEX_SIZE);
 			let vertexBuffer = this.vertexBuffer = new THREE.InterleavedBuffer(vertices, MeshBatcher.VERTEX_SIZE);
 			vertexBuffer.dynamic = true;
 			vertexBuffer.dynamic = true;
@@ -55,7 +52,15 @@ module spine.threejs {
 			geo.getIndex().dynamic = true;
 			geo.getIndex().dynamic = true;
 			geo.drawRange.start = 0;
 			geo.drawRange.start = 0;
 			geo.drawRange.count = 0;
 			geo.drawRange.count = 0;
-			mesh.geometry = geo;
+			this.geometry = geo;
+			this.material = new SkeletonMeshMaterial();
+		}
+
+		clear () {
+			let geo = (<THREE.BufferGeometry>this.geometry);
+			geo.drawRange.start = 0;
+			geo.drawRange.count = 0;
+			(<SkeletonMeshMaterial>this.material).uniforms.map.value = null;
 		}
 		}
 
 
 		begin () {
 		begin () {
@@ -63,6 +68,12 @@ module spine.threejs {
 			this.indicesLength = 0;
 			this.indicesLength = 0;
 		}
 		}
 
 
+		canBatch(verticesLength: number, indicesLength: number) {
+			if (this.indicesLength + indicesLength >= this.indices.byteLength / 2) return false;
+			if (this.verticesLength + verticesLength >= this.vertices.byteLength / 2) return false;
+			return true;
+		}
+
 		batch (vertices: ArrayLike<number>, verticesLength: number, indices: ArrayLike<number>, indicesLength: number, z: number = 0) {
 		batch (vertices: ArrayLike<number>, verticesLength: number, indices: ArrayLike<number>, indicesLength: number, z: number = 0) {
 			let indexStart = this.verticesLength / MeshBatcher.VERTEX_SIZE;
 			let indexStart = this.verticesLength / MeshBatcher.VERTEX_SIZE;
 			let vertexBuffer = this.vertices;
 			let vertexBuffer = this.vertices;
@@ -91,7 +102,7 @@ module spine.threejs {
 			this.vertexBuffer.needsUpdate = true;
 			this.vertexBuffer.needsUpdate = true;
 			this.vertexBuffer.updateRange.offset = 0;
 			this.vertexBuffer.updateRange.offset = 0;
 			this.vertexBuffer.updateRange.count = this.verticesLength;
 			this.vertexBuffer.updateRange.count = this.verticesLength;
-			let geo = (<THREE.BufferGeometry>this.mesh.geometry);
+			let geo = (<THREE.BufferGeometry>this.geometry);
 			geo.getIndex().needsUpdate = true;
 			geo.getIndex().needsUpdate = true;
 			geo.getIndex().updateRange.offset = 0;
 			geo.getIndex().updateRange.offset = 0;
 			geo.getIndex().updateRange.count = this.indicesLength;
 			geo.getIndex().updateRange.count = this.indicesLength;

+ 110 - 27
spine-ts/threejs/src/SkeletonMesh.ts

@@ -29,7 +29,42 @@
  *****************************************************************************/
  *****************************************************************************/
 
 
 module spine.threejs {
 module spine.threejs {
-	export class SkeletonMesh extends THREE.Mesh {
+	export class SkeletonMeshMaterial extends THREE.ShaderMaterial {
+		constructor () {
+			let vertexShader = `
+				attribute vec4 color;
+				varying vec2 vUv;
+				varying vec4 vColor;
+				void main() {
+					vUv = uv;
+					vColor = color;
+					gl_Position = projectionMatrix*modelViewMatrix*vec4(position,1.0);
+				}
+			`;
+			let fragmentShader = `
+				uniform sampler2D map;
+				varying vec2 vUv;
+				varying vec4 vColor;
+				void main(void) {
+					gl_FragColor = texture2D(map, vUv)*vColor;
+				}
+			`;
+
+			let parameters: THREE.ShaderMaterialParameters = {
+				uniforms: {
+					map: { type: "t", value: null }
+				},
+				vertexShader: vertexShader,
+				fragmentShader: fragmentShader,
+				side: THREE.DoubleSide,
+				transparent: true,
+				alphaTest: 0.5
+			};
+			super(parameters);
+		};
+	}
+
+	export class SkeletonMesh extends THREE.Object3D {
 		tempPos: Vector2 = new Vector2();
 		tempPos: Vector2 = new Vector2();
 		tempUv: Vector2 = new Vector2();
 		tempUv: Vector2 = new Vector2();
 		tempLight = new Color();
 		tempLight = new Color();
@@ -39,7 +74,8 @@ module spine.threejs {
 		zOffset: number = 0.1;
 		zOffset: number = 0.1;
 		vertexEffect: VertexEffect;
 		vertexEffect: VertexEffect;
 
 
-		private batcher: MeshBatcher;
+		private batches = new Array<MeshBatcher>();
+		private nextBatchIndex = 0;
 		private clipper: SkeletonClipping = new SkeletonClipping();
 		private clipper: SkeletonClipping = new SkeletonClipping();
 
 
 		static QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
 		static QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
@@ -54,12 +90,6 @@ module spine.threejs {
 			this.skeleton = new Skeleton(skeletonData);
 			this.skeleton = new Skeleton(skeletonData);
 			let animData = new AnimationStateData(skeletonData);
 			let animData = new AnimationStateData(skeletonData);
 			this.state = new AnimationState(animData);
 			this.state = new AnimationState(animData);
-
-			let material = this.material = new THREE.MeshBasicMaterial();
-			material.side = THREE.DoubleSide;
-			material.transparent = true;
-			material.alphaTest = 0.5;
-			this.batcher = new MeshBatcher(this);
 		}
 		}
 
 
 		update(deltaTime: number) {
 		update(deltaTime: number) {
@@ -73,13 +103,33 @@ module spine.threejs {
 			this.updateGeometry();
 			this.updateGeometry();
 		}
 		}
 
 
+		private clearBatches () {
+			for (var i = 0; i < this.batches.length; i++) {
+				this.batches[i].clear();
+				this.batches[i].visible = false;
+			}
+			this.nextBatchIndex = 0;
+		}
+
+		private nextBatch () {
+			if (this.batches.length == this.nextBatchIndex) {
+				let batch = new MeshBatcher();
+				this.add(batch);
+				this.batches.push(batch);
+			}
+			let batch = this.batches[this.nextBatchIndex++];
+			batch.visible = true;
+			return batch;
+		}
+
 		private updateGeometry() {
 		private updateGeometry() {
+			this.clearBatches();
+
 			let tempPos = this.tempPos;
 			let tempPos = this.tempPos;
 			let tempUv = this.tempUv;
 			let tempUv = this.tempUv;
 			let tempLight = this.tempLight;
 			let tempLight = this.tempLight;
 			let tempDark = this.tempDark;
 			let tempDark = this.tempDark;
 
 
-			let geometry = <THREE.BufferGeometry>this.geometry;
 			var numVertices = 0;
 			var numVertices = 0;
 			var verticesLength = 0;
 			var verticesLength = 0;
 			var indicesLength = 0;
 			var indicesLength = 0;
@@ -91,8 +141,8 @@ module spine.threejs {
 			let triangles: Array<number> = null;
 			let triangles: Array<number> = null;
 			let uvs: ArrayLike<number> = null;
 			let uvs: ArrayLike<number> = null;
 			let drawOrder = this.skeleton.drawOrder;
 			let drawOrder = this.skeleton.drawOrder;
-			let batcher = this.batcher;
-			batcher.begin();
+			let batch = this.nextBatch();
+			batch.begin();
 			let z = 0;
 			let z = 0;
 			let zOffset = this.zOffset;
 			let zOffset = this.zOffset;
 			for (let i = 0, n = drawOrder.length; i < n; i++) {
 			for (let i = 0, n = drawOrder.length; i < n; i++) {
@@ -130,12 +180,6 @@ module spine.threejs {
 				} else continue;
 				} else continue;
 
 
 				if (texture != null) {
 				if (texture != null) {
-					if (!(<THREE.MeshBasicMaterial>this.material).map) {
-						let mat = <THREE.MeshBasicMaterial>this.material;
-						mat.map = texture.texture;
-						mat.needsUpdate = true;
-					}
-
 					let skeleton = slot.bone.skeleton;
 					let skeleton = slot.bone.skeleton;
 					let skeletonColor = skeleton.color;
 					let skeletonColor = skeleton.color;
 					let slotColor = slot.color;
 					let slotColor = slot.color;
@@ -145,12 +189,11 @@ module spine.threejs {
 							skeletonColor.g * slotColor.g * attachmentColor.g,
 							skeletonColor.g * slotColor.g * attachmentColor.g,
 							skeletonColor.b * slotColor.b * attachmentColor.b,
 							skeletonColor.b * slotColor.b * attachmentColor.b,
 							alpha);
 							alpha);
-					// FIXME per slot blending would require multiple material support
-					//let slotBlendMode = slot.data.blendMode;
-					//if (slotBlendMode != blendMode) {
-					//	blendMode = slotBlendMode;
-					//	batcher.setBlendMode(getSourceGLBlendMode(this._gl, blendMode, premultipliedAlpha), getDestGLBlendMode(this._gl, blendMode));
-					//}
+
+					let finalVertices: ArrayLike<number>;
+					let finalVerticesLength: number;
+					let finalIndices: ArrayLike<number>;
+					let finalIndicesLength: number;
 
 
 					if (clipper.isClipping()) {
 					if (clipper.isClipping()) {
 						clipper.clipTriangles(vertices, numFloats, triangles, triangles.length, uvs, color, null, false);
 						clipper.clipTriangles(vertices, numFloats, triangles, triangles.length, uvs, color, null, false);
@@ -177,7 +220,10 @@ module spine.threejs {
 								verts[v + 7] = tempUv.y;
 								verts[v + 7] = tempUv.y;
 							}
 							}
 						}
 						}
-						batcher.batch(clippedVertices, clippedVertices.length, clippedTriangles, clippedTriangles.length, z);
+						finalVertices = clippedVertices;
+						finalVerticesLength = clippedVertices.length;
+						finalIndices = clippedTriangles;
+						finalIndicesLength = clippedTriangles.length;
 					} else {
 					} else {
 						let verts = vertices;
 						let verts = vertices;
 						if (this.vertexEffect != null) {
 						if (this.vertexEffect != null) {
@@ -209,13 +255,50 @@ module spine.threejs {
 								verts[v + 5] = uvs[u + 1];
 								verts[v + 5] = uvs[u + 1];
 							}
 							}
 						}
 						}
-						batcher.batch(vertices, numFloats, triangles, triangles.length, z);
+						finalVertices = vertices;
+						finalVerticesLength = numFloats;
+						finalIndices = triangles;
+						finalIndicesLength = triangles.length;
+					}
+
+					if (finalVerticesLength == 0 || finalIndicesLength == 0)
+						continue;
+
+					// Start new batch if this one can't hold vertices/indices
+					if (!batch.canBatch(finalVerticesLength, finalIndicesLength)) {
+						batch.end();
+						batch = this.nextBatch();
+						batch.begin();
 					}
 					}
+
+					// FIXME per slot blending would require multiple material support
+					//let slotBlendMode = slot.data.blendMode;
+					//if (slotBlendMode != blendMode) {
+					//	blendMode = slotBlendMode;
+					//	batcher.setBlendMode(getSourceGLBlendMode(this._gl, blendMode, premultipliedAlpha), getDestGLBlendMode(this._gl, blendMode));
+					//}
+
+					let batchMaterial = <SkeletonMeshMaterial>batch.material;
+					if (batchMaterial.uniforms.map.value == null) {
+						batchMaterial.uniforms.map.value = texture.texture;
+					}
+					if (batchMaterial.uniforms.map.value != texture.texture) {
+						batch.end();
+						batch = this.nextBatch();
+						batch.begin();
+						batchMaterial = <SkeletonMeshMaterial>batch.material;
+						batchMaterial.uniforms.map.value = texture.texture;
+					}
+					batchMaterial.needsUpdate = true;
+
+					batch.batch(finalVertices, finalVerticesLength, finalIndices, finalIndicesLength, z);
 					z += zOffset;
 					z += zOffset;
 				}
 				}
-			}
 
 
-			batcher.end();
+				clipper.clipEndWithSlot(slot);
+			}
+			clipper.clipEnd();
+			batch.end();
 		}
 		}
 	}
 	}
 }
 }

+ 130 - 2
spine-unity/Assets/Examples/Getting Started/2 Controlling Animation.unity

@@ -317,7 +317,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: d247ba06193faa74d9335f5481b2b56c, type: 3}
   m_Script: {fileID: 11500000, guid: d247ba06193faa74d9335f5481b2b56c, type: 3}
   m_Name: 
   m_Name: 
   m_EditorClassIdentifier: 
   m_EditorClassIdentifier: 
-  skeletonDataAsset: {fileID: 11400000, guid: 45a15bf53b040de42b2adbc759a40203, type: 2}
+  skeletonDataAsset: {fileID: 11400000, guid: af38a3de26ed9b84abc2fe7c7f3b209d, type: 2}
   initialSkinName: default
   initialSkinName: default
   initialFlipX: 0
   initialFlipX: 0
   initialFlipY: 0
   initialFlipY: 0
@@ -349,7 +349,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_Materials:
   m_Materials:
-  - {fileID: 2100000, guid: 86873d92b9c6412428e6e2d4f827c88b, type: 2}
+  - {fileID: 2100000, guid: f89bbf05902e77242a3ad20f3c927353, type: 2}
   m_StaticBatchInfo:
   m_StaticBatchInfo:
     firstSubMesh: 0
     firstSubMesh: 0
     subMeshCount: 0
     subMeshCount: 0
@@ -434,8 +434,136 @@ Transform:
   - {fileID: 199409355}
   - {fileID: 199409355}
   - {fileID: 1945923979}
   - {fileID: 1945923979}
   m_Father: {fileID: 0}
   m_Father: {fileID: 0}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1803774489
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1803774490}
+  - component: {fileID: 1803774492}
+  - component: {fileID: 1803774491}
+  m_Layer: 0
+  m_Name: sound
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1803774490
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1803774489}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: -3.9, y: -3.3, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
   m_RootOrder: 2
   m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!82 &1803774491
+AudioSource:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1803774489}
+  m_Enabled: 1
+  serializedVersion: 4
+  OutputAudioMixerGroup: {fileID: 0}
+  m_audioClip: {fileID: 0}
+  m_PlayOnAwake: 1
+  m_Volume: 0.2
+  m_Pitch: 1
+  Loop: 0
+  Mute: 0
+  Spatialize: 0
+  SpatializePostEffects: 0
+  Priority: 128
+  DopplerLevel: 1
+  MinDistance: 1
+  MaxDistance: 500
+  Pan2D: 0
+  rolloffMode: 0
+  BypassEffects: 0
+  BypassListenerEffects: 0
+  BypassReverbZones: 0
+  rolloffCustomCurve:
+    serializedVersion: 2
+    m_Curve:
+    - serializedVersion: 2
+      time: 0
+      value: 1
+      inSlope: 0
+      outSlope: 0
+      tangentMode: 0
+    - serializedVersion: 2
+      time: 1
+      value: 0
+      inSlope: 0
+      outSlope: 0
+      tangentMode: 0
+    m_PreInfinity: 2
+    m_PostInfinity: 2
+    m_RotationOrder: 4
+  panLevelCustomCurve:
+    serializedVersion: 2
+    m_Curve:
+    - serializedVersion: 2
+      time: 0
+      value: 0
+      inSlope: 0
+      outSlope: 0
+      tangentMode: 0
+    m_PreInfinity: 2
+    m_PostInfinity: 2
+    m_RotationOrder: 0
+  spreadCustomCurve:
+    serializedVersion: 2
+    m_Curve:
+    - serializedVersion: 2
+      time: 0
+      value: 0
+      inSlope: 0
+      outSlope: 0
+      tangentMode: 0
+    m_PreInfinity: 2
+    m_PostInfinity: 2
+    m_RotationOrder: 0
+  reverbZoneMixCustomCurve:
+    serializedVersion: 2
+    m_Curve:
+    - serializedVersion: 2
+      time: 0
+      value: 1
+      inSlope: 0
+      outSlope: 0
+      tangentMode: 0
+    m_PreInfinity: 2
+    m_PostInfinity: 2
+    m_RotationOrder: 0
+--- !u!114 &1803774492
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1803774489}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1d55a3bd6ac81af44b2f9a4447f2ae72, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  skeletonAnimation: {fileID: 816033310}
+  eventName: footstep
+  audioSource: {fileID: 1803774491}
+  audioClip: {fileID: 8300000, guid: e885484e1bc99fb47a0ac3f6bfa586b1, type: 3}
+  basePitch: 1.4
+  randomPitchOffset: 0.1
+  logDebugMessage: 1
 --- !u!1 &1945923976
 --- !u!1 &1945923976
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0

+ 137 - 66
spine-unity/Assets/Examples/Getting Started/3 Controlling Animation Continued.unity

@@ -1,19 +1,19 @@
 %YAML 1.1
 %YAML 1.1
 %TAG !u! tag:unity3d.com,2011:
 %TAG !u! tag:unity3d.com,2011:
 --- !u!29 &1
 --- !u!29 &1
-SceneSettings:
+OcclusionCullingSettings:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
-  m_PVSData: 
-  m_PVSObjectsArray: []
-  m_PVSPortalsArray: []
+  serializedVersion: 2
   m_OcclusionBakeSettings:
   m_OcclusionBakeSettings:
     smallestOccluder: 5
     smallestOccluder: 5
     smallestHole: 0.25
     smallestHole: 0.25
     backfaceThreshold: 100
     backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
 --- !u!104 &2
 --- !u!104 &2
 RenderSettings:
 RenderSettings:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
-  serializedVersion: 6
+  serializedVersion: 8
   m_Fog: 0
   m_Fog: 0
   m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
   m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
   m_FogMode: 3
   m_FogMode: 3
@@ -25,6 +25,7 @@ RenderSettings:
   m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
   m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
   m_AmbientIntensity: 1
   m_AmbientIntensity: 1
   m_AmbientMode: 3
   m_AmbientMode: 3
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
   m_SkyboxMaterial: {fileID: 0}
   m_SkyboxMaterial: {fileID: 0}
   m_HaloStrength: 0.5
   m_HaloStrength: 0.5
   m_FlareStrength: 1
   m_FlareStrength: 1
@@ -37,12 +38,12 @@ RenderSettings:
   m_ReflectionIntensity: 1
   m_ReflectionIntensity: 1
   m_CustomReflection: {fileID: 0}
   m_CustomReflection: {fileID: 0}
   m_Sun: {fileID: 0}
   m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
 --- !u!157 &4
 --- !u!157 &4
 LightmapSettings:
 LightmapSettings:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
-  serializedVersion: 6
+  serializedVersion: 9
   m_GIWorkflowMode: 1
   m_GIWorkflowMode: 1
-  m_LightmapsMode: 1
   m_GISettings:
   m_GISettings:
     serializedVersion: 2
     serializedVersion: 2
     m_BounceScale: 1
     m_BounceScale: 1
@@ -53,46 +54,68 @@ LightmapSettings:
     m_EnableBakedLightmaps: 1
     m_EnableBakedLightmaps: 1
     m_EnableRealtimeLightmaps: 0
     m_EnableRealtimeLightmaps: 0
   m_LightmapEditorSettings:
   m_LightmapEditorSettings:
-    serializedVersion: 3
+    serializedVersion: 8
     m_Resolution: 1
     m_Resolution: 1
     m_BakeResolution: 50
     m_BakeResolution: 50
     m_TextureWidth: 1024
     m_TextureWidth: 1024
     m_TextureHeight: 1024
     m_TextureHeight: 1024
+    m_AO: 0
     m_AOMaxDistance: 1
     m_AOMaxDistance: 1
-    m_Padding: 2
     m_CompAOExponent: 0
     m_CompAOExponent: 0
+    m_CompAOExponentDirect: 0
+    m_Padding: 2
     m_LightmapParameters: {fileID: 0}
     m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
     m_TextureCompression: 0
     m_TextureCompression: 0
     m_FinalGather: 0
     m_FinalGather: 0
+    m_FinalGatherFiltering: 1
     m_FinalGatherRayCount: 1024
     m_FinalGatherRayCount: 1024
     m_ReflectionCompression: 2
     m_ReflectionCompression: 2
+    m_MixedBakeMode: 1
+    m_BakeBackend: 0
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 500
+    m_PVRBounces: 2
+    m_PVRFiltering: 0
+    m_PVRFilteringMode: 1
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousColorSigma: 1
+    m_PVRFilteringAtrousNormalSigma: 1
+    m_PVRFilteringAtrousPositionSigma: 1
   m_LightingDataAsset: {fileID: 0}
   m_LightingDataAsset: {fileID: 0}
-  m_RuntimeCPUUsage: 25
+  m_ShadowMaskMode: 2
 --- !u!196 &5
 --- !u!196 &5
 NavMeshSettings:
 NavMeshSettings:
   serializedVersion: 2
   serializedVersion: 2
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_BuildSettings:
   m_BuildSettings:
     serializedVersion: 2
     serializedVersion: 2
+    agentTypeID: 0
     agentRadius: 0.5
     agentRadius: 0.5
     agentHeight: 2
     agentHeight: 2
     agentSlope: 45
     agentSlope: 45
     agentClimb: 0.4
     agentClimb: 0.4
     ledgeDropHeight: 0
     ledgeDropHeight: 0
     maxJumpAcrossDistance: 0
     maxJumpAcrossDistance: 0
-    accuratePlacement: 0
     minRegionArea: 2
     minRegionArea: 2
-    cellSize: 0.16666666
     manualCellSize: 0
     manualCellSize: 0
+    cellSize: 0.16666666
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
   m_NavMeshData: {fileID: 0}
   m_NavMeshData: {fileID: 0}
 --- !u!1 &654881619
 --- !u!1 &654881619
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
-  serializedVersion: 4
+  serializedVersion: 5
   m_Component:
   m_Component:
-  - 4: {fileID: 654881620}
+  - component: {fileID: 654881620}
   m_Layer: 0
   m_Layer: 0
   m_Name: LABELS
   m_Name: LABELS
   m_TagString: Untagged
   m_TagString: Untagged
@@ -114,16 +137,17 @@ Transform:
   - {fileID: 1551895947}
   - {fileID: 1551895947}
   m_Father: {fileID: 0}
   m_Father: {fileID: 0}
   m_RootOrder: 2
   m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &796033498
 --- !u!1 &796033498
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
-  serializedVersion: 4
+  serializedVersion: 5
   m_Component:
   m_Component:
-  - 4: {fileID: 796033499}
-  - 23: {fileID: 796033501}
-  - 102: {fileID: 796033500}
+  - component: {fileID: 796033499}
+  - component: {fileID: 796033501}
+  - component: {fileID: 796033500}
   m_Layer: 0
   m_Layer: 0
   m_Name: Description
   m_Name: Description
   m_TagString: Untagged
   m_TagString: Untagged
@@ -143,6 +167,7 @@ Transform:
   m_Children: []
   m_Children: []
   m_Father: {fileID: 654881620}
   m_Father: {fileID: 654881620}
   m_RootOrder: 0
   m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!102 &796033500
 --- !u!102 &796033500
 TextMesh:
 TextMesh:
   serializedVersion: 3
   serializedVersion: 3
@@ -157,12 +182,7 @@ TextMesh:
 
 
     At the same time, and in its own timeframe,
     At the same time, and in its own timeframe,
 
 
-    the "gungrab" and "gunkeep" animations are playing.
-
-
-    It also shows how to use Spine Events to add sounds
-
-    to your animation.'
+    the "gungrab" and "gunkeep" animations are playing.'
   m_OffsetZ: 0
   m_OffsetZ: 0
   m_CharacterSize: 0.12
   m_CharacterSize: 0.12
   m_LineSpacing: 1
   m_LineSpacing: 1
@@ -185,35 +205,42 @@ MeshRenderer:
   m_Enabled: 1
   m_Enabled: 1
   m_CastShadows: 1
   m_CastShadows: 1
   m_ReceiveShadows: 1
   m_ReceiveShadows: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
   m_Materials:
   m_Materials:
   - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0}
   - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0}
-  m_SubsetIndices: 
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
   m_StaticBatchRoot: {fileID: 0}
   m_StaticBatchRoot: {fileID: 0}
-  m_UseLightProbes: 1
-  m_ReflectionProbeUsage: 1
   m_ProbeAnchor: {fileID: 0}
   m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
   m_ScaleInLightmap: 1
   m_ScaleInLightmap: 1
   m_PreserveUVs: 0
   m_PreserveUVs: 0
   m_IgnoreNormalsForChartDetection: 0
   m_IgnoreNormalsForChartDetection: 0
   m_ImportantGI: 0
   m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
   m_MinimumChartSize: 4
   m_MinimumChartSize: 4
   m_AutoUVMaxDistance: 0.5
   m_AutoUVMaxDistance: 0.5
   m_AutoUVMaxAngle: 89
   m_AutoUVMaxAngle: 89
   m_LightmapParameters: {fileID: 0}
   m_LightmapParameters: {fileID: 0}
   m_SortingLayerID: 0
   m_SortingLayerID: 0
+  m_SortingLayer: 0
   m_SortingOrder: 0
   m_SortingOrder: 0
 --- !u!1 &1256911793
 --- !u!1 &1256911793
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
-  serializedVersion: 4
+  serializedVersion: 5
   m_Component:
   m_Component:
-  - 4: {fileID: 1256911797}
-  - 33: {fileID: 1256911796}
-  - 23: {fileID: 1256911795}
-  - 114: {fileID: 1256911794}
-  - 114: {fileID: 1256911799}
+  - component: {fileID: 1256911797}
+  - component: {fileID: 1256911796}
+  - component: {fileID: 1256911795}
+  - component: {fileID: 1256911794}
+  - component: {fileID: 1256911799}
+  - component: {fileID: 1256911798}
   m_Layer: 0
   m_Layer: 0
   m_Name: raptor Skeleton
   m_Name: raptor Skeleton
   m_TagString: Untagged
   m_TagString: Untagged
@@ -234,14 +261,18 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_EditorClassIdentifier: 
   skeletonDataAsset: {fileID: 11400000, guid: 22c4b5e5a0fd9484d83b1aa705b9a54c, type: 2}
   skeletonDataAsset: {fileID: 11400000, guid: 22c4b5e5a0fd9484d83b1aa705b9a54c, type: 2}
   initialSkinName: default
   initialSkinName: default
+  initialFlipX: 0
+  initialFlipY: 0
   separatorSlotNames: []
   separatorSlotNames: []
   zSpacing: 0
   zSpacing: 0
-  renderMeshes: 1
+  useClipping: 1
   immutableTriangles: 0
   immutableTriangles: 0
   pmaVertexColors: 1
   pmaVertexColors: 1
-  calculateNormals: 0
+  clearStateOnDisable: 0
+  tintBlack: 0
+  singleSubmesh: 0
+  addNormals: 0
   calculateTangents: 0
   calculateTangents: 0
-  frontFacing: 0
   logErrors: 0
   logErrors: 0
   disableRenderingOnOverride: 1
   disableRenderingOnOverride: 1
   _animationName: 
   _animationName: 
@@ -256,22 +287,28 @@ MeshRenderer:
   m_Enabled: 1
   m_Enabled: 1
   m_CastShadows: 0
   m_CastShadows: 0
   m_ReceiveShadows: 0
   m_ReceiveShadows: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 0
+  m_ReflectionProbeUsage: 1
   m_Materials:
   m_Materials:
   - {fileID: 2100000, guid: 4e2feebfcaa26a54ab19f1ff3e0eae35, type: 2}
   - {fileID: 2100000, guid: 4e2feebfcaa26a54ab19f1ff3e0eae35, type: 2}
-  m_SubsetIndices: 
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
   m_StaticBatchRoot: {fileID: 0}
   m_StaticBatchRoot: {fileID: 0}
-  m_UseLightProbes: 0
-  m_ReflectionProbeUsage: 1
   m_ProbeAnchor: {fileID: 0}
   m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
   m_ScaleInLightmap: 1
   m_ScaleInLightmap: 1
   m_PreserveUVs: 0
   m_PreserveUVs: 0
   m_IgnoreNormalsForChartDetection: 0
   m_IgnoreNormalsForChartDetection: 0
   m_ImportantGI: 0
   m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
   m_MinimumChartSize: 4
   m_MinimumChartSize: 4
   m_AutoUVMaxDistance: 0.5
   m_AutoUVMaxDistance: 0.5
   m_AutoUVMaxAngle: 89
   m_AutoUVMaxAngle: 89
   m_LightmapParameters: {fileID: 0}
   m_LightmapParameters: {fileID: 0}
   m_SortingLayerID: 0
   m_SortingLayerID: 0
+  m_SortingLayer: 0
   m_SortingOrder: 0
   m_SortingOrder: 0
 --- !u!33 &1256911796
 --- !u!33 &1256911796
 MeshFilter:
 MeshFilter:
@@ -293,6 +330,25 @@ Transform:
   - {fileID: 1476999243}
   - {fileID: 1476999243}
   m_Father: {fileID: 0}
   m_Father: {fileID: 0}
   m_RootOrder: 1
   m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1256911798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1256911793}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1d55a3bd6ac81af44b2f9a4447f2ae72, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  skeletonAnimation: {fileID: 1256911794}
+  eventName: footstep
+  audioSource: {fileID: 1476999242}
+  audioClip: {fileID: 8300000, guid: e885484e1bc99fb47a0ac3f6bfa586b1, type: 3}
+  basePitch: 0.5
+  randomPitchOffset: 0.25
+  debugMessage: 0
 --- !u!114 &1256911799
 --- !u!114 &1256911799
 MonoBehaviour:
 MonoBehaviour:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -307,17 +363,15 @@ MonoBehaviour:
   walk: walk
   walk: walk
   gungrab: gungrab
   gungrab: gungrab
   gunkeep: gunkeep
   gunkeep: gunkeep
-  footstepEvent: footstep
-  footstepAudioSource: {fileID: 1476999242}
 --- !u!1 &1382792502
 --- !u!1 &1382792502
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
-  serializedVersion: 4
+  serializedVersion: 5
   m_Component:
   m_Component:
-  - 4: {fileID: 1382792504}
-  - 167: {fileID: 1382792503}
+  - component: {fileID: 1382792504}
+  - component: {fileID: 1382792503}
   m_Layer: 0
   m_Layer: 0
   m_Name: Reverb Zone
   m_Name: Reverb Zone
   m_TagString: Untagged
   m_TagString: Untagged
@@ -344,7 +398,6 @@ AudioReverbZone:
   m_Reverb: -2
   m_Reverb: -2
   m_ReverbDelay: 0.029
   m_ReverbDelay: 0.029
   m_HFReference: 5000
   m_HFReference: 5000
-  m_RoomRolloffFactor: 0
   m_Diffusion: 100
   m_Diffusion: 100
   m_Density: 100
   m_Density: 100
   m_LFReference: 250
   m_LFReference: 250
@@ -361,15 +414,16 @@ Transform:
   m_Children: []
   m_Children: []
   m_Father: {fileID: 0}
   m_Father: {fileID: 0}
   m_RootOrder: 3
   m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &1476999241
 --- !u!1 &1476999241
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
-  serializedVersion: 4
+  serializedVersion: 5
   m_Component:
   m_Component:
-  - 4: {fileID: 1476999243}
-  - 82: {fileID: 1476999242}
+  - component: {fileID: 1476999243}
+  - component: {fileID: 1476999242}
   m_Layer: 0
   m_Layer: 0
   m_Name: footstep sounds
   m_Name: footstep sounds
   m_TagString: Untagged
   m_TagString: Untagged
@@ -393,6 +447,7 @@ AudioSource:
   Loop: 0
   Loop: 0
   Mute: 0
   Mute: 0
   Spatialize: 0
   Spatialize: 0
+  SpatializePostEffects: 0
   Priority: 128
   Priority: 128
   DopplerLevel: 1
   DopplerLevel: 1
   MinDistance: 1
   MinDistance: 1
@@ -405,12 +460,14 @@ AudioSource:
   rolloffCustomCurve:
   rolloffCustomCurve:
     serializedVersion: 2
     serializedVersion: 2
     m_Curve:
     m_Curve:
-    - time: 0
+    - serializedVersion: 2
+      time: 0
       value: 1
       value: 1
       inSlope: 0
       inSlope: 0
       outSlope: 0
       outSlope: 0
       tangentMode: 0
       tangentMode: 0
-    - time: 1
+    - serializedVersion: 2
+      time: 1
       value: 0
       value: 0
       inSlope: 0
       inSlope: 0
       outSlope: 0
       outSlope: 0
@@ -421,7 +478,8 @@ AudioSource:
   panLevelCustomCurve:
   panLevelCustomCurve:
     serializedVersion: 2
     serializedVersion: 2
     m_Curve:
     m_Curve:
-    - time: 0
+    - serializedVersion: 2
+      time: 0
       value: 0
       value: 0
       inSlope: 0
       inSlope: 0
       outSlope: 0
       outSlope: 0
@@ -432,7 +490,8 @@ AudioSource:
   spreadCustomCurve:
   spreadCustomCurve:
     serializedVersion: 2
     serializedVersion: 2
     m_Curve:
     m_Curve:
-    - time: 0
+    - serializedVersion: 2
+      time: 0
       value: 0
       value: 0
       inSlope: 0
       inSlope: 0
       outSlope: 0
       outSlope: 0
@@ -443,7 +502,8 @@ AudioSource:
   reverbZoneMixCustomCurve:
   reverbZoneMixCustomCurve:
     serializedVersion: 2
     serializedVersion: 2
     m_Curve:
     m_Curve:
-    - time: 0
+    - serializedVersion: 2
+      time: 0
       value: 1
       value: 1
       inSlope: 0
       inSlope: 0
       outSlope: 0
       outSlope: 0
@@ -463,16 +523,17 @@ Transform:
   m_Children: []
   m_Children: []
   m_Father: {fileID: 1256911797}
   m_Father: {fileID: 1256911797}
   m_RootOrder: 0
   m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &1551895946
 --- !u!1 &1551895946
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
-  serializedVersion: 4
+  serializedVersion: 5
   m_Component:
   m_Component:
-  - 4: {fileID: 1551895947}
-  - 23: {fileID: 1551895949}
-  - 102: {fileID: 1551895948}
+  - component: {fileID: 1551895947}
+  - component: {fileID: 1551895949}
+  - component: {fileID: 1551895948}
   m_Layer: 0
   m_Layer: 0
   m_Name: play mode
   m_Name: play mode
   m_TagString: Untagged
   m_TagString: Untagged
@@ -492,6 +553,7 @@ Transform:
   m_Children: []
   m_Children: []
   m_Father: {fileID: 654881620}
   m_Father: {fileID: 654881620}
   m_RootOrder: 1
   m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!102 &1551895948
 --- !u!102 &1551895948
 TextMesh:
 TextMesh:
   serializedVersion: 3
   serializedVersion: 3
@@ -522,35 +584,41 @@ MeshRenderer:
   m_Enabled: 1
   m_Enabled: 1
   m_CastShadows: 1
   m_CastShadows: 1
   m_ReceiveShadows: 1
   m_ReceiveShadows: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
   m_Materials:
   m_Materials:
   - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0}
   - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0}
-  m_SubsetIndices: 
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
   m_StaticBatchRoot: {fileID: 0}
   m_StaticBatchRoot: {fileID: 0}
-  m_UseLightProbes: 1
-  m_ReflectionProbeUsage: 1
   m_ProbeAnchor: {fileID: 0}
   m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
   m_ScaleInLightmap: 1
   m_ScaleInLightmap: 1
   m_PreserveUVs: 0
   m_PreserveUVs: 0
   m_IgnoreNormalsForChartDetection: 0
   m_IgnoreNormalsForChartDetection: 0
   m_ImportantGI: 0
   m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
   m_MinimumChartSize: 4
   m_MinimumChartSize: 4
   m_AutoUVMaxDistance: 0.5
   m_AutoUVMaxDistance: 0.5
   m_AutoUVMaxAngle: 89
   m_AutoUVMaxAngle: 89
   m_LightmapParameters: {fileID: 0}
   m_LightmapParameters: {fileID: 0}
   m_SortingLayerID: 0
   m_SortingLayerID: 0
+  m_SortingLayer: 0
   m_SortingOrder: 0
   m_SortingOrder: 0
 --- !u!1 &1604340971
 --- !u!1 &1604340971
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
-  serializedVersion: 4
+  serializedVersion: 5
   m_Component:
   m_Component:
-  - 4: {fileID: 1604340976}
-  - 20: {fileID: 1604340975}
-  - 92: {fileID: 1604340974}
-  - 124: {fileID: 1604340973}
-  - 81: {fileID: 1604340972}
+  - component: {fileID: 1604340976}
+  - component: {fileID: 1604340975}
+  - component: {fileID: 1604340974}
+  - component: {fileID: 1604340973}
+  - component: {fileID: 1604340972}
   m_Layer: 0
   m_Layer: 0
   m_Name: Main Camera
   m_Name: Main Camera
   m_TagString: MainCamera
   m_TagString: MainCamera
@@ -609,6 +677,8 @@ Camera:
   m_TargetDisplay: 0
   m_TargetDisplay: 0
   m_TargetEye: 3
   m_TargetEye: 3
   m_HDR: 0
   m_HDR: 0
+  m_AllowMSAA: 1
+  m_ForceIntoRT: 0
   m_OcclusionCulling: 1
   m_OcclusionCulling: 1
   m_StereoConvergence: 10
   m_StereoConvergence: 10
   m_StereoSeparation: 0.022
   m_StereoSeparation: 0.022
@@ -625,3 +695,4 @@ Transform:
   m_Children: []
   m_Children: []
   m_Father: {fileID: 0}
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

+ 358 - 51
spine-unity/Assets/Examples/Getting Started/5 Basic Platformer.unity

@@ -216,12 +216,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 74654461}
   m_GameObject: {fileID: 74654461}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 3.1562753, y: 0.965824, z: 25.893574}
   m_LocalPosition: {x: 3.1562753, y: 0.965824, z: 25.893574}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 14
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 6
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &74654463
 --- !u!23 &74654463
 MeshRenderer:
 MeshRenderer:
@@ -373,7 +373,7 @@ Transform:
   m_LocalScale: {x: 3.375706, y: 11.224084, z: 2.711687}
   m_LocalScale: {x: 3.375706, y: 11.224084, z: 2.711687}
   m_Children: []
   m_Children: []
   m_Father: {fileID: 1436083682}
   m_Father: {fileID: 1436083682}
-  m_RootOrder: 16
+  m_RootOrder: 7
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &217488464
 --- !u!23 &217488464
 MeshRenderer:
 MeshRenderer:
@@ -568,7 +568,7 @@ Transform:
   m_LocalScale: {x: 4.759716, y: 2.311941, z: 3.927896}
   m_LocalScale: {x: 4.759716, y: 2.311941, z: 3.927896}
   m_Children: []
   m_Children: []
   m_Father: {fileID: 1436083682}
   m_Father: {fileID: 1436083682}
-  m_RootOrder: 5
+  m_RootOrder: 4
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &308770409
 --- !u!23 &308770409
 MeshRenderer:
 MeshRenderer:
@@ -830,7 +830,7 @@ AudioSource:
   OutputAudioMixerGroup: {fileID: 0}
   OutputAudioMixerGroup: {fileID: 0}
   m_audioClip: {fileID: 8300000, guid: 532e417ffa3f95747908419a00be3780, type: 3}
   m_audioClip: {fileID: 8300000, guid: 532e417ffa3f95747908419a00be3780, type: 3}
   m_PlayOnAwake: 0
   m_PlayOnAwake: 0
-  m_Volume: 1
+  m_Volume: 0.9
   m_Pitch: 1
   m_Pitch: 1
   Loop: 0
   Loop: 0
   Mute: 0
   Mute: 0
@@ -899,6 +899,39 @@ AudioSource:
     m_PreInfinity: 2
     m_PreInfinity: 2
     m_PostInfinity: 2
     m_PostInfinity: 2
     m_RotationOrder: 0
     m_RotationOrder: 0
+--- !u!1 &486867433
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 486867434}
+  m_Layer: 10
+  m_Name: FOREGROUND
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &486867434
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 486867433}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 1437394976}
+  - {fileID: 1239889110}
+  - {fileID: 762163187}
+  - {fileID: 1728612031}
+  - {fileID: 1900333426}
+  m_Father: {fileID: 1436083682}
+  m_RootOrder: 8
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &522034802
 --- !u!1 &522034802
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -1007,12 +1040,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 529901551}
   m_GameObject: {fileID: 529901551}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 0.52838707, y: 0.965824, z: 12.03045}
   m_LocalPosition: {x: 0.52838707, y: 0.965824, z: 12.03045}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 9
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &529901553
 --- !u!23 &529901553
 MeshRenderer:
 MeshRenderer:
@@ -1454,7 +1487,7 @@ AudioSource:
   OutputAudioMixerGroup: {fileID: 0}
   OutputAudioMixerGroup: {fileID: 0}
   m_audioClip: {fileID: 8300000, guid: e885484e1bc99fb47a0ac3f6bfa586b1, type: 3}
   m_audioClip: {fileID: 8300000, guid: e885484e1bc99fb47a0ac3f6bfa586b1, type: 3}
   m_PlayOnAwake: 0
   m_PlayOnAwake: 0
-  m_Volume: 0.5
+  m_Volume: 0.25
   m_Pitch: 1
   m_Pitch: 1
   Loop: 0
   Loop: 0
   Mute: 0
   Mute: 0
@@ -1523,6 +1556,88 @@ AudioSource:
     m_PreInfinity: 2
     m_PreInfinity: 2
     m_PostInfinity: 2
     m_PostInfinity: 2
     m_RotationOrder: 0
     m_RotationOrder: 0
+--- !u!1 &762163186
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 762163187}
+  - component: {fileID: 762163190}
+  - component: {fileID: 762163189}
+  - component: {fileID: 762163188}
+  m_Layer: 10
+  m_Name: Cube
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 4294967295
+  m_IsActive: 1
+--- !u!4 &762163187
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 762163186}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 6.03, y: 4.7, z: -4}
+  m_LocalScale: {x: 0.7, y: 14, z: 0.7}
+  m_Children: []
+  m_Father: {fileID: 486867434}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &762163188
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 762163186}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 0
+  m_ReflectionProbeUsage: 1
+  m_Materials:
+  - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!65 &762163189
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 762163186}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!33 &762163190
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 762163186}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
 --- !u!1 &790644140
 --- !u!1 &790644140
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -1546,12 +1661,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 790644140}
   m_GameObject: {fileID: 790644140}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 29.054758, y: 0.965824, z: 25.893574}
   m_LocalPosition: {x: 29.054758, y: 0.965824, z: 25.893574}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 12
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 4
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &790644142
 --- !u!23 &790644142
 MeshRenderer:
 MeshRenderer:
@@ -2112,12 +2227,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 1152613752}
   m_GameObject: {fileID: 1152613752}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 26.426872, y: 0.965824, z: 12.03045}
   m_LocalPosition: {x: 26.426872, y: 0.965824, z: 12.03045}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 11
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 3
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &1152613754
 --- !u!23 &1152613754
 MeshRenderer:
 MeshRenderer:
@@ -5599,12 +5714,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 1239889109}
   m_GameObject: {fileID: 1239889109}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: -12.245578, y: 4.4490747, z: -1.8732238}
   m_LocalPosition: {x: -12.245578, y: 4.4490747, z: -1.8732238}
   m_LocalScale: {x: 3.3757064, y: 11.224084, z: 2.7116873}
   m_LocalScale: {x: 3.3757064, y: 11.224084, z: 2.7116873}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 4
+  m_Father: {fileID: 486867434}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &1239889111
 --- !u!23 &1239889111
 MeshRenderer:
 MeshRenderer:
@@ -5657,6 +5772,43 @@ MeshFilter:
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 1239889109}
   m_GameObject: {fileID: 1239889109}
   m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
   m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1338487225
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1338487226}
+  m_Layer: 10
+  m_Name: BACKGROUND
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1338487226
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1338487225}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 2019593955}
+  - {fileID: 529901552}
+  - {fileID: 1982529759}
+  - {fileID: 1152613753}
+  - {fileID: 790644141}
+  - {fileID: 1506465911}
+  - {fileID: 74654462}
+  - {fileID: 1527457427}
+  - {fileID: 1803534917}
+  m_Father: {fileID: 1436083682}
+  m_RootOrder: 9
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &1381317419
 --- !u!1 &1381317419
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -5718,21 +5870,12 @@ Transform:
   - {fileID: 1112695306}
   - {fileID: 1112695306}
   - {fileID: 939146564}
   - {fileID: 939146564}
   - {fileID: 854723183}
   - {fileID: 854723183}
-  - {fileID: 1239889110}
   - {fileID: 308770408}
   - {fileID: 308770408}
   - {fileID: 2038851861}
   - {fileID: 2038851861}
   - {fileID: 1615467379}
   - {fileID: 1615467379}
-  - {fileID: 2019593955}
-  - {fileID: 529901552}
-  - {fileID: 1982529759}
-  - {fileID: 1152613753}
-  - {fileID: 790644141}
-  - {fileID: 1506465911}
-  - {fileID: 74654462}
-  - {fileID: 1527457427}
   - {fileID: 217488463}
   - {fileID: 217488463}
-  - {fileID: 1803534917}
-  - {fileID: 1437394976}
+  - {fileID: 486867434}
+  - {fileID: 1338487226}
   m_Father: {fileID: 0}
   m_Father: {fileID: 0}
   m_RootOrder: 2
   m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -5760,12 +5903,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 1437394975}
   m_GameObject: {fileID: 1437394975}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 28.995129, y: 4.449075, z: -3.6664026}
   m_LocalPosition: {x: 28.995129, y: 4.449075, z: -3.6664026}
   m_LocalScale: {x: 3.375706, y: 11.224084, z: 2.711687}
   m_LocalScale: {x: 3.375706, y: 11.224084, z: 2.711687}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 18
+  m_Father: {fileID: 486867434}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &1437394977
 --- !u!23 &1437394977
 MeshRenderer:
 MeshRenderer:
@@ -5841,12 +5984,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 1506465910}
   m_GameObject: {fileID: 1506465910}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 14.239922, y: 0.965824, z: 25.893574}
   m_LocalPosition: {x: 14.239922, y: 0.965824, z: 25.893574}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 13
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 5
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &1506465912
 --- !u!23 &1506465912
 MeshRenderer:
 MeshRenderer:
@@ -6010,12 +6153,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 1527457426}
   m_GameObject: {fileID: 1527457426}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: -4.538345, y: 0.965824, z: 25.893574}
   m_LocalPosition: {x: -4.538345, y: 0.965824, z: 25.893574}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.502821}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 15
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 7
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &1527457428
 --- !u!23 &1527457428
 MeshRenderer:
 MeshRenderer:
@@ -6167,7 +6310,7 @@ Transform:
   m_LocalScale: {x: 4.7597165, y: 2.311941, z: 3.927896}
   m_LocalScale: {x: 4.7597165, y: 2.311941, z: 3.927896}
   m_Children: []
   m_Children: []
   m_Father: {fileID: 1436083682}
   m_Father: {fileID: 1436083682}
-  m_RootOrder: 7
+  m_RootOrder: 6
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &1615467380
 --- !u!23 &1615467380
 MeshRenderer:
 MeshRenderer:
@@ -6250,6 +6393,88 @@ Transform:
   m_Father: {fileID: 1204355831}
   m_Father: {fileID: 1204355831}
   m_RootOrder: 0
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1728612030
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1728612031}
+  - component: {fileID: 1728612034}
+  - component: {fileID: 1728612033}
+  - component: {fileID: 1728612032}
+  m_Layer: 10
+  m_Name: Cube (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 4294967295
+  m_IsActive: 1
+--- !u!4 &1728612031
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1728612030}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 22.74, y: -3.07, z: -3.5}
+  m_LocalScale: {x: 0.7, y: 14, z: 0.7}
+  m_Children: []
+  m_Father: {fileID: 486867434}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1728612032
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1728612030}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 0
+  m_ReflectionProbeUsage: 1
+  m_Materials:
+  - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!65 &1728612033
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1728612030}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!33 &1728612034
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1728612030}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
 --- !u!1 &1776464688
 --- !u!1 &1776464688
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -6385,12 +6610,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 1803534916}
   m_GameObject: {fileID: 1803534916}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 28.995129, y: 4.449075, z: 2.8281965}
   m_LocalPosition: {x: 28.995129, y: 4.449075, z: 2.8281965}
   m_LocalScale: {x: 3.375706, y: 11.224084, z: 2.711687}
   m_LocalScale: {x: 3.375706, y: 11.224084, z: 2.711687}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 17
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 8
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &1803534918
 --- !u!23 &1803534918
 MeshRenderer:
 MeshRenderer:
@@ -6483,7 +6708,7 @@ AudioSource:
   OutputAudioMixerGroup: {fileID: 0}
   OutputAudioMixerGroup: {fileID: 0}
   m_audioClip: {fileID: 8300000, guid: 51f0c54706b53c14c9c24bbd63bb18a6, type: 3}
   m_audioClip: {fileID: 8300000, guid: 51f0c54706b53c14c9c24bbd63bb18a6, type: 3}
   m_PlayOnAwake: 0
   m_PlayOnAwake: 0
-  m_Volume: 0.9
+  m_Volume: 0.6
   m_Pitch: 1
   m_Pitch: 1
   Loop: 0
   Loop: 0
   Mute: 0
   Mute: 0
@@ -6552,6 +6777,88 @@ AudioSource:
     m_PreInfinity: 2
     m_PreInfinity: 2
     m_PostInfinity: 2
     m_PostInfinity: 2
     m_RotationOrder: 0
     m_RotationOrder: 0
+--- !u!1 &1900333425
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1900333426}
+  - component: {fileID: 1900333429}
+  - component: {fileID: 1900333428}
+  - component: {fileID: 1900333427}
+  m_Layer: 10
+  m_Name: Cube (2)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 4294967295
+  m_IsActive: 1
+--- !u!4 &1900333426
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1900333425}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 13.43, y: -1.96, z: -3.5}
+  m_LocalScale: {x: 0.7, y: 14, z: 0.7}
+  m_Children: []
+  m_Father: {fileID: 486867434}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1900333427
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1900333425}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 0
+  m_ReflectionProbeUsage: 1
+  m_Materials:
+  - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!65 &1900333428
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1900333425}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!33 &1900333429
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1900333425}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
 --- !u!1 &1943525033
 --- !u!1 &1943525033
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -6657,12 +6964,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 1982529758}
   m_GameObject: {fileID: 1982529758}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: 12.23, y: 0.965824, z: 4.35}
   m_LocalPosition: {x: 12.23, y: 0.965824, z: 4.35}
   m_LocalScale: {x: 8.47, y: 12.454684, z: 1.502821}
   m_LocalScale: {x: 8.47, y: 12.454684, z: 1.502821}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 10
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &1982529760
 --- !u!23 &1982529760
 MeshRenderer:
 MeshRenderer:
@@ -6726,12 +7033,12 @@ Transform:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_GameObject: {fileID: 2019593954}
   m_GameObject: {fileID: 2019593954}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: -7.166233, y: 0.9658241, z: 12.03045}
   m_LocalPosition: {x: -7.166233, y: 0.9658241, z: 12.03045}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.5028212}
   m_LocalScale: {x: 5.713549, y: 12.454684, z: 1.5028212}
   m_Children: []
   m_Children: []
-  m_Father: {fileID: 1436083682}
-  m_RootOrder: 8
+  m_Father: {fileID: 1338487226}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &2019593956
 --- !u!23 &2019593956
 MeshRenderer:
 MeshRenderer:
@@ -6801,7 +7108,7 @@ Transform:
   m_LocalScale: {x: 4.7597165, y: 2.311941, z: 3.927896}
   m_LocalScale: {x: 4.7597165, y: 2.311941, z: 3.927896}
   m_Children: []
   m_Children: []
   m_Father: {fileID: 1436083682}
   m_Father: {fileID: 1436083682}
-  m_RootOrder: 6
+  m_RootOrder: 5
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!23 &2038851862
 --- !u!23 &2038851862
 MeshRenderer:
 MeshRenderer:

+ 4 - 4
spine-unity/Assets/Examples/Other Examples/Instantiate from Script.unity

@@ -224,11 +224,11 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: bb0837af7345d504db63d0c662fd12dc, type: 3}
   m_Script: {fileID: 11500000, guid: bb0837af7345d504db63d0c662fd12dc, type: 3}
   m_Name: 
   m_Name: 
   m_EditorClassIdentifier: 
   m_EditorClassIdentifier: 
-  skeletonJson: {fileID: 4900000, guid: e3b64d7eaf0de4e45a00b7065166554d, type: 3}
-  atlasText: {fileID: 4900000, guid: 5c0a5c36970a46e4d8378760ab4a4cfc, type: 3}
+  skeletonJson: {fileID: 4900000, guid: 8160b67e4c41bd041b948b5e5a86e242, type: 3}
+  atlasText: {fileID: 4900000, guid: 9b2378ddc54f1c94fb80411958000a8c, type: 3}
   textures:
   textures:
-  - {fileID: 2800000, guid: 49bb65eefe08e424bbf7a38bc98ec638, type: 3}
-  materialPropertySource: {fileID: 2100000, guid: 365eb017d7ae7134d820c8b808eeb121,
+  - {fileID: 2800000, guid: 4ea2c33e839afb34c98f66e892b3b2d2, type: 3}
+  materialPropertySource: {fileID: 2100000, guid: f89bbf05902e77242a3ad20f3c927353,
     type: 2}
     type: 2}
 --- !u!4 &651278530
 --- !u!4 &651278530
 Transform:
 Transform:

+ 716 - 0
spine-unity/Assets/Examples/Other Examples/Per Instance Material Properties.unity

@@ -0,0 +1,716 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 8
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 3
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_TemporalCoherenceThreshold: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 0
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 8
+    m_Resolution: 2
+    m_BakeResolution: 40
+    m_TextureWidth: 1024
+    m_TextureHeight: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 1
+    m_CompAOExponentDirect: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 3
+    m_BakeBackend: 0
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 500
+    m_PVRBounces: 2
+    m_PVRFiltering: 0
+    m_PVRFilteringMode: 1
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousColorSigma: 1
+    m_PVRFilteringAtrousNormalSigma: 1
+    m_PVRFilteringAtrousPositionSigma: 1
+  m_LightingDataAsset: {fileID: 0}
+  m_ShadowMaskMode: 2
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &21914459
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 21914462}
+  - component: {fileID: 21914461}
+  - component: {fileID: 21914460}
+  m_Layer: 0
+  m_Name: EventSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &21914460
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 21914459}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalAxis: Horizontal
+  m_VerticalAxis: Vertical
+  m_SubmitButton: Submit
+  m_CancelButton: Cancel
+  m_InputActionsPerSecond: 10
+  m_RepeatDelay: 0.5
+  m_ForceModuleActive: 0
+--- !u!114 &21914461
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 21914459}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_FirstSelected: {fileID: 0}
+  m_sendNavigationEvents: 1
+  m_DragThreshold: 5
+--- !u!4 &21914462
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 21914459}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &508727089
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 508727093}
+  - component: {fileID: 508727092}
+  - component: {fileID: 508727091}
+  - component: {fileID: 508727090}
+  - component: {fileID: 508727094}
+  m_Layer: 0
+  m_Name: Spine GameObject (spineboy) (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &508727090
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 508727089}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d247ba06193faa74d9335f5481b2b56c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  skeletonDataAsset: {fileID: 11400000, guid: a467507a4ffb1d542a558739b2fede77, type: 2}
+  initialSkinName: base
+  initialFlipX: 0
+  initialFlipY: 0
+  separatorSlotNames: []
+  zSpacing: 0
+  useClipping: 1
+  immutableTriangles: 0
+  pmaVertexColors: 1
+  clearStateOnDisable: 0
+  tintBlack: 0
+  singleSubmesh: 0
+  addNormals: 0
+  calculateTangents: 0
+  logErrors: 0
+  disableRenderingOnOverride: 1
+  _animationName: run
+  loop: 1
+  timeScale: 1
+--- !u!23 &508727091
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 508727089}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_Materials:
+  - {fileID: 2100000, guid: 128e02fa6a4f5964fa898757a425b354, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!33 &508727092
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 508727089}
+  m_Mesh: {fileID: 0}
+--- !u!4 &508727093
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 508727089}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 3, y: -2, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &508727094
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 508727089}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0456e5bde0b34594782f280f40128902, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  timeInterval: 0.9
+  randomColors:
+    serializedVersion: 2
+    key0: {r: 0, g: 0.59350926, b: 0.64705884, a: 1}
+    key1: {r: 0.121161334, g: 0.12453464, b: 0.6102941, a: 1}
+    key2: {r: 0.5443711, g: 0, b: 0.8308824, a: 0}
+    key3: {r: 0, g: 0.7352941, b: 0.15720093, a: 0}
+    key4: {r: 0, g: 0, b: 0, a: 0}
+    key5: {r: 0, g: 0, b: 0, a: 0}
+    key6: {r: 0, g: 0, b: 0, a: 0}
+    key7: {r: 0, g: 0, b: 0, a: 0}
+    ctime0: 0
+    ctime1: 16769
+    ctime2: 44718
+    ctime3: 65535
+    ctime4: 0
+    ctime5: 0
+    ctime6: 0
+    ctime7: 0
+    atime0: 0
+    atime1: 65535
+    atime2: 0
+    atime3: 0
+    atime4: 0
+    atime5: 0
+    atime6: 0
+    atime7: 0
+    m_Mode: 0
+    m_NumColorKeys: 4
+    m_NumAlphaKeys: 2
+  colorPropertyName: _Black
+--- !u!1 &1057001079
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1057001080}
+  - component: {fileID: 1057001082}
+  - component: {fileID: 1057001081}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1057001080
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1057001079}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1909315731}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -0.000030518, y: -344}
+  m_SizeDelta: {x: 969, y: 93}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1057001081
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1057001079}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 30
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 3
+    m_MaxSize: 40
+    m_Alignment: 1
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 1
+    m_LineSpacing: 1
+  m_Text: These two Spineboys share the same Material, but use MaterialPropertyBlock
+    to have different tints.
+--- !u!222 &1057001082
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1057001079}
+--- !u!1 &1334021432
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1334021436}
+  - component: {fileID: 1334021435}
+  - component: {fileID: 1334021434}
+  - component: {fileID: 1334021433}
+  - component: {fileID: 1334021437}
+  m_Layer: 0
+  m_Name: Spine GameObject (spineboy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1334021433
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1334021432}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d247ba06193faa74d9335f5481b2b56c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  skeletonDataAsset: {fileID: 11400000, guid: a467507a4ffb1d542a558739b2fede77, type: 2}
+  initialSkinName: base
+  initialFlipX: 0
+  initialFlipY: 0
+  separatorSlotNames: []
+  zSpacing: 0
+  useClipping: 1
+  immutableTriangles: 0
+  pmaVertexColors: 1
+  clearStateOnDisable: 0
+  tintBlack: 0
+  singleSubmesh: 0
+  addNormals: 0
+  calculateTangents: 0
+  logErrors: 0
+  disableRenderingOnOverride: 1
+  _animationName: run
+  loop: 1
+  timeScale: 1
+--- !u!23 &1334021434
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1334021432}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_Materials:
+  - {fileID: 2100000, guid: 128e02fa6a4f5964fa898757a425b354, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!33 &1334021435
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1334021432}
+  m_Mesh: {fileID: 0}
+--- !u!4 &1334021436
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1334021432}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -3, y: -2, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1334021437
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1334021432}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0456e5bde0b34594782f280f40128902, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  timeInterval: 0.7
+  randomColors:
+    serializedVersion: 2
+    key0: {r: 0.64705884, g: 0, b: 0, a: 1}
+    key1: {r: 0.7145329, g: 0.5051904, b: 0.19117647, a: 1}
+    key2: {r: 0.95699793, g: 1, b: 0.2205882, a: 0}
+    key3: {r: 0.9338235, g: 0.40573037, b: 0, a: 0}
+    key4: {r: 0, g: 0, b: 0, a: 0}
+    key5: {r: 0, g: 0, b: 0, a: 0}
+    key6: {r: 0, g: 0, b: 0, a: 0}
+    key7: {r: 0, g: 0, b: 0, a: 0}
+    ctime0: 0
+    ctime1: 12529
+    ctime2: 35081
+    ctime3: 65535
+    ctime4: 0
+    ctime5: 0
+    ctime6: 0
+    ctime7: 0
+    atime0: 0
+    atime1: 65535
+    atime2: 0
+    atime3: 0
+    atime4: 0
+    atime5: 0
+    atime6: 0
+    atime7: 0
+    m_Mode: 0
+    m_NumColorKeys: 4
+    m_NumAlphaKeys: 2
+  colorPropertyName: _Black
+--- !u!1 &1408234531
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1408234536}
+  - component: {fileID: 1408234535}
+  - component: {fileID: 1408234534}
+  - component: {fileID: 1408234533}
+  - component: {fileID: 1408234532}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &1408234532
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1408234531}
+  m_Enabled: 1
+--- !u!124 &1408234533
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1408234531}
+  m_Enabled: 1
+--- !u!92 &1408234534
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1408234531}
+  m_Enabled: 1
+--- !u!20 &1408234535
+Camera:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1408234531}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.33823532, g: 0.15419552, b: 0.29508117, a: 0}
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+  m_StereoMirrorMode: 0
+--- !u!4 &1408234536
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1408234531}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1909315727
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1909315731}
+  - component: {fileID: 1909315730}
+  - component: {fileID: 1909315729}
+  - component: {fileID: 1909315728}
+  m_Layer: 5
+  m_Name: Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1909315728
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1909315727}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &1909315729
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1909315727}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 1
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 1920, y: 1080}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+--- !u!223 &1909315730
+Canvas:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1909315727}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 0
+  m_Camera: {fileID: 0}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_AdditionalShaderChannelsFlag: 0
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!224 &1909315731
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1909315727}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_Children:
+  - {fileID: 1057001080}
+  m_Father: {fileID: 0}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}

+ 2 - 2
spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy-unity.atlas.meta → spine-unity/Assets/Examples/Other Examples/Per Instance Material Properties.unity.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 fileFormatVersion: 2
-guid: c3184a6ff8f29e8429a443fd3d80a069
-timeCreated: 1497568842
+guid: 9b570698c6e11804e976b1fd16c8793f
+timeCreated: 1516387990
 licenseType: Free
 licenseType: Free
 DefaultImporter:
 DefaultImporter:
   userData: 
   userData: 

+ 254 - 0
spine-unity/Assets/Examples/Other Examples/SkeletonAnimationMulti.unity

@@ -0,0 +1,254 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 8
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 3
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_TemporalCoherenceThreshold: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 0
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 8
+    m_Resolution: 2
+    m_BakeResolution: 40
+    m_TextureWidth: 1024
+    m_TextureHeight: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 1
+    m_CompAOExponentDirect: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 3
+    m_BakeBackend: 0
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 500
+    m_PVRBounces: 2
+    m_PVRFiltering: 0
+    m_PVRFilteringMode: 1
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousColorSigma: 1
+    m_PVRFilteringAtrousNormalSigma: 1
+    m_PVRFilteringAtrousPositionSigma: 1
+  m_LightingDataAsset: {fileID: 0}
+  m_ShadowMaskMode: 2
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &1138932459
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1138932461}
+  - component: {fileID: 1138932460}
+  m_Layer: 0
+  m_Name: GameObject
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1138932460
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1138932459}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a5ea35d82fb1b5d4583e89b4343976b6, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  initialFlipX: 1
+  initialFlipY: 0
+  initialAnimation: flying
+  initialLoop: 1
+  skeletonDataAssets:
+  - {fileID: 11400000, guid: af38a3de26ed9b84abc2fe7c7f3b209d, type: 2}
+  - {fileID: 11400000, guid: 76506fa7fbeed084ab2dfb084648c628, type: 2}
+  meshGeneratorSettings:
+    useClipping: 1
+    zSpacing: 0
+    pmaVertexColors: 1
+    tintBlack: 0
+    calculateTangents: 0
+    addNormals: 0
+    immutableTriangles: 0
+--- !u!4 &1138932461
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1138932459}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1616673261
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1616673266}
+  - component: {fileID: 1616673265}
+  - component: {fileID: 1616673264}
+  - component: {fileID: 1616673263}
+  - component: {fileID: 1616673262}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &1616673262
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1616673261}
+  m_Enabled: 1
+--- !u!124 &1616673263
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1616673261}
+  m_Enabled: 1
+--- !u!92 &1616673264
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1616673261}
+  m_Enabled: 1
+--- !u!20 &1616673265
+Camera:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1616673261}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 1
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+  m_StereoMirrorMode: 0
+--- !u!4 &1616673266
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1616673261}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

+ 8 - 0
spine-unity/Assets/Examples/Other Examples/SkeletonAnimationMulti.unity.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 235842830be28644eb5bec81483907de
+timeCreated: 1502103327
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 120 - 1
spine-unity/Assets/Examples/Other Examples/SpineGauge.unity

@@ -108,6 +108,125 @@ NavMeshSettings:
     tileSize: 256
     tileSize: 256
     accuratePlacement: 0
     accuratePlacement: 0
   m_NavMeshData: {fileID: 0}
   m_NavMeshData: {fileID: 0}
+--- !u!1 &282891642
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 282891647}
+  - component: {fileID: 282891646}
+  - component: {fileID: 282891645}
+  - component: {fileID: 282891644}
+  - component: {fileID: 282891643}
+  m_Layer: 0
+  m_Name: Spine GameObject (spineboy) (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &282891643
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 282891642}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 26947ae098a8447408d80c0c86e35b48, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  skeletonRenderer: {fileID: 282891644}
+  customSlotMaterials: []
+  customMaterialOverrides:
+  - overrideDisabled: 0
+    originalMaterial: {fileID: 2100000, guid: 1455e88fdb81ccc45bdeaedd657bad4d, type: 2}
+    replacementMaterial: {fileID: 2100000, guid: 128e02fa6a4f5964fa898757a425b354,
+      type: 2}
+--- !u!114 &282891644
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 282891642}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d247ba06193faa74d9335f5481b2b56c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  skeletonDataAsset: {fileID: 11400000, guid: a467507a4ffb1d542a558739b2fede77, type: 2}
+  initialSkinName: base
+  initialFlipX: 0
+  initialFlipY: 0
+  separatorSlotNames: []
+  zSpacing: 0
+  useClipping: 1
+  immutableTriangles: 0
+  pmaVertexColors: 1
+  clearStateOnDisable: 0
+  tintBlack: 0
+  singleSubmesh: 0
+  addNormals: 0
+  calculateTangents: 0
+  logErrors: 0
+  disableRenderingOnOverride: 1
+  _animationName: idle
+  loop: 1
+  timeScale: 1
+--- !u!23 &282891645
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 282891642}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_Materials:
+  - {fileID: 2100000, guid: 128e02fa6a4f5964fa898757a425b354, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!33 &282891646
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 282891642}
+  m_Mesh: {fileID: 0}
+--- !u!4 &282891647
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 282891642}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -8.18, y: -3.48, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &351144566
 --- !u!1 &351144566
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -335,7 +454,7 @@ MeshRenderer:
   m_LightmapParameters: {fileID: 0}
   m_LightmapParameters: {fileID: 0}
   m_SortingLayerID: 0
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingLayer: 0
-  m_SortingOrder: 0
+  m_SortingOrder: 10
 --- !u!4 &795271517
 --- !u!4 &795271517
 Transform:
 Transform:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0

+ 0 - 13
spine-unity/Assets/Examples/Scripts/Getting Started Scripts/Raptor.cs

@@ -44,28 +44,15 @@ namespace Spine.Unity.Examples {
 
 
 		[SpineAnimation]
 		[SpineAnimation]
 		public string gunkeep = "gunkeep";
 		public string gunkeep = "gunkeep";
-
-		[SpineEvent]
-		public string footstepEvent = "footstep";
-
-		public AudioSource footstepAudioSource;
 		#endregion
 		#endregion
 
 
 		SkeletonAnimation skeletonAnimation;
 		SkeletonAnimation skeletonAnimation;
 
 
 		void Start () {
 		void Start () {
 			skeletonAnimation = GetComponent<SkeletonAnimation>();
 			skeletonAnimation = GetComponent<SkeletonAnimation>();
-			skeletonAnimation.AnimationState.Event += HandleEvent;
 			StartCoroutine(GunGrabRoutine());
 			StartCoroutine(GunGrabRoutine());
 		}
 		}
 
 
-		void HandleEvent (Spine.TrackEntry trackEntry, Spine.Event e) {
-			if (e.Data.Name == footstepEvent) {
-				footstepAudioSource.pitch = 0.5f + Random.Range(-0.2f, 0.2f);
-				footstepAudioSource.Play();
-			}
-		}
-
 		IEnumerator GunGrabRoutine () {		
 		IEnumerator GunGrabRoutine () {		
 			// Play the walk animation on track 0.
 			// Play the walk animation on track 0.
 			skeletonAnimation.AnimationState.SetAnimation(0, walk, true);
 			skeletonAnimation.AnimationState.SetAnimation(0, walk, true);

+ 80 - 0
spine-unity/Assets/Examples/Scripts/HandleEventWithAudioExample.cs

@@ -0,0 +1,80 @@
+/******************************************************************************
+ * Spine Runtimes Software License v2.5
+ *
+ * Copyright (c) 2013-2016, Esoteric Software
+ * All rights reserved.
+ *
+ * You are granted a perpetual, non-exclusive, non-sublicensable, and
+ * non-transferable license to use, install, execute, and perform the Spine
+ * Runtimes software and derivative works solely for personal or internal
+ * use. Without the written permission of Esoteric Software (see Section 2 of
+ * the Spine Software License Agreement), you may not (a) modify, translate,
+ * adapt, or develop new applications using the Spine Runtimes or otherwise
+ * create derivative works or improvements of the Spine Runtimes or (b) remove,
+ * delete, alter, or obscure any trademarks or any copyright, trademark, patent,
+ * or other intellectual property or proprietary rights notices on or in the
+ * Software, including any copy thereof. Redistributions in binary or source
+ * form must include this license and terms.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
+ * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Spine.Unity.Examples {
+	public class HandleEventWithAudioExample : MonoBehaviour {
+
+		public SkeletonAnimation skeletonAnimation;
+		[SpineEvent(dataField: "skeletonAnimation", fallbackToTextField: true)]
+		public string eventName;
+
+		[Space]
+		public AudioSource audioSource;
+		public AudioClip audioClip;
+		public float basePitch = 1f;
+		public float randomPitchOffset = 0.1f;
+
+		[Space]
+		public bool logDebugMessage = false;
+
+		Spine.EventData eventData;
+
+		void OnValidate () {
+			if (skeletonAnimation == null) GetComponent<SkeletonAnimation>();
+			if (audioSource == null) GetComponent<AudioSource>();
+		}
+
+		void Start () {
+			if (audioSource == null) return;
+			if (skeletonAnimation == null) return;
+			skeletonAnimation.Initialize(false);
+			if (!skeletonAnimation.valid) return;
+
+			eventData = skeletonAnimation.Skeleton.Data.FindEvent(eventName);
+			skeletonAnimation.AnimationState.Event += HandleAnimationStateEvent;
+		}
+
+		private void HandleAnimationStateEvent (TrackEntry trackEntry, Event e) {
+			if (logDebugMessage) Debug.Log("Event fired! " + e.Data.Name);
+			//bool eventMatch = string.Equals(e.Data.Name, eventName, System.StringComparison.Ordinal); // Testing recommendation: String compare.
+			bool eventMatch = (eventData == e.Data); // Performance recommendation: Match cached reference instead of string.
+			if (eventMatch) {
+				audioSource.pitch = basePitch + Random.Range(-randomPitchOffset, randomPitchOffset);
+				audioSource.clip = audioClip;
+				audioSource.Play();
+			}
+		}
+	}
+
+}

+ 12 - 0
spine-unity/Assets/Examples/Scripts/HandleEventWithAudioExample.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1d55a3bd6ac81af44b2f9a4447f2ae72
+timeCreated: 1516481531
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 33 - 0
spine-unity/Assets/Examples/Scripts/MaterialPropertyBlockExample.cs

@@ -0,0 +1,33 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Spine.Unity.Examples {
+	public class MaterialPropertyBlockExample : MonoBehaviour {
+
+		public float timeInterval = 1f;
+		public Gradient randomColors = new Gradient();
+		public string colorPropertyName = "_FillColor";
+
+		MaterialPropertyBlock mpb;
+		float timeToNextColor = 0;
+		
+		void Start () {
+			mpb = new MaterialPropertyBlock();
+		}
+
+		void Update () {
+			if (timeToNextColor <= 0) {
+				timeToNextColor = timeInterval;
+
+				Color newColor = randomColors.Evaluate(UnityEngine.Random.value);
+				mpb.SetColor(colorPropertyName, newColor);
+				GetComponent<MeshRenderer>().SetPropertyBlock(mpb);
+			}
+
+			timeToNextColor -= Time.deltaTime;
+		}
+
+	}
+
+}

+ 12 - 0
spine-unity/Assets/Examples/Scripts/MaterialPropertyBlockExample.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0456e5bde0b34594782f280f40128902
+timeCreated: 1516388202
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 9 - 0
spine-unity/Assets/Examples/Scripts/Sample Components/SkeletonAnimationMulti.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 1258037ca4297c7428842419a266f7a4
+folderAsset: yes
+timeCreated: 1502103133
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 132 - 0
spine-unity/Assets/Examples/Scripts/Sample Components/SkeletonAnimationMulti/SkeletonAnimationMulti.cs

@@ -0,0 +1,132 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+using Spine;
+using Spine.Unity;
+
+namespace Spine.Unity {
+	
+	using Animation = Spine.Animation;
+	using AnimationState = Spine.AnimationState;
+
+	public class SkeletonAnimationMulti : MonoBehaviour {
+		const int MainTrackIndex = 0;
+
+		public bool initialFlipX, initialFlipY;
+		public string initialAnimation;
+		public bool initialLoop;
+		[Space]
+		public List<SkeletonDataAsset> skeletonDataAssets = new List<SkeletonDataAsset>();
+		[Header("Settings")]
+		public MeshGenerator.Settings meshGeneratorSettings = MeshGenerator.Settings.Default;
+
+		readonly List<SkeletonAnimation> skeletonAnimations = new List<SkeletonAnimation>();
+		readonly Dictionary<string, Animation> animationNameTable = new Dictionary<string, Animation>();
+		readonly Dictionary<Animation, SkeletonAnimation> animationSkeletonTable = new Dictionary<Animation, SkeletonAnimation>();
+		//Stateful
+		SkeletonAnimation currentSkeletonAnimation;
+
+		void Clear () {
+			foreach (var s in skeletonAnimations)
+				Destroy(s.gameObject);
+
+			skeletonAnimations.Clear();
+			animationNameTable.Clear();
+			animationSkeletonTable.Clear();
+		}
+
+		void SetActiveSkeleton (SkeletonAnimation skeletonAnimation) {
+			foreach (var sa in skeletonAnimations)
+				sa.gameObject.SetActive(sa == skeletonAnimation);
+			
+			currentSkeletonAnimation = skeletonAnimation;
+		}
+
+		#region Lifecycle
+		void Awake () {
+			Initialize(false);
+		}
+		#endregion
+
+		#region API
+		public Dictionary<Animation, SkeletonAnimation> AnimationSkeletonTable { get { return this.animationSkeletonTable; } }
+		public Dictionary<string, Animation> AnimationNameTable { get { return this.animationNameTable; } }
+		public SkeletonAnimation CurrentSkeletonAnimation { get { return this.currentSkeletonAnimation; } }
+
+		public void Initialize (bool overwrite) {
+			if (skeletonAnimations.Count != 0 && !overwrite) return;
+
+			Clear();
+
+			var settings = this.meshGeneratorSettings;
+			Transform thisTransform = this.transform;
+			foreach (var sda in skeletonDataAssets) {
+				var sa = SkeletonAnimation.NewSkeletonAnimationGameObject(sda);
+				sa.transform.SetParent(thisTransform, false);
+
+				sa.SetMeshSettings(settings);
+				sa.initialFlipX = this.initialFlipX;
+				sa.initialFlipY = this.initialFlipY;
+				var skeleton = sa.skeleton;
+				skeleton.FlipX = this.initialFlipX;
+				skeleton.FlipY = this.initialFlipY;
+
+				sa.Initialize(false);
+				skeletonAnimations.Add(sa);
+			}
+
+			// Build cache
+			var animationNameTable = this.animationNameTable;
+			var animationSkeletonTable = this.animationSkeletonTable;
+			foreach (var skeletonAnimation in skeletonAnimations) {
+				foreach (var animationObject in skeletonAnimation.Skeleton.Data.Animations) {
+					animationNameTable[animationObject.Name] = animationObject;
+					animationSkeletonTable[animationObject] = skeletonAnimation;
+				}
+			}
+
+			SetActiveSkeleton(skeletonAnimations[0]);
+			SetAnimation(initialAnimation, initialLoop);
+		}
+
+		public Animation FindAnimation (string animationName) {
+			// Analysis disable once LocalVariableHidesMember
+			Animation animation;
+			animationNameTable.TryGetValue(animationName, out animation);
+			return animation;
+		}
+
+		public TrackEntry SetAnimation (string animationName, bool loop) {
+			return SetAnimation(FindAnimation(animationName), loop);
+		}
+
+		public TrackEntry SetAnimation (Animation animation, bool loop) {
+			if (animation == null) return null;
+
+			SkeletonAnimation skeletonAnimation;
+			animationSkeletonTable.TryGetValue(animation, out skeletonAnimation);
+
+			if (skeletonAnimation != null) {
+				SetActiveSkeleton(skeletonAnimation);
+				skeletonAnimation.skeleton.SetToSetupPose();
+				return skeletonAnimation.state.SetAnimation(MainTrackIndex, animation, loop);
+			}
+
+			return null;
+		}
+
+		public void SetEmptyAnimation (float mixDuration) {
+			currentSkeletonAnimation.state.SetEmptyAnimation(MainTrackIndex, mixDuration);
+		}
+
+		public void ClearAnimation () {
+			currentSkeletonAnimation.state.ClearTrack(MainTrackIndex);
+		}
+
+		public TrackEntry GetCurrent () {
+			return currentSkeletonAnimation.state.GetCurrent(MainTrackIndex);
+		}
+		#endregion
+	}
+}

+ 12 - 0
spine-unity/Assets/Examples/Scripts/Sample Components/SkeletonAnimationMulti/SkeletonAnimationMulti.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a5ea35d82fb1b5d4583e89b4343976b6
+timeCreated: 1502103123
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
spine-unity/Assets/Examples/Scripts/Sample Components/SlotTintBlackFollower.cs

@@ -1,4 +1,4 @@
-/******************************************************************************
+/******************************************************************************
  * Spine Runtimes Software License v2.5
  * Spine Runtimes Software License v2.5
  *
  *
  * Copyright (c) 2013-2016, Esoteric Software
  * Copyright (c) 2013-2016, Esoteric Software

+ 25 - 1
spine-unity/Assets/Examples/Spine/Dragon/dragon.png.meta

@@ -40,7 +40,7 @@ TextureImporter:
     externalNormalMap: 0
     externalNormalMap: 0
     heightScale: 0.25
     heightScale: 0.25
     normalMapFilter: 0
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   grayScaleToAlpha: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   generateCubemap: 6
   cubemapConvolution: 0
   cubemapConvolution: 0
@@ -79,6 +79,30 @@ TextureImporter:
     crunchedCompression: 0
     crunchedCompression: 0
     allowsAlphaSplitting: 0
     allowsAlphaSplitting: 0
     overridden: 0
     overridden: 0
+  - buildTarget: Standalone
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  - buildTarget: Android
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  - buildTarget: WebGL
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
   spriteSheet:
   spriteSheet:
     serializedVersion: 2
     serializedVersion: 2
     sprites:
     sprites:

+ 25 - 1
spine-unity/Assets/Examples/Spine/Dragon/dragon2.png.meta

@@ -38,7 +38,7 @@ TextureImporter:
     externalNormalMap: 0
     externalNormalMap: 0
     heightScale: 0.25
     heightScale: 0.25
     normalMapFilter: 0
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   grayScaleToAlpha: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   generateCubemap: 6
   cubemapConvolution: 0
   cubemapConvolution: 0
@@ -77,6 +77,30 @@ TextureImporter:
     crunchedCompression: 0
     crunchedCompression: 0
     allowsAlphaSplitting: 0
     allowsAlphaSplitting: 0
     overridden: 0
     overridden: 0
+  - buildTarget: Standalone
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  - buildTarget: Android
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  - buildTarget: WebGL
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
   spriteSheet:
   spriteSheet:
     serializedVersion: 2
     serializedVersion: 2
     sprites:
     sprites:

+ 4 - 1
spine-unity/Assets/Examples/Spine/Goblins/goblins_Material.mat

@@ -11,6 +11,7 @@ Material:
   m_ShaderKeywords: 
   m_ShaderKeywords: 
   m_LightmapFlags: 5
   m_LightmapFlags: 5
   m_EnableInstancingVariants: 0
   m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
   m_CustomRenderQueue: -1
   m_CustomRenderQueue: -1
   stringTagMap: {}
   stringTagMap: {}
   disabledShaderPasses: []
   disabledShaderPasses: []
@@ -23,4 +24,6 @@ Material:
         m_Offset: {x: 0, y: 0}
         m_Offset: {x: 0, y: 0}
     m_Floats:
     m_Floats:
     - _Cutoff: 0.1
     - _Cutoff: 0.1
-    m_Colors: []
+    m_Colors:
+    - _Black: {r: 1, g: 0, b: 0, a: 1}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}

+ 76 - 62
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy.atlas.txt → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.atlas.txt

@@ -1,292 +1,306 @@
 
 
-spineboy.png
+spineboy-pro.png
 size: 2048,1024
 size: 2048,1024
 format: RGBA8888
 format: RGBA8888
 filter: Linear,Linear
 filter: Linear,Linear
 repeat: none
 repeat: none
 crosshair
 crosshair
   rotate: false
   rotate: false
-  xy: 1862, 497
+  xy: 1053, 13
   size: 89, 89
   size: 89, 89
   orig: 89, 89
   orig: 89, 89
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 dust01
 dust01
   rotate: true
   rotate: true
-  xy: 748, 372
+  xy: 1239, 11
   size: 96, 73
   size: 96, 73
   orig: 96, 73
   orig: 96, 73
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 dust02
 dust02
   rotate: false
   rotate: false
-  xy: 934, 431
+  xy: 1409, 44
   size: 86, 88
   size: 86, 88
   orig: 86, 88
   orig: 86, 88
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 dust03
 dust03
   rotate: false
   rotate: false
-  xy: 1965, 591
+  xy: 1831, 416
   size: 62, 52
   size: 62, 52
   orig: 62, 52
   orig: 62, 52
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 eye-indifferent
 eye-indifferent
   rotate: false
   rotate: false
-  xy: 1870, 649
+  xy: 1144, 18
   size: 93, 89
   size: 93, 89
   orig: 93, 89
   orig: 93, 89
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 eye-surprised
 eye-surprised
   rotate: false
   rotate: false
-  xy: 823, 380
+  xy: 1314, 43
   size: 93, 89
   size: 93, 89
   orig: 93, 89
   orig: 93, 89
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 front-bracer
 front-bracer
   rotate: true
   rotate: true
-  xy: 1225, 521
+  xy: 1749, 410
   size: 58, 80
   size: 58, 80
   orig: 58, 80
   orig: 58, 80
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 front-fist-closed
 front-fist-closed
   rotate: false
   rotate: false
-  xy: 1022, 441
+  xy: 1592, 396
   size: 75, 82
   size: 75, 82
   orig: 75, 82
   orig: 75, 82
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 front-fist-open
 front-fist-open
-  rotate: true
-  xy: 1953, 439
+  rotate: false
+  xy: 1504, 391
   size: 86, 87
   size: 86, 87
   orig: 86, 87
   orig: 86, 87
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 front-foot
 front-foot
-  rotate: true
-  xy: 1799, 602
+  rotate: false
+  xy: 580, 33
   size: 126, 69
   size: 126, 69
   orig: 126, 69
   orig: 126, 69
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 front-shin
 front-shin
-  rotate: true
-  xy: 278, 2
+  rotate: false
+  xy: 496, 51
   size: 82, 184
   size: 82, 184
   orig: 82, 184
   orig: 82, 184
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 front-thigh
 front-thigh
-  rotate: true
-  xy: 820, 471
+  rotate: false
+  xy: 1504, 277
   size: 48, 112
   size: 48, 112
   orig: 48, 112
   orig: 48, 112
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 front-upper-arm
 front-upper-arm
-  rotate: true
-  xy: 1020, 525
+  rotate: false
+  xy: 1554, 292
   size: 54, 97
   size: 54, 97
   orig: 54, 97
   orig: 54, 97
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 goggles
 goggles
   rotate: true
   rotate: true
-  xy: 1855, 740
+  xy: 1136, 109
   size: 261, 166
   size: 261, 166
   orig: 261, 166
   orig: 261, 166
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 gun
 gun
   rotate: false
   rotate: false
-  xy: 1329, 644
+  xy: 1463, 480
   size: 210, 203
   size: 210, 203
   orig: 210, 203
   orig: 210, 203
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 head
 head
-  rotate: true
-  xy: 1555, 730
+  rotate: false
+  xy: 1753, 724
   size: 271, 298
   size: 271, 298
   orig: 271, 298
   orig: 271, 298
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 hoverboard-board
 hoverboard-board
   rotate: false
   rotate: false
-  xy: 1061, 849
+  xy: 2, 83
   size: 492, 152
   size: 492, 152
   orig: 492, 152
   orig: 492, 152
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 hoverboard-thruster
 hoverboard-thruster
-  rotate: false
-  xy: 710, 29
+  rotate: true
+  xy: 1207, 372
   size: 60, 64
   size: 60, 64
   orig: 60, 64
   orig: 60, 64
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 hoverglow-small
 hoverglow-small
   rotate: false
   rotate: false
-  xy: 2, 9
+  xy: 2, 6
   size: 274, 75
   size: 274, 75
   orig: 274, 75
   orig: 274, 75
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 mouth-grind
 mouth-grind
   rotate: true
   rotate: true
-  xy: 1965, 645
+  xy: 1610, 301
   size: 93, 59
   size: 93, 59
   orig: 93, 59
   orig: 93, 59
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 mouth-oooo
 mouth-oooo
-  rotate: false
-  xy: 1870, 588
+  rotate: true
+  xy: 1486, 139
   size: 93, 59
   size: 93, 59
   orig: 93, 59
   orig: 93, 59
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 mouth-smile
 mouth-smile
-  rotate: false
-  xy: 1953, 527
+  rotate: true
+  xy: 1497, 44
   size: 93, 59
   size: 93, 59
   orig: 93, 59
   orig: 93, 59
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 muzzle-glow
 muzzle-glow
   rotate: false
   rotate: false
-  xy: 820, 521
+  xy: 1304, 234
   size: 198, 198
   size: 198, 198
   orig: 198, 198
   orig: 198, 198
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
+muzzle-ring
+  rotate: true
+  xy: 278, 32
+  size: 49, 209
+  orig: 49, 209
+  offset: 0, 0
+  index: -1
 muzzle01
 muzzle01
   rotate: false
   rotate: false
-  xy: 2, 86
-  size: 474, 275
-  orig: 474, 275
+  xy: 667, 673
+  size: 542, 349
+  orig: 542, 349
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 muzzle02
 muzzle02
   rotate: false
   rotate: false
-  xy: 568, 721
-  size: 491, 280
-  orig: 491, 280
+  xy: 1211, 685
+  size: 540, 337
+  orig: 540, 337
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 muzzle03
 muzzle03
   rotate: false
   rotate: false
-  xy: 2, 363
-  size: 562, 316
-  orig: 562, 316
+  xy: 2, 597
+  size: 663, 425
+  orig: 663, 425
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 muzzle04
 muzzle04
   rotate: false
   rotate: false
-  xy: 2, 681
-  size: 564, 320
-  orig: 564, 320
+  xy: 2, 237
+  size: 596, 358
+  orig: 596, 358
+  offset: 0, 0
+  index: -1
+muzzle05
+  rotate: false
+  xy: 667, 372
+  size: 538, 299
+  orig: 538, 299
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 neck
 neck
   rotate: false
   rotate: false
-  xy: 1020, 678
+  xy: 1504, 234
   size: 36, 41
   size: 36, 41
   orig: 36, 41
   orig: 36, 41
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 portal-bg
 portal-bg
   rotate: false
   rotate: false
-  xy: 1061, 581
+  xy: 600, 104
   size: 266, 266
   size: 266, 266
   orig: 266, 266
   orig: 266, 266
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 portal-flare1
 portal-flare1
   rotate: false
   rotate: false
-  xy: 918, 369
+  xy: 940, 42
   size: 111, 60
   size: 111, 60
   orig: 111, 60
   orig: 111, 60
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 portal-flare2
 portal-flare2
   rotate: true
   rotate: true
-  xy: 1799, 486
+  xy: 600, 375
   size: 114, 61
   size: 114, 61
   orig: 114, 61
   orig: 114, 61
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 portal-flare3
 portal-flare3
   rotate: false
   rotate: false
-  xy: 478, 34
+  xy: 708, 43
   size: 115, 59
   size: 115, 59
   orig: 115, 59
   orig: 115, 59
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 portal-shade
 portal-shade
   rotate: false
   rotate: false
-  xy: 478, 95
+  xy: 868, 104
   size: 266, 266
   size: 266, 266
   orig: 266, 266
   orig: 266, 266
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 portal-streaks1
 portal-streaks1
   rotate: true
   rotate: true
-  xy: 1541, 476
+  xy: 1753, 470
   size: 252, 256
   size: 252, 256
   orig: 252, 256
   orig: 252, 256
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 portsl-streaks2
 portsl-streaks2
   rotate: false
   rotate: false
-  xy: 568, 470
+  xy: 1211, 434
   size: 250, 249
   size: 250, 249
   orig: 250, 249
   orig: 250, 249
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 rear-bracer
 rear-bracer
-  rotate: false
-  xy: 1031, 367
+  rotate: true
+  xy: 1675, 447
   size: 56, 72
   size: 56, 72
   orig: 56, 72
   orig: 56, 72
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 rear-foot
 rear-foot
   rotate: false
   rotate: false
-  xy: 595, 33
+  xy: 825, 42
   size: 113, 60
   size: 113, 60
   orig: 113, 60
   orig: 113, 60
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 rear-shin
 rear-shin
-  rotate: true
-  xy: 1329, 567
+  rotate: false
+  xy: 1675, 505
   size: 75, 178
   size: 75, 178
   orig: 75, 178
   orig: 75, 178
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 rear-thigh
 rear-thigh
-  rotate: true
-  xy: 1119, 514
+  rotate: false
+  xy: 600, 491
   size: 65, 104
   size: 65, 104
   orig: 65, 104
   orig: 65, 104
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 rear-upper-arm
 rear-upper-arm
   rotate: true
   rotate: true
-  xy: 1099, 465
+  xy: 489, 2
   size: 47, 87
   size: 47, 87
   orig: 47, 87
   orig: 47, 87
   offset: 0, 0
   offset: 0, 0
   index: -1
   index: -1
 torso
 torso
   rotate: true
   rotate: true
-  xy: 566, 370
+  xy: 1304, 134
   size: 98, 180
   size: 98, 180
   orig: 98, 180
   orig: 98, 180
   offset: 0, 0
   offset: 0, 0

+ 2 - 2
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy.atlas.txt.meta → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.atlas.txt.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 fileFormatVersion: 2
-guid: baa2a4228a0622e48ade89f9329a21db
-timeCreated: 1497484603
+guid: 9b2378ddc54f1c94fb80411958000a8c
+timeCreated: 1516482805
 licenseType: Free
 licenseType: Free
 TextScriptImporter:
 TextScriptImporter:
   userData: 
   userData: 

File diff suppressed because it is too large
+ 43 - 21
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.json


+ 2 - 2
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy.json.meta → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.json.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 fileFormatVersion: 2
-guid: c4a131ce07ddbbf4fa38e01f472a366f
-timeCreated: 1497484603
+guid: 8160b67e4c41bd041b948b5e5a86e242
+timeCreated: 1516482805
 licenseType: Free
 licenseType: Free
 TextScriptImporter:
 TextScriptImporter:
   userData: 
   userData: 

BIN
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.png


+ 2 - 2
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy.png.meta → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro.png.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 fileFormatVersion: 2
-guid: 775ade7081c168944b4fb20357ce370a
-timeCreated: 1497484603
+guid: 4ea2c33e839afb34c98f66e892b3b2d2
+timeCreated: 1516482806
 licenseType: Free
 licenseType: Free
 TextureImporter:
 TextureImporter:
   fileIDToRecycleName: {}
   fileIDToRecycleName: {}

+ 3 - 3
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy_Atlas.asset → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_Atlas.asset

@@ -9,8 +9,8 @@ MonoBehaviour:
   m_Enabled: 1
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: a6b194f808b1af6499c93410e504af42, type: 3}
   m_Script: {fileID: 11500000, guid: a6b194f808b1af6499c93410e504af42, type: 3}
-  m_Name: spineboy_Atlas
+  m_Name: spineboy-pro_Atlas
   m_EditorClassIdentifier: 
   m_EditorClassIdentifier: 
-  atlasFile: {fileID: 4900000, guid: baa2a4228a0622e48ade89f9329a21db, type: 3}
+  atlasFile: {fileID: 4900000, guid: 9b2378ddc54f1c94fb80411958000a8c, type: 3}
   materials:
   materials:
-  - {fileID: 2100000, guid: 86873d92b9c6412428e6e2d4f827c88b, type: 2}
+  - {fileID: 2100000, guid: f89bbf05902e77242a3ad20f3c927353, type: 2}

+ 2 - 2
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy_Atlas.asset.meta → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_Atlas.asset.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 fileFormatVersion: 2
-guid: 2fc9866d5b475d74b981f97a77312320
-timeCreated: 1497484603
+guid: 2bedc3c43dd49f346a4c9e8a87e2fed7
+timeCreated: 1516482805
 licenseType: Free
 licenseType: Free
 NativeFormatImporter:
 NativeFormatImporter:
   mainObjectFileID: 11400000
   mainObjectFileID: 11400000

+ 3 - 2
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy_Material.mat → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_Material.mat

@@ -6,11 +6,12 @@ Material:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
-  m_Name: spineboy_Material
+  m_Name: spineboy-pro_Material
   m_Shader: {fileID: 4800000, guid: 1e8a610c9e01c3648bac42585e5fc676, type: 3}
   m_Shader: {fileID: 4800000, guid: 1e8a610c9e01c3648bac42585e5fc676, type: 3}
   m_ShaderKeywords: 
   m_ShaderKeywords: 
   m_LightmapFlags: 4
   m_LightmapFlags: 4
   m_EnableInstancingVariants: 0
   m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
   m_CustomRenderQueue: -1
   m_CustomRenderQueue: -1
   stringTagMap: {}
   stringTagMap: {}
   disabledShaderPasses: []
   disabledShaderPasses: []
@@ -18,7 +19,7 @@ Material:
     serializedVersion: 3
     serializedVersion: 3
     m_TexEnvs:
     m_TexEnvs:
     - _MainTex:
     - _MainTex:
-        m_Texture: {fileID: 2800000, guid: 775ade7081c168944b4fb20357ce370a, type: 3}
+        m_Texture: {fileID: 2800000, guid: 4ea2c33e839afb34c98f66e892b3b2d2, type: 3}
         m_Scale: {x: 1, y: 1}
         m_Scale: {x: 1, y: 1}
         m_Offset: {x: 0, y: 0}
         m_Offset: {x: 0, y: 0}
     m_Floats:
     m_Floats:

+ 2 - 2
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy_Material.mat.meta → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_Material.mat.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 fileFormatVersion: 2
-guid: 86873d92b9c6412428e6e2d4f827c88b
-timeCreated: 1497484603
+guid: f89bbf05902e77242a3ad20f3c927353
+timeCreated: 1516482805
 licenseType: Free
 licenseType: Free
 NativeFormatImporter:
 NativeFormatImporter:
   mainObjectFileID: 2100000
   mainObjectFileID: 2100000

+ 3 - 3
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy_SkeletonData.asset → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_SkeletonData.asset

@@ -9,12 +9,12 @@ MonoBehaviour:
   m_Enabled: 1
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: f1b3b4b945939a54ea0b23d3396115fb, type: 3}
   m_Script: {fileID: 11500000, guid: f1b3b4b945939a54ea0b23d3396115fb, type: 3}
-  m_Name: spineboy_SkeletonData
+  m_Name: spineboy-pro_SkeletonData
   m_EditorClassIdentifier: 
   m_EditorClassIdentifier: 
   atlasAssets:
   atlasAssets:
-  - {fileID: 11400000, guid: 2fc9866d5b475d74b981f97a77312320, type: 2}
+  - {fileID: 11400000, guid: 2bedc3c43dd49f346a4c9e8a87e2fed7, type: 2}
   scale: 0.01
   scale: 0.01
-  skeletonJSON: {fileID: 4900000, guid: c4a131ce07ddbbf4fa38e01f472a366f, type: 3}
+  skeletonJSON: {fileID: 4900000, guid: 8160b67e4c41bd041b948b5e5a86e242, type: 3}
   fromAnimation:
   fromAnimation:
   - idle
   - idle
   - run
   - run

+ 2 - 2
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy_SkeletonData.asset.meta → spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy-pro_SkeletonData.asset.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 fileFormatVersion: 2
-guid: 45a15bf53b040de42b2adbc759a40203
-timeCreated: 1497484603
+guid: af38a3de26ed9b84abc2fe7c7f3b209d
+timeCreated: 1516482805
 licenseType: Free
 licenseType: Free
 NativeFormatImporter:
 NativeFormatImporter:
   mainObjectFileID: 11400000
   mainObjectFileID: 11400000

BIN
spine-unity/Assets/Examples/Spine/spineboy-pro/spineboy.png


+ 0 - 195
spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy-unity.atlas

@@ -1,195 +0,0 @@
-
-spineboy-unity.png
-size: 2048,512
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-eye_indifferent
-  rotate: false
-  xy: 652, 113
-  size: 93, 89
-  orig: 93, 89
-  offset: 0, 0
-  index: -1
-eye_surprised
-  rotate: false
-  xy: 747, 118
-  size: 93, 89
-  orig: 93, 89
-  offset: 0, 0
-  index: -1
-front_bracer
-  rotate: true
-  xy: 919, 276
-  size: 58, 80
-  orig: 58, 80
-  offset: 0, 0
-  index: -1
-front_fist_closed
-  rotate: false
-  xy: 1762, 420
-  size: 75, 82
-  orig: 75, 82
-  offset: 0, 0
-  index: -1
-front_fist_open
-  rotate: true
-  xy: 1673, 416
-  size: 86, 87
-  orig: 86, 87
-  offset: 0, 0
-  index: -1
-front_foot
-  rotate: false
-  xy: 1324, 433
-  size: 126, 69
-  orig: 126, 69
-  offset: 0, 0
-  index: -1
-front_foot_bend1
-  rotate: false
-  xy: 184, 30
-  size: 128, 70
-  orig: 128, 70
-  offset: 0, 0
-  index: -1
-front_foot_bend2
-  rotate: false
-  xy: 1214, 409
-  size: 108, 93
-  orig: 108, 93
-  offset: 0, 0
-  index: -1
-front_shin
-  rotate: true
-  xy: 466, 120
-  size: 82, 184
-  orig: 82, 184
-  offset: 0, 0
-  index: -1
-front_thigh
-  rotate: true
-  xy: 739, 209
-  size: 48, 112
-  orig: 48, 112
-  offset: 0, 0
-  index: -1
-front_upper_arm
-  rotate: true
-  xy: 1214, 268
-  size: 54, 97
-  orig: 54, 97
-  offset: 0, 0
-  index: -1
-goggles
-  rotate: false
-  xy: 739, 336
-  size: 261, 166
-  orig: 261, 166
-  offset: 0, 0
-  index: -1
-gun
-  rotate: false
-  xy: 1002, 299
-  size: 210, 203
-  orig: 210, 203
-  offset: 0, 0
-  index: -1
-head
-  rotate: false
-  xy: 466, 204
-  size: 271, 298
-  orig: 271, 298
-  offset: 0, 0
-  index: -1
-mouth_grind
-  rotate: false
-  xy: 1839, 443
-  size: 93, 59
-  orig: 93, 59
-  offset: 0, 0
-  index: -1
-mouth_oooo
-  rotate: false
-  xy: 1934, 443
-  size: 93, 59
-  orig: 93, 59
-  offset: 0, 0
-  index: -1
-mouth_smile
-  rotate: false
-  xy: 1324, 372
-  size: 93, 59
-  orig: 93, 59
-  offset: 0, 0
-  index: -1
-muzzle
-  rotate: false
-  xy: 2, 102
-  size: 462, 400
-  orig: 462, 400
-  offset: 0, 0
-  index: -1
-neck
-  rotate: false
-  xy: 853, 216
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
-rear_bracer
-  rotate: true
-  xy: 1313, 265
-  size: 56, 72
-  orig: 56, 72
-  offset: 0, 0
-  index: -1
-rear_foot
-  rotate: false
-  xy: 1452, 442
-  size: 113, 60
-  orig: 113, 60
-  offset: 0, 0
-  index: -1
-rear_foot_bend1
-  rotate: false
-  xy: 314, 34
-  size: 117, 66
-  orig: 117, 66
-  offset: 0, 0
-  index: -1
-rear_foot_bend2
-  rotate: false
-  xy: 1214, 324
-  size: 103, 83
-  orig: 103, 83
-  offset: 0, 0
-  index: -1
-rear_shin
-  rotate: true
-  xy: 739, 259
-  size: 75, 178
-  orig: 75, 178
-  offset: 0, 0
-  index: -1
-rear_thigh
-  rotate: true
-  xy: 1567, 437
-  size: 65, 104
-  orig: 65, 104
-  offset: 0, 0
-  index: -1
-rear_upper_arm
-  rotate: true
-  xy: 1319, 323
-  size: 47, 87
-  orig: 47, 87
-  offset: 0, 0
-  index: -1
-torso
-  rotate: true
-  xy: 2, 2
-  size: 98, 180
-  orig: 98, 180
-  offset: 0, 0
-  index: -1

+ 56 - 32
spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy.png.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 fileFormatVersion: 2
 guid: 49bb65eefe08e424bbf7a38bc98ec638
 guid: 49bb65eefe08e424bbf7a38bc98ec638
-timeCreated: 1489559535
+timeCreated: 1505356401
 licenseType: Free
 licenseType: Free
 TextureImporter:
 TextureImporter:
   fileIDToRecycleName:
   fileIDToRecycleName:
@@ -57,11 +57,11 @@ TextureImporter:
     filterMode: -1
     filterMode: -1
     aniso: -1
     aniso: -1
     mipBias: -1
     mipBias: -1
-    wrapMode: -1
-  nPOTScale: 1
+    wrapMode: 1
+  nPOTScale: 0
   lightmap: 0
   lightmap: 0
   compressionQuality: 50
   compressionQuality: 50
-  spriteMode: 0
+  spriteMode: 2
   spriteExtrude: 1
   spriteExtrude: 1
   spriteMeshType: 1
   spriteMeshType: 1
   alignment: 0
   alignment: 0
@@ -71,7 +71,7 @@ TextureImporter:
   alphaUsage: 1
   alphaUsage: 1
   alphaIsTransparency: 0
   alphaIsTransparency: 0
   spriteTessellationDetail: -1
   spriteTessellationDetail: -1
-  textureType: 0
+  textureType: 8
   textureShape: 1
   textureShape: 1
   maxTextureSizeSet: 0
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   compressionQualitySet: 0
@@ -85,6 +85,30 @@ TextureImporter:
     crunchedCompression: 0
     crunchedCompression: 0
     allowsAlphaSplitting: 0
     allowsAlphaSplitting: 0
     overridden: 0
     overridden: 0
+  - buildTarget: Standalone
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  - buildTarget: Android
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  - buildTarget: WebGL
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
   spriteSheet:
   spriteSheet:
     serializedVersion: 2
     serializedVersion: 2
     sprites:
     sprites:
@@ -93,7 +117,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 549
         x: 549
-        y: 241
+        y: 239
         width: 93
         width: 93
         height: 89
         height: 89
       alignment: 0
       alignment: 0
@@ -106,7 +130,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 834
         x: 834
-        y: 78
+        y: 76
         width: 93
         width: 93
         height: 89
         height: 89
       alignment: 0
       alignment: 0
@@ -119,7 +143,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 375
         x: 375
-        y: 534
+        y: 532
         width: 80
         width: 80
         height: 58
         height: 58
       alignment: 0
       alignment: 0
@@ -132,7 +156,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 466
         x: 466
-        y: 356
+        y: 354
         width: 82
         width: 82
         height: 75
         height: 75
       alignment: 0
       alignment: 0
@@ -145,7 +169,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 447
         x: 447
-        y: 433
+        y: 431
         width: 86
         width: 86
         height: 87
         height: 87
       alignment: 0
       alignment: 0
@@ -158,7 +182,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 549
         x: 549
-        y: 170
+        y: 168
         width: 126
         width: 126
         height: 69
         height: 69
       alignment: 0
       alignment: 0
@@ -171,7 +195,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 375
         x: 375
-        y: 404
+        y: 402
         width: 70
         width: 70
         height: 128
         height: 128
       alignment: 0
       alignment: 0
@@ -184,7 +208,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 275
         x: 275
-        y: 586
+        y: 584
         width: 93
         width: 93
         height: 108
         height: 108
       alignment: 0
       alignment: 0
@@ -197,7 +221,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 466
         x: 466
-        y: 170
+        y: 168
         width: 81
         width: 81
         height: 184
         height: 184
       alignment: 0
       alignment: 0
@@ -210,7 +234,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 214
         x: 214
-        y: 704
+        y: 702
         width: 48
         width: 48
         height: 112
         height: 112
       alignment: 0
       alignment: 0
@@ -223,7 +247,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 214
         x: 214
-        y: 818
+        y: 816
         width: 54
         width: 54
         height: 97
         height: 97
       alignment: 0
       alignment: 0
@@ -236,7 +260,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 466
         x: 466
-        y: 2
+        y: 0
         width: 261
         width: 261
         height: 166
         height: 166
       alignment: 0
       alignment: 0
@@ -249,7 +273,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 2
         x: 2
-        y: 704
+        y: 702
         width: 210
         width: 210
         height: 203
         height: 203
       alignment: 0
       alignment: 0
@@ -262,7 +286,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 2
         x: 2
-        y: 404
+        y: 402
         width: 271
         width: 271
         height: 298
         height: 298
       alignment: 0
       alignment: 0
@@ -275,7 +299,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 929
         x: 929
-        y: 69
+        y: 67
         width: 93
         width: 93
         height: 59
         height: 59
       alignment: 0
       alignment: 0
@@ -288,7 +312,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 929
         x: 929
-        y: 130
+        y: 128
         width: 93
         width: 93
         height: 59
         height: 59
       alignment: 0
       alignment: 0
@@ -301,7 +325,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 550
         x: 550
-        y: 332
+        y: 330
         width: 59
         width: 59
         height: 93
         height: 93
       alignment: 0
       alignment: 0
@@ -314,7 +338,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 2
         x: 2
-        y: 2
+        y: 0
         width: 462
         width: 462
         height: 400
         height: 400
       alignment: 0
       alignment: 0
@@ -327,7 +351,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 64
         x: 64
-        y: 977
+        y: 975
         width: 35
         width: 35
         height: 41
         height: 41
       alignment: 0
       alignment: 0
@@ -340,7 +364,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 677
         x: 677
-        y: 170
+        y: 168
         width: 55
         width: 55
         height: 72
         height: 72
       alignment: 0
       alignment: 0
@@ -353,7 +377,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 2
         x: 2
-        y: 909
+        y: 907
         width: 60
         width: 60
         height: 113
         height: 113
       alignment: 0
       alignment: 0
@@ -366,7 +390,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 64
         x: 64
-        y: 909
+        y: 907
         width: 117
         width: 117
         height: 66
         height: 66
       alignment: 0
       alignment: 0
@@ -379,7 +403,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 729
         x: 729
-        y: 78
+        y: 76
         width: 103
         width: 103
         height: 83
         height: 83
       alignment: 0
       alignment: 0
@@ -392,7 +416,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 729
         x: 729
-        y: 2
+        y: 0
         width: 178
         width: 178
         height: 74
         height: 74
       alignment: 0
       alignment: 0
@@ -405,7 +429,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 909
         x: 909
-        y: 2
+        y: 0
         width: 103
         width: 103
         height: 65
         height: 65
       alignment: 0
       alignment: 0
@@ -418,7 +442,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 370
         x: 370
-        y: 594
+        y: 592
         width: 47
         width: 47
         height: 87
         height: 87
       alignment: 0
       alignment: 0
@@ -431,7 +455,7 @@ TextureImporter:
       rect:
       rect:
         serializedVersion: 2
         serializedVersion: 2
         x: 275
         x: 275
-        y: 404
+        y: 402
         width: 98
         width: 98
         height: 180
         height: 180
       alignment: 0
       alignment: 0

+ 2 - 0
spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy_Material Fill.mat

@@ -11,6 +11,7 @@ Material:
   m_ShaderKeywords: 
   m_ShaderKeywords: 
   m_LightmapFlags: 5
   m_LightmapFlags: 5
   m_EnableInstancingVariants: 0
   m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
   m_CustomRenderQueue: -1
   m_CustomRenderQueue: -1
   stringTagMap: {}
   stringTagMap: {}
   disabledShaderPasses: []
   disabledShaderPasses: []
@@ -29,5 +30,6 @@ Material:
     - _RefractionStrength: 0.01
     - _RefractionStrength: 0.01
     - _node_3476: 0
     - _node_3476: 0
     m_Colors:
     m_Colors:
+    - _Black: {r: 0, g: 0, b: 0, a: 0}
     - _Color: {r: 1, g: 1, b: 1, a: 1}
     - _Color: {r: 1, g: 1, b: 1, a: 1}
     - _FillColor: {r: 1, g: 1, b: 1, a: 1}
     - _FillColor: {r: 1, g: 1, b: 1, a: 1}

+ 1 - 1
spine-unity/Assets/Examples/Spine/spineboy-unity/spineboy_Material.mat

@@ -7,7 +7,7 @@ Material:
   m_PrefabParentObject: {fileID: 0}
   m_PrefabParentObject: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_PrefabInternal: {fileID: 0}
   m_Name: spineboy_Material
   m_Name: spineboy_Material
-  m_Shader: {fileID: 4800000, guid: 1e8a610c9e01c3648bac42585e5fc676, type: 3}
+  m_Shader: {fileID: 4800000, guid: 522f03282fd79be47b306e2ef4b593fd, type: 3}
   m_ShaderKeywords: 
   m_ShaderKeywords: 
   m_LightmapFlags: 5
   m_LightmapFlags: 5
   m_EnableInstancingVariants: 0
   m_EnableInstancingVariants: 0

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