From c0901ba302f3651c410bf446fb520a27694f2cfa Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Tue, 31 May 2022 18:37:30 +0200 Subject: [PATCH 1/9] [unity] Added `OnAnimationRebuild` callback delegate to skeleton components, called after animation state has been initialized. Breaking: `SkeletonGraphic.OnRebuild` is now called after skeleton is initialized, but before initializing animation state. --- CHANGELOG.md | 6 ++++-- .../Components/SkeletonAnimation.cs | 9 +++++++- .../spine-unity/Components/SkeletonGraphic.cs | 21 ++++++++++++------- .../spine-unity/Components/SkeletonMecanim.cs | 9 +++++++- .../Runtime/spine-unity/ISkeletonAnimation.cs | 2 ++ 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0b1cdf57..8289bf037 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,8 +83,12 @@ * Timeline clips now offer an additional `Alpha` parameter for setting a custom constant mix alpha value other than 1.0, just as `TrackEntry.Alpha`. Defaults to 1.0. * `GetRemappedClone` copying from `Sprite` now provides additional `pmaCloneTextureFormat` and `pmaCloneMipmaps` parameters to explicitly specify the texture format of a newly created PMA texture. * Spine property Inspector fields (`Animation Name`, `Bone Name`, `Slot` and similar) now display the name in red when the respective animation/bone/etc no longer exists at the skeleton data. This may be helpful when such items have been renamed or deleted. + * Added `UnscaledTime` property at `SkeletonAnimation` as well, behaving like `SkeletonGraphic.UnscaledTime`. If enabled, AnimationState uses unscaled game time (`Time.unscaledDeltaTime`), running animations independent of e.g. game pause (`Time.timeScale`). + * `SkeletonAnimation`, `SkeletonMecanim` and `SkeletonGraphic` now provide an additional `OnAnimationRebuild` callback delegate which is issued after both the skeleton and the animation state have been initialized. * **Breaking changes** + * Made `SkeletonGraphic.unscaledTime` parameter protected, use the new property `UnscaledTime` instead. + * `SkeletonGraphic` `OnRebuild` callback delegate is now issued after the skeleton has been initialized, before the `AnimationState` component is initialized. This makes behaviour consistent with `SkeletonAnimation` and `SkeletonMecanim` component behaviour. Use the new callback `OnAnimationRebuild` if you want to receive a callback after the `SkeletonGraphic` `AnimationState` has been initialized. * **Changes of default values** @@ -245,7 +249,6 @@ Also removed less commonly used extension methods: `TrackEntry.AllowImmediateQueue()`, `Animation.SetKeyedItemsToSetupPose()` and `Attachment.IsRenderable()`. - * Made `SkeletonGraphic.unscaledTime` parameter protected, use the new property `UnscaledTime` instead. * **`SkeletonGraphic` now no longer uses a `RawImage` component at each submesh renderer** GameObject when `allowMultipleCanvasRenderers` is true. Instead, a new custom component `SkeletonSubmeshGraphic` is used which is more resource friendly. Replacement of these components will be performed automatically through editor scripting, saving scenes or prefabs will persist the upgrade. * **Linear color space:** Previously Slot colors were not displayed the same in Unity as in the Spine Editor. This is now fixed at all shaders, including URP and LWRP shaders. See section *Additions* below for more details. If you have tweaked Slot colors to look correct in `Linear` color space in Unity but incorrect in Spine, you might want to adjust the tweaked colors. Slot colors displayed in Unity should now match colors displayed in the Spine Editor when configured to display as `Linear` color space in the Spine Editor Settings. @@ -312,7 +315,6 @@ * Added example component `SkeletonRenderTexture` to render a `SkeletonRenderer` to a `RenderTexture`, mainly for proper transparency. Added an example scene named `RenderTexture FadeOut Transparency` that demonstrates usage for a fadeout transparency effect. * Added another fadeout example component named `SkeletonRenderTextureFadeout` which takes over transparency fadeout when enabled. You can use this component as-is, attach it in disabled state and enable it to start a fadeout effect. * Timeline clips now offer an additional `Alpha` parameter for setting a custom constant mix alpha value other than 1.0, just as `TrackEntry.Alpha`. Defaults to 1.0. - * Added `UnscaledTime` property at `SkeletonAnimation` as well, behaving like `SkeletonGraphic.UnscaledTime`. If enabled, AnimationState uses unscaled game time (`Time.unscaledDeltaTime`), running animations independent of e.g. game pause (`Time.timeScale`). * **Changes of default values** diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonAnimation.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonAnimation.cs index 962eb6f57..a8a5dc1ee 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonAnimation.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonAnimation.cs @@ -61,12 +61,16 @@ namespace Spine.Unity { private bool wasUpdatedAfterInit = true; #endregion - #region Bone Callbacks ISkeletonAnimation + #region Bone and Initialization Callbacks ISkeletonAnimation + protected event ISkeletonAnimationDelegate _OnAnimationRebuild; protected event UpdateBonesDelegate _BeforeApply; protected event UpdateBonesDelegate _UpdateLocal; protected event UpdateBonesDelegate _UpdateWorld; protected event UpdateBonesDelegate _UpdateComplete; + /// OnAnimationRebuild is raised after the SkeletonAnimation component is successfully initialized. + public event ISkeletonAnimationDelegate OnAnimationRebuild { add { _OnAnimationRebuild += value; } remove { _OnAnimationRebuild -= value; } } + /// /// Occurs before the animations are applied. /// Use this callback when you want to change the skeleton state before animations are applied on top. @@ -197,6 +201,9 @@ namespace Spine.Unity { #endif } } + + if (_OnAnimationRebuild != null) + _OnAnimationRebuild(this); } virtual protected void Update () { diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs index 7b1e244e7..0fa4af5fb 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs @@ -490,6 +490,8 @@ namespace Spine.Unity { } } + /// OnAnimationRebuild is raised after the SkeletonAnimation component is successfully initialized. + public event ISkeletonAnimationDelegate OnAnimationRebuild; public event UpdateBonesDelegate BeforeApply; public event UpdateBonesDelegate UpdateLocal; public event UpdateBonesDelegate UpdateWorld; @@ -542,12 +544,6 @@ namespace Spine.Unity { if (skeletonDataAsset.atlasAssets.Length <= 0 || skeletonDataAsset.atlasAssets[0].MaterialCount <= 0) return; - this.state = new Spine.AnimationState(skeletonDataAsset.GetAnimationStateData()); - if (state == null) { - Clear(); - return; - } - this.skeleton = new Skeleton(skeletonData) { ScaleX = this.initialFlipX ? -1 : 1, ScaleY = this.initialFlipY ? -1 : 1 @@ -565,7 +561,16 @@ namespace Spine.Unity { for (int i = 0; i < separatorSlotNames.Length; i++) separatorSlots.Add(skeleton.FindSlot(separatorSlotNames[i])); + if (OnRebuild != null) + OnRebuild(this); + wasUpdatedAfterInit = false; + this.state = new Spine.AnimationState(skeletonDataAsset.GetAnimationStateData()); + if (state == null) { + Clear(); + return; + } + if (!string.IsNullOrEmpty(startingAnimation)) { var animationObject = skeletonDataAsset.GetSkeletonData(false).FindAnimation(startingAnimation); if (animationObject != null) { @@ -577,8 +582,8 @@ namespace Spine.Unity { } } - if (OnRebuild != null) - OnRebuild(this); + if (OnAnimationRebuild != null) + OnAnimationRebuild(this); } public void PrepareInstructionsAndRenderers () { diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs index f12ffb656..2f29cf3dd 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonMecanim.cs @@ -39,12 +39,16 @@ namespace Spine.Unity { public MecanimTranslator Translator { get { return translator; } } private bool wasUpdatedAfterInit = true; - #region Bone Callbacks (ISkeletonAnimation) + #region Bone and Initialization Callbacks ISkeletonAnimation + protected event ISkeletonAnimationDelegate _OnAnimationRebuild; protected event UpdateBonesDelegate _BeforeApply; protected event UpdateBonesDelegate _UpdateLocal; protected event UpdateBonesDelegate _UpdateWorld; protected event UpdateBonesDelegate _UpdateComplete; + /// OnAnimationRebuild is raised after the SkeletonAnimation component is successfully initialized. + public event ISkeletonAnimationDelegate OnAnimationRebuild { add { _OnAnimationRebuild += value; } remove { _OnAnimationRebuild -= value; } } + /// /// Occurs before the animations are applied. /// Use this callback when you want to change the skeleton state before animations are applied on top. @@ -87,6 +91,9 @@ namespace Spine.Unity { if (translator == null) translator = new MecanimTranslator(); translator.Initialize(GetComponent(), this.skeletonDataAsset); wasUpdatedAfterInit = false; + + if (_OnAnimationRebuild != null) + _OnAnimationRebuild(this); } public virtual void Update () { diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs index c43489e89..5a8727ef8 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs @@ -48,6 +48,7 @@ namespace Spine.Unity { UnscaledGameTime } + public delegate void ISkeletonAnimationDelegate (ISkeletonAnimation animated); public delegate void UpdateBonesDelegate (ISkeletonAnimation animated); public interface ISpineComponent { } @@ -60,6 +61,7 @@ namespace Spine.Unity { /// A Spine-Unity Component that animates a Skeleton but not necessarily with a Spine.AnimationState. public interface ISkeletonAnimation : ISpineComponent { + event ISkeletonAnimationDelegate OnAnimationRebuild; event UpdateBonesDelegate UpdateLocal; event UpdateBonesDelegate UpdateWorld; event UpdateBonesDelegate UpdateComplete; From fa9e033adbff3d0678a4df5740c22f9ff70fa476 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Tue, 31 May 2022 18:48:19 +0200 Subject: [PATCH 2/9] [unity] Fixed a compile error on older Unity (mono) versions introduced in commit 9427732. --- .../Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs index 5a8727ef8..1448a8ee9 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs @@ -93,7 +93,7 @@ namespace Spine.Unity { /// (Time.unscaledDeltaTime instead of the default Game Time(Time.deltaTime). /// to animate independent of game Time.timeScale. /// Instance SkeletonGraphic.timeScale and SkeletonAnimation.timeScale will still be applied. - public bool UnscaledTime { get; set; } + bool UnscaledTime { get; set; } } /// A Spine-Unity Component that holds a reference to a SkeletonRenderer. From bd7f7eb1819b2e9d8dd521695a43a0a938973b39 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Tue, 31 May 2022 19:31:58 +0200 Subject: [PATCH 3/9] [unity] Fixed Editor OutOfBoundsException at SkeletonGraphic when switching to skin with more vertices. Closes #2089. --- .../Runtime/spine-unity/Components/SkeletonGraphic.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs index 0fa4af5fb..fdadf6a72 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonGraphic.cs @@ -653,7 +653,15 @@ namespace Spine.Unity { var smartMesh = meshBuffers.GetNext(); bool updateTriangles = SkeletonRendererInstruction.GeometryNotEqual(currentInstructions, smartMesh.instructionUsed); meshGenerator.Begin(); - if (currentInstructions.hasActiveClipping && currentInstructions.submeshInstructions.Count > 0) { + + bool useAddSubmesh = currentInstructions.hasActiveClipping && currentInstructions.submeshInstructions.Count > 0; +#if UNITY_EDITOR + // Editor triggers Graphic.Rebuild without prior LateUpdate call, which + // can lead to filling unprepared vertex buffer and out-of-bounds write access. + if (!Application.isPlaying) + useAddSubmesh = true; +#endif + if (useAddSubmesh) { meshGenerator.AddSubmesh(currentInstructions.submeshInstructions.Items[0], updateTriangles); } else { meshGenerator.BuildMeshWithArrays(currentInstructions, updateTriangles); From cf654d3768712421c9162ec0113633d0627e7957 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 1 Jun 2022 16:58:11 +0200 Subject: [PATCH 4/9] [unity] Minor cleanup. --- .../Editor/Components/SkeletonAnimationInspector.cs | 2 +- .../Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonAnimationInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonAnimationInspector.cs index 427ba6226..c5fa5b9f2 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonAnimationInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonAnimationInspector.cs @@ -74,11 +74,11 @@ namespace Spine.Unity.Editor { EditorGUILayout.PropertyField(loop, LoopLabel); wasAnimationParameterChanged |= EditorGUI.EndChangeCheck(); // Value used in the next update. EditorGUILayout.PropertyField(timeScale, TimeScaleLabel); - EditorGUILayout.PropertyField(unscaledTime, UnscaledTimeLabel); foreach (var o in targets) { var component = o as SkeletonAnimation; component.timeScale = Mathf.Max(component.timeScale, 0); } + EditorGUILayout.PropertyField(unscaledTime, UnscaledTimeLabel); EditorGUILayout.Space(); SkeletonRootMotionParameter(); diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs index 1448a8ee9..89a25c854 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/ISkeletonAnimation.cs @@ -43,11 +43,6 @@ namespace Spine.Unity { InFixedUpdate } - public enum UpdateTimeScale { - GameTime = 0, - UnscaledGameTime - } - public delegate void ISkeletonAnimationDelegate (ISkeletonAnimation animated); public delegate void UpdateBonesDelegate (ISkeletonAnimation animated); From d7961316681228767ae934e3b515f3417afbe13e Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 1 Jun 2022 19:26:55 +0200 Subject: [PATCH 5/9] [unity] Fixed Timeline SkeletonGraphic clip exception when DefaultMixDuration is disabled. Closes #2090. Added `Unscaled Time` property at Spine Timeline tracks. --- CHANGELOG.md | 3 ++- .../SpineAnimationStateGraphicTrack.cs | 16 ++++++++++++++++ .../SpineAnimationStateMixerBehaviour.cs | 3 +++ .../SpineAnimationStateTrack.cs | 8 ++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8289bf037..72e4e19d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -85,7 +85,8 @@ * Spine property Inspector fields (`Animation Name`, `Bone Name`, `Slot` and similar) now display the name in red when the respective animation/bone/etc no longer exists at the skeleton data. This may be helpful when such items have been renamed or deleted. * Added `UnscaledTime` property at `SkeletonAnimation` as well, behaving like `SkeletonGraphic.UnscaledTime`. If enabled, AnimationState uses unscaled game time (`Time.unscaledDeltaTime`), running animations independent of e.g. game pause (`Time.timeScale`). * `SkeletonAnimation`, `SkeletonMecanim` and `SkeletonGraphic` now provide an additional `OnAnimationRebuild` callback delegate which is issued after both the skeleton and the animation state have been initialized. - + * Timeline `SkeletonAnimation Track` and `SkeletonGraphic Track` now provide an `Unscaled Time` property. Whenever starting a new animation clip of this track, `SkeletonAnimation.UnscaledTime` or `SkeletonGraphic.UnscaledTime` will be set to this value. This allows you to play back Timeline clips either in normal game time or unscaled game time. Note that `PlayableDirector.UpdateMethod` is ignored and replaced by this property, which allows more fine-granular control per Timeline track. + * **Breaking changes** * Made `SkeletonGraphic.unscaledTime` parameter protected, use the new property `UnscaledTime` instead. * `SkeletonGraphic` `OnRebuild` callback delegate is now issued after the skeleton has been initialized, before the `AnimationState` component is initialized. This makes behaviour consistent with `SkeletonAnimation` and `SkeletonMecanim` component behaviour. Use the new callback `OnAnimationRebuild` if you want to receive a callback after the `SkeletonGraphic` `AnimationState` has been initialized. diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateGraphicTrack.cs b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateGraphicTrack.cs index 1c16f2f94..d8f48d241 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateGraphicTrack.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateGraphicTrack.cs @@ -30,6 +30,7 @@ #if UNITY_EDITOR using System.ComponentModel; #endif +using System.Collections.Generic; using UnityEngine; using UnityEngine.Playables; using UnityEngine.Timeline; @@ -43,11 +44,26 @@ namespace Spine.Unity.Playables { #endif public class SpineAnimationStateGraphicTrack : TrackAsset { public int trackIndex = 0; + [Tooltip("Whenever starting a new animation clip of this track, " + + "SkeletonGraphic.UnscaledTime will be set to this value. " + + "This allows you to play back Timeline clips either in normal game time " + + "or unscaled game time. Note that PlayableDirector.UpdateMethod " + + "is ignored and replaced by this property, which allows more fine-granular " + + "control per Timeline track.")] + public bool unscaledTime = false; public override Playable CreateTrackMixer (PlayableGraph graph, GameObject go, int inputCount) { + IEnumerable clips = this.GetClips(); + foreach (TimelineClip clip in clips) { + var animationStateClip = clip.asset as SpineAnimationStateClip; + if (animationStateClip != null) + animationStateClip.timelineClip = clip; + } + var scriptPlayable = ScriptPlayable.Create(graph, inputCount); var mixerBehaviour = scriptPlayable.GetBehaviour(); mixerBehaviour.trackIndex = this.trackIndex; + mixerBehaviour.unscaledTime = this.unscaledTime; return scriptPlayable; } } diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs index 77dd3b983..5b4f5e342 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs @@ -40,6 +40,7 @@ namespace Spine.Unity.Playables { float[] lastInputWeights; bool lastAnyClipPlaying = false; public int trackIndex; + public bool unscaledTime; ScriptPlayable[] startingClips = new ScriptPlayable[2]; @@ -177,6 +178,8 @@ namespace Spine.Unity.Playables { state.SetEmptyAnimation(trackIndex, mixDuration); } else { if (clipData.animationReference.Animation != null) { + animationStateComponent.UnscaledTime = this.unscaledTime; + TrackEntry currentEntry = state.GetCurrent(trackIndex); Spine.TrackEntry trackEntry; float customMixDuration = clipData.customDuration ? GetCustomMixDuration(clipData) : 0.0f; diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateTrack.cs b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateTrack.cs index f62f4f88a..7a0f58f9d 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateTrack.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateTrack.cs @@ -44,6 +44,13 @@ namespace Spine.Unity.Playables { #endif public class SpineAnimationStateTrack : TrackAsset { public int trackIndex = 0; + [Tooltip("Whenever starting a new animation clip of this track, " + + "SkeletonAnimation.UnscaledTime will be set to this value. " + + "This allows you to play back Timeline clips either in normal game time " + + "or unscaled game time. Note that PlayableDirector.UpdateMethod " + + "is ignored and replaced by this property, which allows more fine-granular " + + "control per Timeline track.")] + public bool unscaledTime = false; public override Playable CreateTrackMixer (PlayableGraph graph, GameObject go, int inputCount) { IEnumerable clips = this.GetClips(); @@ -56,6 +63,7 @@ namespace Spine.Unity.Playables { var scriptPlayable = ScriptPlayable.Create(graph, inputCount); var mixerBehaviour = scriptPlayable.GetBehaviour(); mixerBehaviour.trackIndex = this.trackIndex; + mixerBehaviour.unscaledTime = this.unscaledTime; return scriptPlayable; } } From a7486aec6392a9e6a5837b3019d2d2cb3bc1b8b3 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 1 Jun 2022 19:29:30 +0200 Subject: [PATCH 6/9] [unity] Increased UPM Spine Timeline package version for last commit. --- .../package-no-spine-unity-dependency.json | 2 +- .../Modules/com.esotericsoftware.spine.timeline/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/package-no-spine-unity-dependency.json b/spine-unity/Modules/com.esotericsoftware.spine.timeline/package-no-spine-unity-dependency.json index 56a626bf9..8fcd7fe8a 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/package-no-spine-unity-dependency.json +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/package-no-spine-unity-dependency.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.timeline", "displayName": "Spine Timeline Extensions", "description": "This plugin provides integration of spine-unity for the Unity Timeline.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime (via the spine-unity unitypackage), version 4.1.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)", - "version": "4.1.5", + "version": "4.1.6", "unity": "2018.3", "author": { "name": "Esoteric Software", diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/package.json b/spine-unity/Modules/com.esotericsoftware.spine.timeline/package.json index b4332da54..68c955c4d 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/package.json +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.timeline", "displayName": "Spine Timeline Extensions", "description": "This plugin provides integration of spine-unity for the Unity Timeline.\n\nPrerequisites:\nIt requires a working installation of the spine-unity and spine-csharp runtimes as UPM packages (not as spine-unity unitypackage), version 4.1.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)", - "version": "4.1.5", + "version": "4.1.6", "unity": "2018.3", "author": { "name": "Esoteric Software", From c47655f01d971c4c2eb805e0ce3941d33446cef6 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 1 Jun 2022 20:05:10 +0200 Subject: [PATCH 7/9] [unity] Updated UPM package documentation and image to added track property `Unscaled Time` of previous commit. --- .../Documentation/README.md | 2 ++ .../animationstate-track-inspector.png | Bin 12893 -> 14254 bytes 2 files changed, 2 insertions(+) diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Documentation/README.md b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Documentation/README.md index cd5a0b5b9..ebb3503e9 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Documentation/README.md +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Documentation/README.md @@ -34,6 +34,8 @@ These track types can be used to set animations at the AnimationState of the tar - *Track Index.* The target AnimationState track index to set animations at. Do not forget to set this value accordingly when using multiple timeline tracks. > **Important Note:** Currently it is required to order the timeline tracks with base track at the top and overlay tracks below, otherwise the Editor Preview will display incorrect results. +- *Unscaled Time.* Whenever starting a new animation clip of this track, `SkeletonAnimation.UnscaledTime` (or `SkeletonGraphic.UnscaledTime` respectively) will be set to this value. This allows you to play back Timeline clips either in normal game time or unscaled game time. Note that `PlayableDirector.UpdateMethod` is ignored and replaced by this property, which allows more fine-granular control per Timeline track. + ##### Spine Animation State Clip You can add a `Spine Animation State Clip` to a `SkeletonAnimation Track` (or `SkeletonGraphic Track`) by dragging an `AnimationReferenceAsset` onto a Timeline track. See the [SkeletonData - Preview](#Preview) section on how to generate `AnimationReferenceAssets` for a `SkeletonDataAsset`. diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Documentation/animationstate-track-inspector.png b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Documentation/animationstate-track-inspector.png index e988e8f77015072bb4866e2c47f6a310e7147138..f6cd9bbfe0856c7772628b437b9bab28257f13a3 100644 GIT binary patch delta 11462 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 From 4d493ca558b6edaafe71113cf790fb9222e0104d Mon Sep 17 00:00:00 2001 From: Nathan Sweet Date: Thu, 2 Jun 2022 12:37:54 -0400 Subject: [PATCH 8/9] [libgdx] Clean up vertex effect removal. --- .../spine/SkeletonRenderer.java | 54 ------------------- 1 file changed, 54 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java index 505028dea..31d7c9125 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java @@ -33,9 +33,7 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch; -import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.FloatArray; -import com.badlogic.gdx.utils.Null; import com.badlogic.gdx.utils.NumberUtils; import com.badlogic.gdx.utils.ShortArray; @@ -53,12 +51,6 @@ public class SkeletonRenderer { private boolean pmaColors, pmaBlendModes; private final FloatArray vertices = new FloatArray(32); private final SkeletonClipping clipper = new SkeletonClipping(); - private final Vector2 temp = new Vector2(); - private final Vector2 temp2 = new Vector2(); - private final Color temp3 = new Color(); - private final Color temp4 = new Color(); - private final Color temp5 = new Color(); - private final Color temp6 = new Color(); /** Renders the specified skeleton. If the batch is a PolygonSpriteBatch, {@link #draw(PolygonSpriteBatch, Skeleton)} is * called. If the batch is a TwoColorPolygonBatch, {@link #draw(TwoColorPolygonBatch, Skeleton)} is called. Otherwise the @@ -143,10 +135,6 @@ public class SkeletonRenderer { if (batch == null) throw new IllegalArgumentException("batch cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); - Vector2 tempPosition = this.temp, tempUV = this.temp2; - Color tempLight1 = this.temp3, tempDark1 = this.temp4; - Color tempLight2 = this.temp5, tempDark2 = this.temp6; - boolean pmaColors = this.pmaColors, pmaBlendModes = this.pmaBlendModes; BlendMode blendMode = null; int verticesLength = 0; @@ -245,10 +233,6 @@ public class SkeletonRenderer { if (batch == null) throw new IllegalArgumentException("batch cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); - Vector2 tempPosition = this.temp, tempUV = this.temp2; - Color tempLight1 = this.temp3, tempDark1 = this.temp4; - Color tempLight2 = this.temp5, tempDark2 = this.temp6; - boolean pmaColors = this.pmaColors, pmaBlendModes = this.pmaBlendModes; batch.setPremultipliedAlpha(pmaColors); BlendMode blendMode = null; @@ -348,44 +332,6 @@ public class SkeletonRenderer { clipper.clipEnd(); } - private void applyVertexEffect (float[] vertices, int verticesLength, int stride, float light, float dark) { - Vector2 tempPosition = this.temp, tempUV = this.temp2; - Color tempLight1 = this.temp3, tempDark1 = this.temp4; - Color tempLight2 = this.temp5, tempDark2 = this.temp6; - tempLight1.set(NumberUtils.floatToIntColor(light)); - tempDark1.set(NumberUtils.floatToIntColor(dark)); - if (stride == 5) { - for (int v = 0; v < verticesLength; v += stride) { - tempPosition.x = vertices[v]; - tempPosition.y = vertices[v + 1]; - tempUV.x = vertices[v + 3]; - tempUV.y = vertices[v + 4]; - tempLight2.set(tempLight1); - tempDark2.set(tempDark1); - vertices[v] = tempPosition.x; - vertices[v + 1] = tempPosition.y; - vertices[v + 2] = tempLight2.toFloatBits(); - vertices[v + 3] = tempUV.x; - vertices[v + 4] = tempUV.y; - } - } else { - for (int v = 0; v < verticesLength; v += stride) { - tempPosition.x = vertices[v]; - tempPosition.y = vertices[v + 1]; - tempUV.x = vertices[v + 4]; - tempUV.y = vertices[v + 5]; - tempLight2.set(tempLight1); - tempDark2.set(tempDark1); - vertices[v] = tempPosition.x; - vertices[v + 1] = tempPosition.y; - vertices[v + 2] = tempLight2.toFloatBits(); - vertices[v + 3] = tempDark2.toFloatBits(); - vertices[v + 4] = tempUV.x; - vertices[v + 5] = tempUV.y; - } - } - } - public boolean getPremultipliedAlphaColors () { return pmaColors; } From 918b27fd0cdea37b58d7bf8268ff86811239c866 Mon Sep 17 00:00:00 2001 From: badlogic Date: Thu, 9 Jun 2022 14:29:35 +0200 Subject: [PATCH 9/9] [ue4] Fix return type of UTrackEntry::isValidAnimation(). --- .../Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h index 53d0d5b4f..3cc75fe78 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h @@ -192,7 +192,7 @@ public: float getAnimationDuration() { return entry ? entry->getAnimation()->getDuration() : 0; } UFUNCTION(BlueprintCallable, Category = "Components|Spine|TrackEntry") - float isValidAnimation() { return entry != nullptr; } + bool isValidAnimation() { return entry != nullptr; } UPROPERTY(BlueprintAssignable, Category = "Components|Spine|TrackEntry") FSpineAnimationStartDelegate AnimationStart;