Breaking changes
Slot#getAttachmentVertices()
to Slot#getDeform()
..json
curve format and added more assumptions for omitted values, reducing the average size of JSON exports.Skin#addAttachment()
to Skin#setAttachment()
.VertexAttachment#applyDeform()
and replaced it with VertexAttachment#deformAttachment
. The attachment set on this field is used to decide if a DeformTimeline
should be applied to the attachment active on the slot to which the timeline is applied.inheritDeform
field, getter, and setter from MeshAttachment
..skel
binary format, added a string table. References to strings in the data resolve to this string table, reducing storage size of binary files considerably..json
and .skel
file formats to accomodate the new feature and file size optimiations. Old projects must be exported with Spine 3.8.20+ to be compatible with the 3.8 Spine runtimes.Additions
SkeletonBinary
to load binary .skel
files. See MixAndMatchExample.as
in spine-startling-example
.x
and y
coordinates for setup pose AABB in SkeletonData
.Skin#getAttachments()
. Returns all attachments in the skin.Skin#getAttachments(int slotIndex)
. Returns all attachements in the skin for the given slot index.Skin#addSkin(Skin skin)
. Adds all attachments, bones, and skins from the specified skin to this skin.Skin#copySkin(Skin skin)
. Adds all attachments, bones, and skins from the specified skin to this skin. VertexAttachment
are shallowly copied and will retain any parent mesh relationship. All other attachment types are deep copied.Attachment#copy()
to all attachment type implementations. This lets you deep copy an attachment to modify it independently from the original, i.e. when programmatically changing texture coordinates or mesh vertices.MeshAttachment#newLinkedMesh()
, creates a linked mesh linkted to either the original mesh, or the parent of the original mesh.MixAndMatchExample.as
to demonstrate the new Skin API additions and how to load binary .skel
files.Breaking changes
spSlot#attachmentVertices
to spSlot#deform
..json
curve format and added more assumptions for omitted values, reducing the average size of JSON exports.spSkin_addAttachment()
to Skin#spSkin_addAttachment()
.spVertexAttachment_applyDeform()
and replaced it with VertexAttachment#deformAttachment
. The attachment set on this field is used to decide if a spDeformTimeline
should be applied to the attachment active on the slot to which the timeline is applied.inheritDeform
field, getter, and setter from spMeshAttachment
..skel
binary format, added a string table. References to strings in the data resolve to this string table, reducing storage size of binary files considerably..json
and .skel
file formats to accomodate the new feature and file size optimiations. Old projects must be exported with Spine 3.8.20+ to be compatible with the 3.8 Spine runtimes.Additions
x
and y
coordinates for setup pose AABB in spSkeletonData
.spSkin_getAttachments()
. Returns all attachments in the skin.spSkin_getAttachments(int slotIndex)
. Returns all attachements in the skin for the given slot index.spSkin_addSkin(spSkin* skin)
. Adds all attachments, bones, and skins from the specified skin to this skin.spSkin_copySkin(spSkin* skin)
. Adds all attachments, bones, and skins from the specified skin to this skin. spVertexAttachment
are shallowly copied and will retain any parent mesh relationship. All other attachment types are deep copied.spAttachment_copy()
to all attachment type implementations. This lets you deep copy an attachment to modify it independently from the original, i.e. when programmatically changing texture coordinates or mesh vertices.spMeshAttachment_newLinkedMesh()
, creates a linked mesh linkted to either the original mesh, or the parent of the original mesh.IKExample
.SkeletonAnimation preUpdateWorldTransformsListener
and SkeletonAnimation postUpdateWorldTransformsListener
. When set, these callbacks will be invokved before and after the skeleton's updateWorldTransforms()
method is called. See the IKExample
how it can be used.IKExample
.Breaking Changes
Slot::getAttachmentVertices()
to Slot::getDeform()
..json
curve format and added more assumptions for omitted values, reducing the average size of JSON exports.Skin::addAttachment()
to Skin::setAttachment()
.VertexAttachment::applyDeform()
and replaced it with VertexAttachment::getDeformAttachment()
. The attachment set on this field is used to decide if a DeformTimeline
should be applied to the attachment active on the slot to which the timeline is applied._inheritDeform
field, getter, and setter from MeshAttachment
..skel
binary format, added a string table. References to strings in the data resolve to this string table, reducing storage size of binary files considerably..json
and .skel
file formats to accomodate the new feature and file size optimiations. Old projects must be exported with Spine 3.8.20+ to be compatible with the 3.8 Spine runtimes.Additions
AnimationState
and TrackEntry
now also accept a subclass of AnimationStateListenerObject
as a listener for animation events in the overloaded setListener()
method.SkeletonBinary
and SkeletonJson
now parse and set all non-essential data like audio path.x
and y
coordinates for setup pose AABB in SkeletonData
.Skin#getAttachments()
. Returns all attachments in the skin.Skin#getAttachments(int slotIndex)
. Returns all attachements in the skin for the given slot index.Skin#addSkin(Skin &skin)
. Adds all attachments, bones, and skins from the specified skin to this skin.Skin#copySkin(Skin &skin)
. Adds all attachments, bones, and skins from the specified skin to this skin. VertexAttachment
are shallowly copied and will retain any parent mesh relationship. All other attachment types are deep copied.Attachment#copy()
to all attachment type implementations. This lets you deep copy an attachment to modify it independently from the original, i.e. when programmatically changing texture coordinates or mesh vertices.MeshAttachment#newLinkedMesh()
, creates a linked mesh linkted to either the original mesh, or the parent of the original mesh.x
and y
on SkeletonData
through getters and setters.IKExample
.SkeletonAnimation::setPreUpdateWorldTransformsListener()
and SkeletonAnimation::setPreUpdateWorldTransformsListener()
. When set, these callbacks will be invokved before and after the skeleton's updateWorldTransforms()
method is called. See the IKExample
how it can be used.bAutoPlaying
flag to USpineSkeletonAnimationComponent
. When false
, the component will not update the internal animation state and skeleton.USpineSkeletonRendererComponent
allows passing a USpineSkeletonComponent
to update it. This way, the renderer component can be used without a skeleton component on the same actor.SpineSkeletonComponent
and SpineSkeletonAnimationComponent
to query and set skins, and enumerate bones, slots, and animations.RHI
, RenderCore
, and ShaderCore
.SkeletonRendererComponent
are now blueprint read and writeable. This allows setting dynamic material instances at runtimeBreaking changes
IkConstraintData.Bones
type from List<BoneData>
to ExposedList<BoneData>
for unification reasons. Note: this modification will most likely not affect user code.Slot.AttachmentVertices
to Slot.Deform
..json
curve format and added more assumptions for omitted values, reducing the average size of JSON exports.Skin.AddAttachment()
to Skin.SetAttachment()
.FindAttachmentsForSlot(int slotIndex, List<Attachment> attachments)
and FindNamesForSlot (int slotIndex, List<string> names)
and replaced it with Skin.GetAttachments(int slotIndex, List<SkinEntry> attachments)
which returns the combined SkinEntry
object holding both name and attachment.VertexAttachment.ApplyDeform()
and replaced it with VertexAttachment.DeformAttachment
. The attachment set on this field is used to decide if a DeformTimeline
should be applied to the attachment active on the slot to which the timeline is applied.inheritDeform
field, getter, and setter from MeshAttachment
..skel
binary format, added a string table. References to strings in the data resolve to this string table, reducing storage size of binary files considerably..json
and .skel
file formats to accomodate the new feature and file size optimiations. Old projects must be exported with Spine 3.8.20+ to be compatible with the 3.8 Spine runtimes.Additions
x
and y
coordinates for setup pose AABB in SkeletonData
.Skin.GetAttachments()
. Returns all attachments in the skin.Skin.GetAttachments(int slotIndex, List<SkinEntry> attachments)
. Returns all attachements in the skin for the given slot index. This method replaces FindAttachmentsForSlot
and FindNamesForSlot
.Skin.AddSkin(Skin skin)
. Adds all attachments, bones, and skins from the specified skin to this skin.Skin.CopySkin(Skin skin)
. Adds all attachments, bones, and skins from the specified skin to this skin. VertexAttachment
are shallowly copied and will retain any parent mesh relationship. All other attachment types are deep copied.Attachment.Copy()
to all attachment type implementations. This lets you deep copy an attachment to modify it independently from the original, i.e. when programmatically changing texture coordinates or mesh vertices.MeshAttachment.NewLinkedMesh()
, creates a linked mesh linkted to either the original mesh, or the parent of the original mesh.Breaking changes
.asmdef
files are again active by default. They have previously been deactivated to .txt
extension which is now no longer necessary.AnimationState.ClearTrack(0);
followed by var entry = AnimationState.SetAnimation(0, animation, loop); entry.TrackTime = time
to achieve similar behaviour.Shadow alpha cutoff
shader parameter is now respecting slot-color alpha values at all Spine shaders. A fragment's texture color alpha is multiplied with slot-color alpha before the result is tested against the Shadow alpha cutoff
threshold.Attachment.GetClone()
and MeshAttachment.GetLinkedClone()
extension methods. Use methods Attachment.Copy
and MeshAttachment.NewLinkedMesh()
instead.Attachment.GetClone(bool cloneMeshesAsLinked)
to Attachment.GetCopy(bool cloneMeshesAsLinked)
to follow the naming scheme of the Spine API.SkeletonDataAsset.atlasAssets
is now an array of the base class AtlasAssetBase
instead of SpineAtlasAsset
, which provides IEnumerable<> Materials
instead of List<> materials
. Replace any access via atlasAsset.materials[0]
with atlasAsset.Materials.First()
and add a using System.Linq;
statement.MeshAttachment.GetLinkedMesh()
method signatures: removed optional parameters bool inheritDeform = true, bool copyOriginalProperties = false
.Spine.Unity.Modules
to Spine.Unity
and Spine.Unity.Examples
after restructuring (see section below) in respective classes:using Spine.Unity.Modules.AttachmentTools;
with using Spine.Unity.AttachmentTools;
. You can remove using Spine.Unity.Modules;
statements when a using Spine.Unity
statement is already present in the file.AttachmentTools
, SkeletonPartsRenderer
, SkeletonRenderSeparator
, SkeletonRendererCustomMaterials
changed to namespace Spine.Unity
.SkeletonGhost
, SkeletonGhostRenderer
, AtlasRegionAttacher
, SkeletonGraphicMirror
, SkeletonRagdoll
, SkeletonRagdoll2D
, SkeletonUtilityEyeConstraint
, SkeletonUtilityGroundConstraint
, SkeletonUtilityKinematicShadow
changed to namespace Spine.Unity.Examples
.Editor/Utility/SpineEditorUtilities
class into multiple files with partial class qualifier.SpineEditorUtilities.AssetUtility
and SpineEditorUtilities.EditorInstantiation
are now no longer nested. If you receive namespace related errors, replace any occurrance of
SpineEditorUtilities.AssetUtility
with AssetUtility
andSpineEditorUtilities.EditorInstantiation
with EditorInstantiation
.Modules/Timeline
directory and was deactivated by default, making it necessary to activate it via the Spine Preferences. Now the Timeline integration has been moved to an additional UPM package which can be found under Modules/com.esotericsoftware.spine.timeline
.Packages
directory in your project where it will automatically be loaded, or
b) to an arbitrary directory outside the Assets directory and then open Package Manager in Unity, select the +
icon, choose Add package from disk..
and point it to the package.json file.
The Project panel should now show an entry Spine Timeline Extensions
under Packages
. If the directory is not yet listed, you will need to close and re-open Unity to have it display the directory and its contents.SkeletonMecanim
's Layer Mix Mode
enum name MixMode.SpineStyle
has been renamed to MixMode.Hard
. This is most likely not set via code and thus unlikely to be a problem. Serialized scenes and prefabs are unaffected.Additions
SettingsProvider
API, storing settings in a SpineSettings.asset file which can be shared with team members. Your old preferences are automatically migrated to the new system.SkeletonAnimation
and SkeletonMecanim
. All mask interaction modes are supported. See this blog post.Create 2D Hinge Chain
button at SkeletonUtilityBone
inspector, previously only Create 3D Hinge Chain
was available.Packages
directory in your project where it will automatically be loaded, or+
icon, choose Add package from disk..
and point it to the package.json file.If you are using git and Unity 2019.2 or newer versions and receive an error that dependencies could not be resolved by the package manager (only higher versions of Unity's
Lightweight RP
package are available, e.g.6.9.0
and up), please copy the prepared package-UNITYVERSION.json file for your Unity version (e.g.package-2019.2.json
) over the existing package.json file to change the dependency accordingly. Unfortunately Unity's Package Manager does not provide a way to specify a version range for a dependency like "5.7.2 - 6.9.0" yet, so this manual step is necessary for git users.
The Project panel should now show an entry Spine Lightweight RP Shaders
under Packages
. If the directory is not yet listed, you will need to close and re-open Unity to have it display the directory and its contents.
Lightweight Render Pipeline/Spine/Skeleton
, as a lightweight variant of the Spine/Skeleton
shader,Lightweight Render Pipeline/Spine/Skeleton Lit
, as a lightweight variant of the Spine/Skeleton Lit
shader andLightweight Render Pipeline/Spine/Sprite
, as a lightweight variant of the Spine/Sprite/Vertex Lit
and Pixel Lit
shaders, which were not functioning in the lightweight render pipeline. The shaders can be assigned to materials as usual and will respect your settings of the assigned LightweightRenderPipelineAsset
under Project Settings - Graphics
.Premultiply alpha
(PMA) atlas textures in Linear color space. Please export your atlas textures as straight alpha
textures with disabled Premultiply alpha
setting when using Linear color space. You can check the current color space via Project Settings - Player - Other Settings - Color Space.
.com.esotericsoftware.spine.lwrp-shaders-3.8/Examples/LWRP Shaders.unity
that demonstrates usage of the LWRP shaders.Spine/Skeleton Lit ZWrite
shader. This variant of the Spine/Skeleton Lit
shader writes to the depth buffer with configurable depth alpha threshold. Apart from that it is identical to Spine/Skeleton Lit
.End
, Complete
and Interrupt
.WaitForSpineAnimationComplete
now proves an additional bool includeEndEvent
parameter, defaults to false
(previous behaviour).WaitForSpineAnimationEnd
yield instruction.WaitForSpineAnimation
yield instruction which can be configured to wait for any combination of animation track events. It is now used as base class for WaitForSpineAnimationComplete
and WaitForSpineAnimationEnd
.disabled
(previous behaviour).
Applies only when 3+ submeshes are used (2+ materials with alternating order, e.g. "A B A").
If true, MaterialPropertyBlocks are assigned at each material to prevent aggressive batching of submeshes
by e.g. the LWRP renderer, leading to incorrect draw order (e.g. "A1 B A2" changed to "A1A2 B").
You can leave this parameter disabled when everything is drawn correctly to save the additional performance cost.Speed Multiplier
, a start time offset parameter Clip In
, support for blending successive animations by overlapping tracks. An additional Use Blend Duration
parameter (defaults to true) allows for automatic synchronisation of MixDuration with the current overlap blend duration. An additional Spine preferences parameter Use Blend Duration
has been added which can be disabled to default to the previous behaviour before this update.SpriteMask and RectMask2D
example scene added for demonstration of mask setup and interaction.Changes of default values
SkeletonMecanim
's Layer Mix Mode
now defaults to MixMode.MixNext
instead of MixMode.MixAlways
.BlendModeMaterialAsset
and it's instance Default BlendModeMaterials.asset
now have Apply Additive Material
set to true
by default in order to apply all blend modes by default.Deprecated
Modules/SlotBlendModes/SlotBlendModes
component. Changed namespace from Spine.Unity.Modules
to Spine.Unity.Deprecated
. Moved to Deprecated/SlotBlendModes
.Restructuring (Non-Breaking)
Note: The following changes will most likely not affect users of the Spine-Unity runtime as the API remains unchanged and no references are invalidated.
.cginc
files in Modules/Shaders/Sprite
that were also present in the Modules/Shaders/Sprite/CGIncludes
directory.Modules/Shaders
to Shaders
directory.Modules/SkeletonGraphic/Shaders
to Shaders/SkeletonGraphic
.Shaders/Spine-SkeletonLit.shader
to Shaders/Spine-Skeleton-Lit.shader
.SkeletonGraphic
to Components
and Components/Following
except for SkeletonGraphicMirror
which was moved to Spine Examples/Scripts/Sample Components
.BoneFollower
, BoneFollowerGraphic
and PointFollower
from Components
directory to Components/Following
.BoundingBoxFollower
component from Modules/BoundingBoxFollower
to Components/Following
.Modules/SkeletonRenderSeparator
directory to Components/SkeletonRenderSeparator
.Modules/CustomMaterials
directory to Components/SkeletonRendererCustomMaterials
.Asset Types/BlendModeMaterialsAsset.cs
class, Shaders/BlendModes/Default BlendModeMaterials.asset
and materials from Shaders/BlendModes
to SkeletonDataModifierAssets/BlendModeMaterials
directory.Modules/Ghost
directory to Spine Examples/Scripts/Sample Components/Ghost
.Modules/SkeletonUtility Modules
directory to Spine Examples/Scripts/Sample Components/SkeletonUtility Modules
.Modules/AnimationMatchModifier
directory to Spine Examples/Scripts/MecanimAnimationMatchModifier
.SkeletonRagdoll
and SkeletonRagdoll2D
components from Modules/Ragdoll
directory to Spine Examples/Scripts/Sample Components/SkeletonUtility Modules
.AttachmentTools.cs
to Utility
directory.AttachmentTools
into 5 separate files for each contained class. No namespace or other API changes performed.Mesh Generation/SpineMesh
into 4 separate files for each contained class. No namespace or other API changes performed.SkeletonExtensions.cs
to Utility
directory.Modules/YieldInstructions
directory to Utility/YieldInstructions
.PointFollowerEditor
to PointFollowerInspector
for consistency reasons.Breaking changes
Slot#getAttachmentVertices()
to Slot#getDeform()
..json
curve format and added more assumptions for omitted values, reducing the average size of JSON exports.Skin#addAttachment()
to Skin#setAttachment()
.VertexAttachment#applyDeform()
and replaced it with VertexAttachment#deformAttachment
. The attachment set on this field is used to decide if a DeformTimeline
should be applied to the attachment active on the slot to which the timeline is applied.inheritDeform
field, getter, and setter from MeshAttachment
..skel
binary format, added a string table. References to strings in the data resolve to this string table, reducing storage size of binary files considerably.JsonRollback
tool now converts from 3.8 JSON to 3.7..json
and .skel
file formats to accomodate the new feature and file size optimiations. Old projects must be exported with Spine 3.8.20+ to be compatible with the 3.8 Spine runtimes.Additions
x
and y
coordinates for setup pose AABB in SkeletonData
.Skin#getAttachments()
. Returns all attachments in the skin.Skin#getAttachments(int slotIndex)
. Returns all attachements in the skin for the given slot index.Skin#addSkin(Skin skin)
. Adds all attachments, bones, and skins from the specified skin to this skin.Skin#copySkin(Skin skin)
. Adds all attachments, bones, and skins from the specified skin to this skin. VertexAttachment
are shallowly copied and will retain any parent mesh relationship. All other attachment types are deep copied.Attachment#copy()
to all attachment type implementations. This lets you deep copy an attachment to modify it independently from the original, i.e. when programmatically changing texture coordinates or mesh vertices.MeshAttachment#newLinkedMesh()
, creates a linked mesh linkted to either the original mesh, or the parent of the original mesh.SkeletonViewer
can load a skeleton by specifying it as the first argument on the command line.Breaking changes
Slot:getAttachmentVertices()
to Slot#deform
..json
curve format and added more assumptions for omitted values, reducing the average size of JSON exports.Skin:addAttachment()
to Skin#setAttachment()
.VertexAttachment:applyDeform()
and replaced it with VertexAttachment#deformAttachment
. The attachment set on this field is used to decide if a DeformTimeline
should be applied to the attachment active on the slot to which the timeline is applied.inheritDeform
field, getter, and setter from MeshAttachment
..json
file format to accomodate the new feature and file size optimiations. Old projects must be exported with Spine 3.8.20+ to be compatible with the 3.8 Spine runtimes.Additions
x
and y
coordinates for setup pose AABB in SkeletonData
.Skin:getAttachments()
. Returns all attachments in the skin.Skin:getAttachments(slotIndex)
. Returns all attachements in the skin for the given slot index.Skin:addSkin(Skin skin)
. Adds all attachments, bones, and skins from the specified skin to this skin.Skin:copySkin(Skin skin)
. Adds all attachments, bones, and skins from the specified skin to this skin. VertexAttachment
are shallowly copied and will retain any parent mesh relationship. All other attachment types are deep copied.Attachment:copy()
to all attachment type implementations. This lets you deep copy an attachment to modify it independently from the original, i.e. when programmatically changing texture coordinates or mesh vertices.MeshAttachment:newLinkedMesh()
, creates a linked mesh linkted to either the original mesh, or the parent of the original mesh.Breaking changes
MixDirection.in/out
to MixDirection.mixIn/mixOut
as it was crashing a JS compressor.Slot#getAttachmentVertices()
to Slot#getDeform()
..json
curve format and added more assumptions for omitted values, reducing the average size of JSON exports.Skin#addAttachment()
to Skin#setAttachment()
.VertexAttachment#applyDeform()
and replaced it with VertexAttachment#deformAttachment
. The attachment set on this field is used to decide if a DeformTimeline
should be applied to the attachment active on the slot to which the timeline is applied.inheritDeform
field, getter, and setter from MeshAttachment
..skel
binary format, added a string table. References to strings in the data resolve to this string table, reducing storage size of binary files considerably..json
and .skel
file formats to accomodate the new feature and file size optimiations. Old projects must be exported with Spine 3.8.20+ to be compatible with the 3.8 Spine runtimes.Additions
AssetManager#loadBinary()
. AssetManager#get()
will return a Uint8Array
for such assets.SkeletonBinary
. Parses a Uint8Array
.x
and y
coordinates for setup pose AABB in SkeletonData
.Skin#getAttachments()
. Returns all attachments in the skin.Skin#getAttachments(slotIndex: number)
. Returns all attachements in the skin for the given slot index.Skin#addSkin(skin: Skin)
. Adds all attachments, bones, and skins from the specified skin to this skin.Skin#copySkin(skin: Skin)
. Adds all attachments, bones, and skins from the specified skin to this skin. VertexAttachment
are shallowly copied and will retain any parent mesh relationship. All other attachment types are deep copied.Attachment#copy()
to all attachment type implementations. This lets you deep copy an attachment to modify it independently from the original, i.e. when programmatically changing texture coordinates or mesh vertices.MeshAttachment#newLinkedMesh()
, creates a linked mesh linkted to either the original mesh, or the parent of the original mesh.Input
can now take a partially defined implementation of InputListener
.SpinePlayer#setAnimation()
can now be called directly to set the animation being displayed..skel
binary skeleton files by setting the SpinePlayerConfig#skelUrl
field instead of SpinePlayerConfig#jsonUrl
.MixPose
is now called MixBlend
flipX/flipY
has been replaced with scaleX/scaleY
. This cleans up applying transforms and is more powerful. Allows scaling a whole skeleton which has bones that disallow scale inheritanceTrackEntry#timeScale
. See https://github.com/EsotericSoftware/spine-runtimes/issues/1194TrackEntry#setMixBlend(MixBlend.add)
on each track. To specify the blend percentage, set TrackEntry#alpha
. See http://esotericsoftware.com/forum/morph-target-track-animation-mix-mode-9459 for a discussion.audioPath
, volume
and balance
fields on event (data).TrackEntry
has an additional field called holdPrevious
. It can be used to counter act a limitation of AnimationState
resulting in "dipping" of parts of the animation. For a full discussion of the problem and the solution we've implemented, see this forum thread.RaptorExample.as
SkeletonSprite.twoColorTint = true
. In this case the skeleton will use the TwoColorMeshStyle
, which internally uses a different vertex layout and shader. This means that skeletons with two color tinting enabled will break batching and hence increase the number of draw calls in your app.VertexEffect
and implementations JitterEffect
and SwirlEffect
. Allows you to modify vertices before they are submitted for drawing. See Starling changes.StarlingAtlasAttachmentLoader#getTexture()
, see https://github.com/EsotericSoftware/spine-runtimes/commit/ea7dbecb98edc74e439aa9ef90dcf6eed865f718Starling#newRegionAttachment
and Starling#newMeshAttachment
but delegated to the atlas.spAnimationState
and spTrackEntry
will now also be called if a track entry gets disposed as part of disposing an animation state.flipX/flipY
has been replaced with scaleX/scaleY
. This cleans up applying transforms and is more powerful. Allows scaling a whole skeleton which has bones that disallow scale inheritanceTrackEntry#timeScale
. See https://github.com/EsotericSoftware/spine-runtimes/issues/1194spMeshAttachment
has two new fields regionTextureWith
and regionTextureHeight
. These must be set in custom attachment loader. See AtlasAttachmentLoader
.spTransformConstraintData
.Animation#apply
and Timeline#apply
now take enums
MixPoseand
MixDirection` instead of booleansspVertexEffect
and corresponding implementations spJitterVertexEffect
and spSwirlVertexEffect
. Create/dispose through the corresponding spXXXVertexEffect_create()/dispose()
functions. Set on framework/engine specific renderer.extension.h
are not prefixed with _sp
instead of just _
to avoid interference with other libraries.SP_API
macro. Every spine-c function is prefixed with this macro. By default, it is an empty string. Can be used to markup spine-c functions with e.g. `__declspec
when compiling to a dll or linking to that dll.void *userData
to spAnimationState
to be consumed in callbacks.spTrackEntry->mixBlend = SP_MIXBLEND_ADD)
on each track. To specify the blend percentage, set spTrackEntry->alpha
. See http://esotericsoftware.com/forum/morph-target-track-animation-mix-mode-9459 for a discussion.audioPath
, volume
and balance
fields on event (data).spTrackEntry
has an additional field called holdPrevious
. It can be used to counter act a limitation of AnimationState
resulting in "dipping" of parts of the animation. For a full discussion of the problem and the solution we've implemented, see this forum thread.RaptorExample.m
.::update()
method of SkeletonRenderer
is now called, see https://github.com/EsotericSoftware/spine-runtimes/commit/f7bb98185236a6d8f35bfefc70afe4f31e9ec9d2spine-sfml.h
no longer defines SPINE_SHORT_NAMES
to avoid collisions with other APIs. See #1058.SkeletonDrawable
. Use SkeletonDrawable::setUsePremultipliedAlpha()
, see https://github.com/EsotericSoftware/spine-runtimes/commit/34086c1f41415309b2ecce86055f6656fcba2950.json
/.skel
parsers.spAtlasPage_setCustomTextureLoader()
which let's you do texture loading manually. Thanks @jareguo.SkeletonRenderer:setSlotsRange()
and SkeletonRenderer::createWithSkeleton()
. This allows you to split rendering of a skeleton up into multiple parts, and render other nodes in between. See SkeletonRendererSeparatorExample.cpp
for an example.Cocos2dAttachmentLoader
to be used when constructing an Atlas
. Used by default by SkeletonAnimation
and SkeletonRenderer
when creating instances via the createXXX
methods.spXXX
have been replaced with their C++ equivalents spine::XXX
in all public interfaces.new
of C++ classes from spine-cpp should contain (__FILE__, __LINE__)
. This allows the tracking of instantations and detection of memory leaks via the spine::DebugExtension
.SkeletonDrawable
. Use SkeletonDrawable::setUsePremultipliedAlpha()
, see https://github.com/EsotericSoftware/spine-runtimes/commit/34086c1f41415309b2ecce86055f6656fcba2950SkeletonRendererComponent
generates collision meshes by default.SkeletonRendererComponent
. Both ProceduralMeshComponent
and RuntimeMeshComponent
have a bug that generates a new PhysiX file every frame per component. Users are advised to add a separate collision shape to the root scene component of an actor instead.FMemory
allocator by default. This should fix issues on some consoles.RuntimeMeshComponent
, as its maintainance has seized, back to ProceduralMeshComponent
. Existing projects should just work. However, if you run into issues, you may have to remove the old SpineSkeletonRendererComponent
and add a new one to your existing actors.RuntimeMeshComponent
and reversal to ProceduralMeshComponent
, two color tinting is currently not supported. ProceduralMeshComponent
does not support enough vertex attributes for us to encode the second color in the vertex stream. You can remove the RuntimeMeshComponent/
directory from your plugins directory and remove the component from any build.cs
files that may reference it.spXXX
have been replaced with their C++ equivalents spine::XXX
in all public interfaces.new
of C++ classes from spine-cpp should contain (__FILE__, __LINE__)
. This allows the tracking of instantations and detection of memory leaks via the spine::DebugExtension
.spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/SpinePlugin.build.cs
file on how to compile in 4.20 with the latest UBT API changes.UBoneDriverComponent
and UBoneFollowerComponent
are now USceneComponent
instead of UActorComponent
. They either update only themselves, or also the owning UActor
, depending on whether the new flag UseComponentTransform
is set. See https://github.com/EsotericSoftware/spine-runtimes/pull/1175SpineSkeletonComponent
and UTrackEntry
. These allow you to query these objects by name in both C++ and blueprints.Preview Animation
and Preview Skin
properties to SpineSkeletonAnimationComponent
. Enter an animation or skin name to live-preview it in the editor. Enter an empty string to reset the animation or skin.flipX/flipY
has been replaced with scaleX/scaleY
. This cleans up applying transforms and is more powerful. Allows scaling a whole skeleton which has bones that disallow scale inheritanceTrackEntry#timeScale
. See https://github.com/EsotericSoftware/spine-runtimes/issues/1194TrackEntry#MixBlend = MixBlend.add
on each track. To specify the blend percentage, set TrackEntry#Alpha
. See http://esotericsoftware.com/forum/morph-target-track-animation-mix-mode-9459 for a discussion.audioPath
, volume
and balance
fields on event (data).TrackEntry
has an additional field called holdPrevious
. It can be used to counter act a limitation of AnimationState
resulting in "dipping" of parts of the animation. For a full discussion of the problem and the solution we've implemented, see this forum thread..asmdef
file that defines these separately as their own assembly in Unity (Note: Spine .asmdef
files are currently deactivated to .txt
extension, see below). For projects not using assembly definition, you may delete the .asmdef
files. These assembly definitions will be ignored by older versions of Unity that don't support it.
.asmdef
files are now deactivated (using .txt
extension) by default This prevents problems when updating Spine through unitypackages, overwriting the Timeline reference entry in spine-unity.asmdef
(added automatically when enabling Unity 2019 Timeline support, see Timeline Support for Unity 2019
), causing compile errors. In case you want to enable the .asmdef
files, rename the files:
Spine/Runtime/spine-unity.txt
to Spine/Runtime/spine-unity.asmdef
and
Spine/Editor/spine-unity-editor.txt
to Spine/Editor/spine-unity-editor.asmdef
.SkeletonAnimator
has been renamed SkeletonMecanim
to make it more autocomplete-friendly and more obvious at human-glance. The .meta files and guids should remain intact so existing projects and prefabs should not break. However, user code needs to be updated to use SkeletonMecanim
.AtlasAsset
type has been renamed to SpineAtlasAsset
to signify that it specifically uses a Spine/libGDX atlas as its source. Serialization should be intact but user code will need to be updated to refer to existing atlases as SpineAtlasAsset
.
SpineAtlasAsset
now has an abstract base class called SpineAtlasAsset
. This is the base class to derive when using alternate atlas sources. Existing SkeletonDataAsset field "atlasAssets" now have the "AtlasAssetBase" type. Serialization should be intact, but user code will need to be updated to refer to the atlas assets accordingly._STRAIGHT_ALPHA_INPUT
shader_feature, toggled as a checkbox in the Material's inspector. This allows the Material to use a non-premultiplied alpha/straight alpha input texture.
Spine/Skeleton
Spine/Skeleton Tint Black
Spine/Skeleton Lit
Spine/Skeleton Tint
Spine/Skeleton Fill
Spine/SkeletonGraphic (Premultiply Alpha)
was renamed to Spine/SkeletonGraphic
Spine/SkeletonGraphic Tint Black (Premultiply Alpha)
was renamed to Spine/SkeletonGraphic Tint Black
Spine/Skeleton PMA Multiply
Spine/Skeleton PMA Screen
Spine/Straight Alpha/Skeleton Fill
Spine/Straight Alpha/Skeleton Tint
Premultiply alpha
enabled, it is important to configure Unity's texture import settings correctly. By default, you will now receive warnings where texture settings are expected to cause incorrect rendering.
sRGB (Color Texture)
shall be disabled when Generate Mip Maps
is enabled, otherwise you will receive white border outlines.Alpha Is Transparency
shall be disabled on Premultiply alpha
textures, otherwise you will receive light ghosting artifacts in transparent areas.Edit - Preferences - Spine
.Skeleton Animation
and Skeleton Mecanim
components now provide an additional Mask Interaction
field in the Inspector, covering identical functionality as Unity's built in Sprite Renderer
component:
Mask Interaction
modes:
None
- The sprite will not interact with the masking system. Default behavior.Visible Inside Mask
- The sprite will be visible only in areas where a mask is present.Visible Outside Mask
- The sprite will be visible only in areas where no mask is present.Automatically Generated Materials
When switching Mask Interaction
modes in the Inspector outside of Play mode, the required additional material assets are generated for the respective Stencil Compare
parameters - with file suffixes '_InsideMask'
and '_OutsideMask'
, placed in the same folder as the original materials. By default all generated materials are kept as references by the Skeleton Animation
component for switching at runtime.
These materials can be managed and optimized via the SkeletonAnimation
's Advanced
section:Clear
button you can clear the reference to unneeded materials,Delete
button the respective assets are deleted as well as references cleared. Note that other Skeleton Animation
GameObjects might still reference the materials, so use with caution!Set
button you can again assign a link to the respective materials to prepare them for runtime use. If the materials were not present or have been deleted, they are generated again based on the default materials.Mask Interaction
mode at runtime, the previously prepared materials are switched active automatically. When the respective materials have not been prepared, material copies of the default materials are created on the fly. Note that these materials are not shared between similar Skeleton Animation
GameObjects, so it is recommended to use the generated material assets where possible.Stencil Compare
parameter for further customization. This way you have maximum flexibility to use custom mechanisms to switch materials at runtime if you should ever need more than the three materials generated by Skeleton Animation
's Mask Interaction
parameter. Reference Stencil Compare
values are:CompareFunction.Disabled
for Mask Interaction - None
CompareFunction.LessEqual
for Mask Interaction - Visible Inside Mask
CompareFunction.Greater
for Mask Interaction - Visible Outside Mask
SkeletonGraphic
shaders 'Spine/SkeletonGraphic
' and 'Spine/SkeletonGraphic Tint Black
' now respect masking areas defined via Unity's RectMask2D
component.Edit - Preferences - Spine
and at Timeline Package Support
hit Enable
to automatically perform all necessary steps to activate the Timeline components.
This will automatically:
SPINE_TIMELINE_PACKAGE_DOWNLOADED
for all platformsspine-unity.asmdef
file by adding the reference to the Unity Timeline library.Create 2D Hinge Chain
functionality at SkeletonUtilityBone
inspector, previously only Create 3D Hinge Chain
was available.Effect
to be used by SkeletonRenderer
IVertexEffect
to modify vertices of skeletons on the CPU. IVertexEffect
instances can be set on the SkeletonRenderer
. See example project.SkeletonDebugRenderer
MeshBatcher
of SkeletonRenderer accessible via a getter. Allows user to batch their own geometry together with skeleton meshes for maximum batching instead of using XNA SpriteBatcher.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.MixPose
is now called MixBlend
.flipX/flipY
has been replaced with scaleX/scaleY
. This cleans up applying transforms and is more powerful. Allows scaling a whole skeleton which has bones that disallow scale inheritanceTrackEntry#timeScale
. See https://github.com/EsotericSoftware/spine-runtimes/issues/1194EventData#audioPath
field. This field contains the file name of the audio file used for the event.TrackEntry#setMixBlend(MixBlend.add)
on each track. To specify the blend percentage, set TrackEntry#alpha
. See http://esotericsoftware.com/forum/morph-target-track-animation-mix-mode-9459 for a discussion.audioPath
, volume
and balance
fields on event (data).TrackEntry
has an additional field called holdPrevious
. It can be used to counter act a limitation of AnimationState
resulting in "dipping" of parts of the animation. For a full discussion of the problem and the solution we've implemented, see this forum thread.VertexEffect
interface, instances of which can be set on SkeletonRenderer
. Allows to modify vertices before submitting them to GPU. See SwirlEffect
, JitterEffect
and VertexEffectTest
.TwoColorPolygonBatch
implements the Batch
interface, allowing to the be used with other libGDX classes that require a batcher for drawing, potentially improving performance. See https://github.com/EsotericSoftware/spine-runtimes/commit/a46b3d1d0c135d51f9bef9ca17a5f8e5dda69927SkeletonDrawable
to render skeletons in scene2d UI https://github.com/EsotericSoftware/spine-runtimes/commit/b93686c185e2c9d5466969a8e07eee573ebe4b97flipX/flipY
has been replaced with scaleX/scaleY
. This cleans up applying transforms and is more powerful. Allows scaling a whole skeleton which has bones that disallow scale inheritanceTrackEntry#timeScale
. See https://github.com/EsotericSoftware/spine-runtimes/issues/1194JitterEffect
and SwirlEffect
and support for vertex effects in Corona and LoveTrackEntry:setMixBlend(MixBlend.add)
on each track. To specify the blend percentage, set TrackEntry.alpha
. See http://esotericsoftware.com/forum/morph-target-track-animation-mix-mode-9459 for a discussion.audioPath
, volume
and balance
fields on event (data).TrackEntry
has an additional field called holdPrevious
. It can be used to counter act a limitation of AnimationState
resulting in "dipping" of parts of the animation. For a full discussion of the problem and the solution we've implemented, see this forum thread.Skeleton.vertexEffect
. See main.lua
for an example.SkeletonRenderer.vertexEffect
. See main.lua
for an exampleflipX/flipY
has been replaced with scaleX/scaleY
. This cleans up applying transforms and is more powerful. Allows scaling a whole skeleton which has bones that disallow scale inheritanceTrackEntry#timeScale
. See https://github.com/EsotericSoftware/spine-runtimes/issues/1194AssetManager.loadTextureAtlas
. Instead of loading the .atlas
and corresponding image files manually, you can simply specify the location of the .atlas
file and AssetManager will load the atlas and all its images automatically. AssetManager.get("atlasname.atlas")
will then return an instance of spine.TextureAtlas
.TrackEntry#setMixBlend(MixBlend.add)
on each track. To specify the blend percentage, set TrackEntry#alpha
. See http://esotericsoftware.com/forum/morph-target-track-animation-mix-mode-9459 for a discussion. See https://github.com/EsotericSoftware/spine-runtimes/blob/f045d221836fa56191ccda73dd42ae884d4731b8/spine-ts/webgl/tests/test-additive-animation-blending.html for an example.audioPath
, volume
and balance
fields on event (data).TrackEntry
has an additional field called holdPrevious
. It can be used to counter act a limitation of AnimationState
resulting in "dipping" of parts of the animation. For a full discussion of the problem and the solution we've implemented, see this forum thread.VertexEffect
interface, instances of which can be set on SkeletonRenderer
. Allows to modify vertices before submitting them to GPU. See SwirlEffect
, JitterEffect
, and the example which allows to set effects.slotRangeStart
and slotRangeEnd
parameters to SkeletonRenderer#draw
and SceneRenderer#drawSkeleton
. This allows you to render only a range of slots in the draw order. See spine-ts/webgl/tests/test-slot-range.html
for an example.SceneRenderer#drawTextureUV()
, allowing to draw a texture with manually specified texture coordinates.SceneRenderer
.VertexEffect
interface, instances of which can be set on SkeletonMesh
. Allows to modify vertices before submitting them to GPU. See SwirlEffect
, JitterEffect
.atlasContent
, atlasPagesContent
, and jsonContent
to WidgetConfiguration
allowing you to directly pass the contents of the .atlas
, atlas page .png
files, and the .json
file without having to do a request. See README.md
and the example for details.SpineWidget.setAnimation()
now takes an additional optional parameter for callbacks when animations are completed/interrupted/etc.Breaking changes
Bone.worldToLocalRotationX
and Bone.worldToLocalRotationY
. Replaced by Bone.worldToLocalRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).Bone
fields _a
, _b
, _c
, _d
, _worldX
and _worldY
public, removed underscore prefix.VertexAttachment.computeWorldVertices
overload, changed VertexAttachment.computeWorldVertices2
to VertexAttachment.computeWorldVertices
, added stride
parameter.RegionAttachment.vertices
field. The vertices array is provided to RegionAttachment.computeWorldVertices
by the API user now.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.r
, g
, b
, a
fields with instances of new Color
class in RegionAttachment
, MeshAttachment
, Skeleton
, SkeletonData
, Slot
and SlotData
.Additions
Skeleton.getBounds
from reference implementation.TransformConstraintData
Bone.localToWorldRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).TwoColorTimeline
and additional fields on Slot
and SlotData
.PointAttachment
, additional method newPointAttachment
in AttachmentLoader
interface.ClippingAttachment
, additional method newClippingAttachment
in AttachmentLoader
interface.AnimationState#apply
returns boolean indicating if any timeline was applied or not.Animation#apply
and Timeline#apply
now take enums
MixPoseand
MixDirection` instead of booleansVertexEffect
and implementations JitterEffect
and SwirlEffect
. Allows you to modify vertices before they are submitted for drawing. See Starling changes.RaptorExample.as
SkeletonSprite.twoColorTint = true
. In this case the skeleton will use the TwoColorMeshStyle
, which internally uses a different vertex layout and shader. This means that skeletons with two color tinting enabled will break batching and hence increase the number of draw calls in your app.spVertexAttachment_computeWorldVertices
and spRegionAttachment_computeWorldVerticeS
now take new parameters to make it possible to directly output the calculated vertex positions to a vertex buffer. Removes the need for additional copies in the backends' respective renderers.spBoundingBoxAttachment_computeWorldVertices
, superseded by spVertexAttachment_computeWorldVertices
.spPathAttachment_computeWorldVertices
and spPathAttachment_computeWorldVertices1
, superseded by spVertexAttachment_computeWorldVertices
.sp_MeshAttachment_computeWorldVertices
, superseded by spVertexAttachment_computeWorldVertices
.spBone_worldToLocalRotationX
and spBone_worldToLocalRotationY
. Replaced by spBone_worldToLocalRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).r
, g
, b
, a
fields with instances of new spColor
struct in spRegionAttachment
, spMeshAttachment
, spSkeleton
, spSkeletonData
, spSlot
and spSlotData
.spVertexIndex
from public API.spAnimationState
or spTrackEntry
will now be also called in case a track entry is disposed as part of dispoing the spAnimationState
.spTransformConstraintData
.spPointAttachment
, additional method spAtlasAttachmentLoadeR_newPointAttachment
.TransformConstraintData
spBone_localToWorldRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).spTwoColorTimeline
and additional fields on spSlot
and spSlotData
.userData
field to spTrackEntry
, so users can expose data in spAnimationState
callbacks.Array.h/.c
spClippingAttachment
and respective enum.spSkeletonClipper
and spTriangulator
, used to implement software clipping of attachments.AnimationState#apply
returns boolean indicating if any timeline was applied or not.Animation#apply
and Timeline#apply
now take enums
MixPoseand
MixDirection` instead of booleansspVertexEffect
and corresponding implementations spJitterVertexEffect
and spSwirlVertexEffect
. Create/dispose through the corresponding spXXXVertexEffect_create()/dispose()
functions. Set on framework/engine specific renderer. See changes for spine-c based frameworks/engines below.extension.h
are not prefixed with _sp
instead of just _
to avoid interference with other libraries.SP_API
macro. Every spine-c function is prefixed with this macro. By default, it is an empty string. Can be used to markup spine-c functions with e.g. `__declspec
when compiling to a dll or linking to that dll.SkeletonRenderer
, resulting in 15% performance increase for large numbers of skeletons being rendered per frame.SkeletonRenderer
/SkeletonAnimation
instance. Use SkeletonRenderer::setTwoColorTint()
. Note that two color tinting requires the use of a non-standard shader and vertex format. This means that skeletons rendered with two color tinting will break batching. However, skeletons with two color tinting enabled and rendered after each other will be batched.SkeletonRenderer::setDebugMeshesEnabled()
.RaptorExample.cpp
.spAtlasPage_setCustomTextureLoader()
which let's you do texture loading manually. Thanks @jareguo.SkeletonRenderer:setSlotsRange()
and SkeletonRenderer::createWithSkeleton()
. This allows you to split rendering of a skeleton up into multiple parts, and render other nodes in between. See SkeletonRendererSeparatorExample.cpp
for an example.SkeletonRenderer/SkeletonAnimation.twoColorTint = true
. Note that two color tinted skeletons do not batch with other nodes.SkeletonDrawable
.Color
. This allows to set the tint color of the skeleton in the editor, C++ and Blueprints. Under the hood, the spSkeleton->color
will be set on every tick of the renderer component.spine-ue4\Plugins\
to your project as well!Breaking changes
MeshAttachment.parentMesh
is now a private field to enforce using the .ParentMesh
setter property in external code. The MeshAttachment.ParentMesh
property is an appropriate replacement wherever .parentMesh
was used.Skeleton.GetBounds
takes a scratch array as input so it doesn't have to allocate a new array on each invocation itself. Reduces GC activity.Bone.WorldToLocalRotationX
and Bone.WorldToLocalRotationY
. Replaced by Bone.WorldToLocalRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).stride
parameter to VertexAttachment.ComputeWorldVertices
.RegionAttachment.Vertices
field. The vertices array is provided to RegionAttachment.ComputeWorldVertices
by the API user now.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.The completion event will fire for looped 0 duration animations every frame.
Additions
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 PointAttachment
, additional method NewPointAttachment
in AttachmentLoader
interface.
Added ClippingAttachment
, additional method NewClippingAttachment
in AttachmentLoader
interface.
Added SkeletonClipper
and Triangulator
, used to implement software clipping of attachments.
AnimationState.Apply
returns a bool indicating if any timeline was applied or not.
Animation.Apply
and Timeline.Apply
now take enums
MixPoseand
MixDirection` instead of bools.
Spine/Skeleton Tint Black
shader, or your own shader that treats the UV2 and UV3 streams similarly.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.ClippingAttachment
s when using on large numbers of skeletons.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.[SpineIkConstraint]
[SpineTransformConstraint]
[SpinePathConstraint]
includeNone
optional parameter to specify if you want to include or exclude a none ("") value option in the dropdown menu. Default is includeNone:true
.Advanced...
foldout in the SkeletonAnimation inspector, or in SkeletonAnimation's right-click/context menu.
AttachmentTools
methods can now accept a sourceMaterial
argument to copy material properties from.Append(Skin)
, RemoveAttachment
and Clear
have been added.Rigidbody
or Rigidbody2D
if it detects a collider of the appropriate type. Having a rigidbody on a moving transform with a collider fits better with the Unity physics systems and prevents excess calculations. It will not detect colliders on child objects so you have to add Rigidbody components manually accordingly.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.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/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.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.
SkeletonRenderer.renderMeshes
optimization is currently non-functional.SkeletonRenderer
. Please use shaders that have backface culling off.SkeletonGraphic
can now be accessed under SkeletonGraphic.MeshGenerator.settings
. This is visible in the SkeletonGraphic inspector as Advanced...
SkeletonAnimator
now uses a SkeletonAnimator.MecanimTranslator
class to translate an Animator's Mecanim State Machine into skeleton poses. This makes code reuse possible for a Mecanim version of SkeletonGraphic.SkeletonAnimator
autoreset
and the mixModes
array are now a part of SkeletonAnimator's MecanimTranslator .Translator
. autoReset
is set to true by default. Old prefabs and scene objects with Skeleton Animator may no longer have correct values set.RegionBatcher
and SkeletonRegionRenderer
, renamed SkeletonMeshRenderer
to SkeletonRenderer
SpineEffect.fx
file to your content project, then load it via var effect = Content.Load<Effect>("SpineEffect");
, and set it on the SkeletonRenderer
. See the example project for code.Effect
to be used by SkeletonRenderer
IVertexEffect
to modify vertices of skeletons on the CPU. IVertexEffect
instances can be set on the SkeletonRenderer
. See example project.SkeletonDebugRenderer
MeshBatcher
of SkeletonRenderer accessible via a getter. Allows user to batch their own geometry together with skeleton meshes for maximum batching instead of using XNA SpriteBatcher.Breaking changes
Skeleton.getBounds
takes a scratch array as input so it doesn't have to allocate a new array on each invocation itself. Reduces GC activity.Bone.worldToLocalRotationX
and Bone.worldToLocalRotationY
. Replaced by Bone.worldToLocalRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).stride
parameter to VertexAttachment.computeWorldVertices
.RegionAttachment.vertices
field. The vertices array is provided to RegionAttachment.computeWorldVertices
by the API user now.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.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.Additions
TransformConstraintData
Bone.localToWorldRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).TwoColorTimeline
and additional fields on Slot
and SlotData
.PointAttachment
, additional method newPointAttachment
in AttachmentLoader
interface.ClippingAttachment
, additional method newClippingAttachment
in AttachmentLoader
interface.SkeletonClipper
and Triangulator
, used to implement software clipping of attachments.AnimationState#apply
returns boolean indicating if any timeline was applied or not.Animation#apply
and Timeline#apply
now take enums
MixPoseand
MixDirection` instead of booleansTwoColorPolygonBatch
together with SkeletonRenderer
SkeletonClipper
. Used automatically by SkeletonRenderer
. Does not work when using a SpriteBatch
with SkeletonRenderer
. Use PolygonSpriteBatch
or TwoColorPolygonBatch
instead.VertexEffect
interface, instances of which can be set on SkeletonRenderer
. Allows to modify vertices before submitting them to GPU. See SwirlEffect
, JitterEffect
and VertexEffectTest
.Bone:worldToLocalRotationX
and Bone:worldToLocalRotationY
. Replaced by Bone:worldToLocalRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).VertexAttachment:computeWorldVertices
now takes offsets and stride to allow compositing vertices directly in a vertex buffer to be send to the GPU. The compositing is now performed in the backends' respective renderers. This also affects the subclasses MeshAttachment
, BoundingBoxAttachment
and PathAttachment
.RegionAttachment:updateWorldVertices
, added RegionAttachment:computeWorldVertices
, which takes offsets and stride to allow compositing vertices directly in a vertex buffer to be send to the GPU. The compositing is now performed in the backends' respective renderers.MeshAttachment.worldVertices
field. Computation is now performed in each backends' respective renderer. The uv
coordinates are now stored in MeshAttachment.uvs
.RegionAttachment.vertices
field. Computation is now performed in each backends respective renderer. The uv
coordinates for each vertex are now stored in the RegionAttachment.uvs
field.Bone:localToWorldRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).TwoColorTimeline
and additional fields on Slot
and SlotData
.PointAttachment
, additional method newPointAttachment
in AttachmentLoader
interface.TransformConstraintData
ClippingAttachment
, additional method newClippingAttachment
in AttachmentLoader
interface.SkeletonClipper
and Triangulator
, used to implement software clipping of attachments.AnimationState#apply
returns boolean indicating if any timeline was applied or not.Animation#apply
and Timeline#apply
now take enums
MixPoseand
MixDirection` instead of booleansJitterEffect
and SwirlEffect
and support for vertex effects in Corona and LoveSkeletonRenderer.new(true)
.Skeleton.vertexEffect
. See main.lua
for an example.SkeletonRenderer.vertexEffect
. See main.lua
for an exampleBreaking changes
Skeleton.getBounds
takes a scratch array as input so it doesn't have to allocate a new array on each invocation itself. Reduces GC activity.Bone.worldToLocalRotationX
and Bone.worldToLocalRotationY
. Replaced by Bone.worldToLocalRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).VertexAttachment.computeWorldVertices
overload, changed VertexAttachment.computeWorldVerticesWith
to VertexAttachment.computeWorldVertices
, added stride
parameter.RegionAttachment.vertices
field. The vertices array is provided to RegionAttachment.computeWorldVertices
by the API user now.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
TransformConstraintData
Bone.localToWorldRotation
(rotation given relative to x-axis, counter-clockwise, in degrees).TwoColorTimeline
and additional fields on Slot
and SlotData
.PointAttachment
, additional method newPointAttachment
in AttachmentLoader
interface.ClippingAttachment
, additional method newClippingAttachment
in AttachmentLoader
interface.SkeletonClipper
and Triangulator
, used to implement software clipping of attachments.AnimationState#apply
returns boolean indicating if any timeline was applied or not.Animation#apply
and Timeline#apply
now take enums
MixPoseand
MixDirection` instead of booleansAssetManager.loadTextureAtlas
. Instead of loading the .atlas
and corresponding image files manually, you can simply specify the location of the .atlas
file and AssetManager will load the atlas and all its images automatically. AssetManager.get("atlasname.atlas")
will then return an instance of spine.TextureAtlas
.Restorable
interface, implemented by any WebGL resource that needs restoration after a context loss. All WebGL resource classes (Shader
, Mesh
, GLTexture
) implement this interface.ManagedWebGLRenderingContext
. Handles setup of a WebGLRenderingContext
given a canvas element and restoration of WebGL resources (Shader
, Mesh
, GLTexture
) on WebGL context loss. WebGL resources register themselves with the ManagedWebGLRenderingContext
. If the context is informed of a context loss and restoration, the registered WebGL resources' restore()
method is called. The restore()
method implementation on each resource type will recreate the GPU side objects.WebGLRenderingContext
in the constructor now also allow a ManagedWebGLRenderingContext
. This ensures existing applications do not break.ManagedWebGLRenderingContext
, passing the canvas to the constructor. This will setup a WebGLRenderingContext
internally and manage context loss/restoration.ManagedWebGLRenderingContext
to the constructors of classes that you previously passed a WebGLRenderingContext
to (AssetManager
, GLTexture
, Mesh
, Shader
, PolygonBatcher
, SceneRenderer
, ShapeRenderer
, SkeletonRenderer
, SkeletonDebugRenderer
).DYNAMIC_DRAW
for vertex buffer objects and fixing bug that copied to much data to the GPU each frame in PolygonBatcher
/Mesh
.SceneRenderer
, SkeletonRenderer
and PolygonBatcher
. Note that you will need to use a shader created via Shader.newTwoColoredTexturedShader
shader with SkeletonRenderer
and PolygonBatcher
if two color tinting is enabled.VertexEffect
interface, instances of which can be set on SkeletonRenderer
. Allows to modify vertices before submitting them to GPU. See SwirlEffect
, JitterEffect
, and the example which allows to set effects.slotRangeStart
and slotRangeEnd
parameters to SkeletonRenderer#draw
and SceneRenderer#drawSkeleton
. This allows you to render only a range of slots in the draw order. See spine-ts/webgl/tests/test-slot-range.html
for an example.VertexEffect
interface, instances of which can be set on SkeletonMesh
. Allows to modify vertices before submitting them to GPU. See SwirlEffect
, JitterEffect
.atlasContent
, atlasPagesContent
, and jsonContent
to WidgetConfiguration
allowing you to directly pass the contents of the .atlas
, atlas page .png
files, and the .json
file without having to do a request. See README.md
and the example for details.SpineWidget.setAnimation()
now takes an additional optional parameter for callbacks when animations are completed/interrupted/etc.