January 4th, 2019
Spine 3.7 is here, bringing you many new features, improvements, and bug fixes!
For a full run-down, check out the editor changelog, as well as our runtimes changelog. All the runtimes are already up to date and work with 3.7. Below is a selection of notable new features and other changes.
With the 3.7 release, we have added support for audio! This allows you to preview, synchronize, and iterate on both your graphics and audio assets directly within the Spine editor.
It works by introducing a new node in the hierarchy view called
This is similar to the
Images node: all audio files found in the specified path are listed under the
Audio node in setup mode. Spine currently supports WAV, MP3, and OGG audio formats.
Once you've added an audio file to your project, you can create an event from it by either dropping the audio file on the
Events node or by selecting the audio file and clicking the
New Event button. The end result is a new event wired up with the audio file, ready to be keyed in your animation.
As you can see, events have 3 new properties:
Audio pathspecifies the location of the audio file associated with the event. If this is set, the audio file will be played when a key for this event is hit in an animation.
Volumelets you set the playback volume.
Balancelets you set the volume of the left and right channels for stereo, or set the panning for mono.
When you key an audio event, you can key volume and balance values differently from the setup values:
In this screenshot, the footstep audio event has been keyed twice for Spineboy's walk animation. In the dopesheet, the duration of an audio event is indicated by a purple horizontal line. Above the dopesheet, you can see the new
Audio view. It is synchronized with the dopesheet, showing the waveforms of all active audio events, and allows you to control the master volume and which audio device is used for output. Scrubbing through either the audio view timeline or the dopesheet timeline will also scrub the audio.
We've updated our export system to handle audio. When you export your animations to video, Spine will also include the audio.
The audio playback is an editor-only feature. At runtime, the 3 additional event properties are available but the Spine Runtimes do not manage loading and playing back audio. Synchronizing your audio with your Spine animations at runtime is still managed like before: register an event handler with
TrackEntry to trigger playing the audio you want for each event.
Spine supports one- and two-bone inverse kinematic constraints that keep one or two bones pointing at another target bone. However, these constraints used to be rigid: the bones in the IK chain did not automatically stretch or compress.
In Spine 3.7, we have added additional settings to IK constraints:
Stretch option is available for both one- and two-bone IK constraints. When enabled, all bones in the IK chain will stretch as needed to touch the target bone. However, the bones will not get compressed when the distance to the target bone is smaller than the original bone lengths.
For one-bone IK constraints, the
Compress setting causes compression of a constrained bone for when the distance to the target bone is smaller than the constrained bone's length.
Stretch can be keyed.
For both stretching and compression, the attachments and children of the constrained bones will be scaled on the bone's X axis. For one-bone IK constraints, you can additionally enable the
Uniform setting, so scaling is performed on both axes.
Spine's texture packer can now strip the pixels outside your mesh UVs to reduce the space taken up in your texture atlas. All you need to do is pack a texture atlas with whitespace stripping (for both X and Y) when exporting JSON or binary.
In Spine 3.7, we have completely revamped our export dialogs and added a ton of new export functionality.
The GIF exporter now uses a highly sophisticated quantization algorithm to preserve the colors of your animations as well as possible within the GIF format's constraint of 256 colors. Colors are carefully chosen not just within each frame, but also temporally across frames to prevent flicker during the animation. We have exposed many controls in the export settings so you can find the best parameters for your specific animations to create the absolute best GIFs possible.
We have added additional export formats. APNG is an animated image format similar to GIF, but supports full colors and transparency. The format is supported across all browsers (except Microsoft Internet Explorer and Microsoft Edge), including mobile, and is an excellent alternative to GIF.
We've added support for exporting to the Adobe Photoshop PSD format. Each frame of your animation will be exported to a separate layer. This can be useful when drawing additional attachments with a different perspective, to apply post effects for VFX and other frame-by-frame animations, or to bring an animation into other software as a single file.
You may have noticed the
Preview button in the upper right of the screenshot above. Let's see what happens when it is clicked!
Preview renders the image exactly like it will appear when exported, including any artifacts introduced due to compression or other export settings.
By clicking on
Range you can select a subset of frames to be exported:
One of the most often requested features is the
You can specify the dimensions and position of the viewport used to export your scene!
All video exports now also support exporting audio.
Many Spine users, such as Tom Happ of Axiom Verge fame, are using Spine with their pixel art. We've added pixel grid rendering to support pixel art workflows in Spine. When enabled, Spine will render your pixel art at a 1:1 ratio, then scale the resulting image up to the viewport size, retaining all the pixely goodness:
The feature lets you preview aliasing and other artifacts introduced by retro-style pixel scaling and rotation, right in the Spine editor.
You can enable this feature in the Spine settings. Check out the forum thread on this topic for more insights.
Another often requested feature was to view multiple skins at the same time inside the Spine editor. Previously this could only be done at runtime.
We've now added a new
Skins view. A list of all available skins is shown at the top, with a pin for each. At the bottom is a list of the currently pinned skins. All the pinned skins are visible at the same time, starting with the bottom-most skin. The pinned skins in the bottom list can be dragged to change the order they are applied.
When you select a single skin in the skins view, it becomes the active skin. Only attachments from the active skin can be selected and edited in the viewport. The active skin is always visible -- if not pinned it is considered to be applied last.
The skins view is especially useful to work on characters that mix-and-match skins for different gear and body parts, like in the screenshot above. It is also perfect to satisfy any dress-up-party urges you may have. We know. We've wasted plenty of time just trying out new outfit combinations!
Tree view now features a text box to allow searching for items in the hierarchy. Pressing
enter focuses the text box, then type a value and press
F3) to select the next search result. Using
shift + enter (or
shift + F3) selects the previous result and
escape clears the text box.
You can also check the
Text search filters checkbox in the tree filter popup. When checked, only elements that match the search text will show up in the tree view.
Duplicating a skin now includes many new conveniences, including options for automatic renaming, using linked meshes, and duplicating mesh deform keys. This can save a lot of time when setting up new skins.
The same conveniences are available when creating a new skin placeholder from an existing attachment. Additionally, the attachment can be duplicated for every existing skin!
You can now select vertices, copy, and then later paste them. It's a small thing, but can be very useful! It works on meshes, paths, and bounding boxes. The vertices can even be pasted to a different attachment, as long as the same number of vertices are selected.
We have added additional features to command line exporting!
--clean argument lets you remove unnecessary animation keys from your Spine project. It can also be used when exporting to the Spine JSON or binary formats. You can add this as part of your asset pipeline to ensure your runtime files are as small in size as possible, or to clean up Spine projects in bulk.
--import argument lets you import JSON, binary, or a project's skeletons into another project. This is great if you want to combine existing skeletons into a single Spine project file. When combined with the
--scale flag, you can also scale entire projects from the command line.
You can find examples of these new flags in our documentation on command line exporting.
We have put a lot of effort into improving the runtime part of Spine! For a full overview and engine/framework specific additions and changes, check out the Spine Runtimes changelog as well as the commit log for the 3.7 branch.
Some additions and changes are common to all runtimes. There are only a handful of breaking changes, which shouldn't be terribly hard to fix up:
- The completion event will be delivered to listeners of
TrackEntryfor looped, zero duration animations every frame.
Skeletonhave been replaced with
scaleY. This makes applying transforms simple and is much more powerful, as it allows you to scale the whole skeleton, even if some bones do not inherit scale.
MixPosehas been renamed to
MixBlend. Unless you are working directly with the Timeline API or have modified
AnimationStateyourself, this change is unlikely to affect your existing code.
The most notable additions to all runtimes are:
- Additive animation blending. Normally, when playing animations on separate tracks, the pose from lower tracks are overridden by higher tracks. With an additive track, its pose is added to the result of the lower tracks. This allows effects like blending multiple facial expressions, eg 25% angry, 25% sad, and 50% happy. To enable additive for a track, call
TrackEntry#setMixBlend(MixBlend.add). To specify the blend percentage, set
TrackEntry#alpha. See this forum thread for a discussion.
TrackEntryhas a new field called
holdPrevious. This can be used to counteract a limitation of
AnimationStateresulting in "dipping" of parts of the animation when using many tracks. For a full discussion of the problem and the solution we've implemented, see this forum thread.
- Support for stretchy and compressed IK constraints, as described above.
- Support for audio events. You can query the
EventDatato implement audio playback.
We have closed 200+ runtime issues since the 3.6 release, including bug fixes and requests for enhancements. This wouldn't be possible without your help. Thanks to everyone reporting issues, we hope you keep up this tradition!
We haven't talked about the biggest addition to the Spine Runtimes yet: spine-cpp! It started with an innocent pull request by Stephen Gowen, who contributed a great start to a reference C++ runtime. After more than a month of effort, we were able to complete a first version ready for consumption by users.
However, our Unreal Engine, cocos2d-x, cocos2d-objc and SFML Spine Runtimes are all built on spine-c, the C89 compliant version of our reference implementation. Changing these runtimes to spine-cpp and removing their spine-c based counterparts was not a good option since that might disrupt users.
We therefore decided to have two development branches for our brave beta testers:
3.7-beta, where the only addition is a C++ version of our SFML runtime, and
3.7-beta-cpp, where the Unreal Engine and cocos2d-x runtimes have been switched to spine-cpp. This served us well during the beta phase of Spine 3.7, with many users exploring the idiomatic C++ APIs of spine-cpp and reporting issues to make it production ready.
For our 3.7 release, we have decided to make the spine-cpp based branch the default. If you are a user of Unreal Engine or cocos2d-x with a sizable code base relying on spine-c, we provide you with the
Going forward we will continue maintaining both spine-cpp and spine-c in the 3.7 default branch and merge changes to either runtime into the
3.7-c branch. We will however not backport changes to the Unreal Engine and cocos2d-x runtimes from the 3.7 default branch to the
3.7-c branch. For Spine 3.8, we continue maintaining spine-c but will not continue maintaining the spine-c based Unreal Engine and cocos2d-x runtimes.
Earlier this year, we rolled out our very own workshop offering! Workshops are held by Esoteric Software instructors and are available both on-site and via the web.
We've had a fantastic time with our students the last few months! If you are interested in a Spine workshop, head over to our workshop page and request a workshop today.
There's only so many workshops we can host ourselves! As part of our ongoing effort to educate the world about using Spine, we have reached out to our educational partners across to globe to create a directory of schools, universities, and consultants that can teach you the ins and outs of Spine.
We are more than happy to expand this list of educators by adding your name! If you offer Spine workshops and/or training, hop over to our educational institutions page and submit your course and workshop information.
On our new examples page, we've written up descriptions for each of the example projects that come with Spine. This is a great resource to learn about a variety of rigging techniques and makes the Spine examples much more useful.
Our own Erika Inzitari has started the Esoteric Software Twitch channel this year, where she streams her work with Spine on a weekly basis. Her streams are chocked full of Spine workflow goodies and we highly recommend checking it out! It's a great opportunity to ask questions in a live setting and to see complex rigging in Spine.
All of her streams are uploaded to the Esoteric Software YouTube channel in case you prefer video-on-demand. The description of each YouTube video has topics and links into the video so you can jump to the parts that are interesting to you.
Erika has also invented the Twitter hashtag #skeletember under which she is tweeting one rigging tip each day of September. Consider following her!
With 3.7 out of the door, we can now focus on the new curve editor, as well as features like separate keying of X and Y translation. On the runtime side, we will continue to improve performance, fix bugs, and add support for new game engines, with Godot and Construct at the top of our list. Lastly, we have a secret project in the making that we hope to release soon!
Thanks to all of our users who reported issues, tested the beta, and proposed new features. We couldn't do it without you!
Happy animating! Your Spine Team
Discuss this post on the Spine forum.