From 54dd3825f7787ce6cc2d291e9b3338c73cd74bbe Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Mon, 3 Dec 2018 18:06:07 +0100 Subject: [PATCH 1/4] [libgdx] Minor javadoc update. --- .../src/com/esotericsoftware/spine/AnimationState.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java index 4db2abfa1..63cdd3df5 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java @@ -997,7 +997,7 @@ public class AnimationState { /** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the * eventThreshold, event timelines are applied while this animation is being mixed out. Defaults to 0, so event - * timelines are not applied for an animation being mixed out. */ + * timelines are not applied while this animation is being mixed out. */ public float getEventThreshold () { return eventThreshold; } @@ -1008,7 +1008,7 @@ public class AnimationState { /** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the * attachmentThreshold, attachment timelines are applied while this animation is being mixed out. Defaults to - * 0, so attachment timelines are not applied for an animation being mixed out. */ + * 0, so attachment timelines are not applied while this animation is being mixed out. */ public float getAttachmentThreshold () { return attachmentThreshold; } @@ -1019,7 +1019,7 @@ public class AnimationState { /** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the * drawOrderThreshold, draw order timelines are applied while this animation is being mixed out. Defaults to 0, - * so draw order timelines are not applied for an animation being mixed out. */ + * so draw order timelines are not applied while this animation is being mixed out. */ public float getDrawOrderThreshold () { return drawOrderThreshold; } From bd342bc10d564adbf464801b4f5d24d2f671699f Mon Sep 17 00:00:00 2001 From: pharan Date: Tue, 4 Dec 2018 19:41:53 +0800 Subject: [PATCH 2/4] [unity] Disable baking with new prefab system. --- .../Editor/spine-unity/Editor/SkeletonBakingWindow.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonBakingWindow.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonBakingWindow.cs index 0cadad265..73e1e1828 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonBakingWindow.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonBakingWindow.cs @@ -3,6 +3,11 @@ using System.Collections.Generic; using UnityEngine; using UnityEditor; +#if UNITY_2018_3 || UNITY_2019 +#define NEW_PREFAB_SYSTEM +#endif + + namespace Spine.Unity.Editor { using Editor = UnityEditor.Editor; @@ -11,6 +16,7 @@ namespace Spine.Unity.Editor { public class SkeletonBakingWindow : EditorWindow { const bool IsUtilityWindow = true; + #if !NEW_PREFAB_SYSTEM [MenuItem("CONTEXT/SkeletonDataAsset/Skeleton Baking", false, 5000)] public static void Init (MenuCommand command) { var window = EditorWindow.GetWindow(IsUtilityWindow); @@ -20,6 +26,7 @@ namespace Spine.Unity.Editor { window.skeletonDataAsset = command.context as SkeletonDataAsset; window.Show(); } + #endif public SkeletonDataAsset skeletonDataAsset; [SpineSkin(dataField:"skeletonDataAsset")] From 3ff14fc186d3457709868946b4eafda76dd8d82a Mon Sep 17 00:00:00 2001 From: pharan Date: Tue, 4 Dec 2018 19:42:58 +0800 Subject: [PATCH 3/4] [unity] Update separator slot APIs. --- .../spine-unity/Editor/SkeletonDebugWindow.cs | 2 +- .../Editor/SkeletonRendererInspector.cs | 7 +++- .../Components/SkeletonRenderer.cs | 41 +++++++++++++++++++ .../SkeletonPartsRenderer.cs | 3 +- .../SkeletonRenderSeparator.cs | 13 ++++-- 5 files changed, 60 insertions(+), 6 deletions(-) diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs index f32650ae3..c8209d6f2 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonDebugWindow.cs @@ -477,7 +477,7 @@ namespace Spine.Unity.Editor { } } else { foreach (var slot in skeleton.DrawOrder) { - var slotNames = SkeletonRendererInspector.GetSeparatorSlotMember(skeletonRenderer); + var slotNames = SkeletonRendererInspector.GetSeparatorSlotNames(skeletonRenderer); for (int i = 0, n = slotNames.Length; i < n; i++) { if (string.Equals(slotNames[i], slot.Data.Name, System.StringComparison.Ordinal)) { EditorGUILayout.LabelField(SeparatorString); diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonRendererInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonRendererInspector.cs index d36fa14a8..021ba4ff0 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonRendererInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/SkeletonRendererInspector.cs @@ -341,7 +341,12 @@ namespace Spine.Unity.Editor { } } - public static string[] GetSeparatorSlotMember (SkeletonRenderer skeletonRenderer) { + public static void SetSeparatorSlotNames (SkeletonRenderer skeletonRenderer, string[] newSlotNames) { + var field = SpineInspectorUtility.GetNonPublicField(typeof(SkeletonRenderer), SeparatorSlotNamesFieldName); + field.SetValue(skeletonRenderer, newSlotNames); + } + + public static string[] GetSeparatorSlotNames (SkeletonRenderer skeletonRenderer) { var field = SpineInspectorUtility.GetNonPublicField(typeof(SkeletonRenderer), SeparatorSlotNamesFieldName); return field.GetValue(skeletonRenderer) as string[]; } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs index df8d8a8a3..f26bcd62b 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/SkeletonRenderer.cs @@ -367,6 +367,47 @@ namespace Spine.Unity { currentSmartMesh.instructionUsed.Set(currentInstructions); } + public void FindAndApplySeparatorSlots (string startsWith, bool clearExistingSeparators = true, bool updateStringArray = false) { + if (string.IsNullOrEmpty(startsWith)) return; + + FindAndApplySeparatorSlots( + (slotName) => slotName.StartsWith(startsWith), + clearExistingSeparators, + updateStringArray + ); + } + + public void FindAndApplySeparatorSlots (System.Func slotNamePredicate, bool clearExistingSeparators = true, bool updateStringArray = false) { + if (slotNamePredicate == null) return; + if (!valid) return; + + if (clearExistingSeparators) + separatorSlots.Clear(); + + var slots = skeleton.slots; + foreach (var slot in slots) { + if (slotNamePredicate.Invoke(slot.data.name)) + separatorSlots.Add(slot); + } + + if (updateStringArray) { + var detectedSeparatorNames = new List(); + foreach (var slot in skeleton.slots) { + string slotName = slot.data.name; + if (slotNamePredicate.Invoke(slotName)) + detectedSeparatorNames.Add(slotName); + } + if (!clearExistingSeparators) { + string[] originalNames = this.separatorSlotNames; + foreach (string originalName in originalNames) + detectedSeparatorNames.Add(originalName); + } + + this.separatorSlotNames = detectedSeparatorNames.ToArray(); + } + + } + public void ReapplySeparatorSlotNames () { if (!valid) return; diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs index df61f15ca..3af331ca6 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs @@ -128,10 +128,11 @@ namespace Spine.Unity.Modules { meshRenderer.SetPropertyBlock(block); } - public static SkeletonPartsRenderer NewPartsRendererGameObject (Transform parent, string name) { + public static SkeletonPartsRenderer NewPartsRendererGameObject (Transform parent, string name, int sortingOrder = 0) { var go = new GameObject(name, typeof(MeshFilter), typeof(MeshRenderer)); go.transform.SetParent(parent, false); var returnComponent = go.AddComponent(); + returnComponent.MeshRenderer.sortingOrder = sortingOrder; return returnComponent; } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs index 8b8a80ce9..a0dccf165 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs @@ -106,6 +106,8 @@ namespace Spine.Unity.Modules { componentRenderers.Add(spr); } + srs.OnEnable(); + #if UNITY_EDITOR // Make sure editor updates properly in edit mode. if (!Application.isPlaying) { @@ -119,7 +121,7 @@ namespace Spine.Unity.Modules { } /// Add a child SkeletonPartsRenderer GameObject to this SkeletonRenderSeparator. - public void AddPartsRenderer (int sortingOrderIncrement = DefaultSortingOrderIncrement) { + public SkeletonPartsRenderer AddPartsRenderer (int sortingOrderIncrement = DefaultSortingOrderIncrement, string name = null) { int sortingLayerID = 0; int sortingOrder = 0; if (partsRenderers.Count > 0) { @@ -128,13 +130,18 @@ namespace Spine.Unity.Modules { sortingLayerID = previousMeshRenderer.sortingLayerID; sortingOrder = previousMeshRenderer.sortingOrder + sortingOrderIncrement; } - - var spr = SkeletonPartsRenderer.NewPartsRendererGameObject(skeletonRenderer.transform, partsRenderers.Count.ToString()); + + if (string.IsNullOrEmpty(name)) + name = partsRenderers.Count.ToString(); + + var spr = SkeletonPartsRenderer.NewPartsRendererGameObject(skeletonRenderer.transform, name); partsRenderers.Add(spr); var mr = spr.MeshRenderer; mr.sortingLayerID = sortingLayerID; mr.sortingOrder = sortingOrder; + + return spr; } #endregion From 9d54f47114f216d0c6bbffcee99e4165e2bfafdc Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 4 Dec 2018 16:33:14 +0100 Subject: [PATCH 4/4] [cocos2dx] Closes #1216. Cocos2dx may draw a SkeletonAnimation node before its update method is called. The skeleton is thus rendered in the setup pose for the first frame. --- spine-cocos2dx/src/spine/SkeletonAnimation.cpp | 10 ++++++++++ spine-cocos2dx/src/spine/SkeletonAnimation.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/spine-cocos2dx/src/spine/SkeletonAnimation.cpp b/spine-cocos2dx/src/spine/SkeletonAnimation.cpp index c3947d72b..85e1fe4c2 100644 --- a/spine-cocos2dx/src/spine/SkeletonAnimation.cpp +++ b/spine-cocos2dx/src/spine/SkeletonAnimation.cpp @@ -116,6 +116,8 @@ void SkeletonAnimation::initialize () { _state->listener = animationCallback; _spAnimationState* stateInternal = (_spAnimationState*)_state; + + _firstDraw = true; } SkeletonAnimation::SkeletonAnimation () @@ -136,6 +138,14 @@ void SkeletonAnimation::update (float deltaTime) { spSkeleton_updateWorldTransform(_skeleton); } +void SkeletonAnimation::draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t transformFlags) { + if (_firstDraw) { + _firstDraw = false; + update(0); + } + super::draw(renderer, transform, transformFlags); +} + void SkeletonAnimation::setAnimationStateData (spAnimationStateData* stateData) { CCASSERT(stateData, "stateData cannot be null."); diff --git a/spine-cocos2dx/src/spine/SkeletonAnimation.h b/spine-cocos2dx/src/spine/SkeletonAnimation.h index d6521d63d..e6d8c4005 100644 --- a/spine-cocos2dx/src/spine/SkeletonAnimation.h +++ b/spine-cocos2dx/src/spine/SkeletonAnimation.h @@ -67,6 +67,7 @@ public: } virtual void update (float deltaTime) override; + virtual void draw (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t transformFlags) override; void setAnimationStateData (spAnimationStateData* stateData); void setMix (const std::string& fromAnimation, const std::string& toAnimation, float duration); @@ -109,6 +110,7 @@ protected: spAnimationState* _state; bool _ownsAnimationStateData; + bool _firstDraw; StartListener _startListener; InterruptListener _interruptListener;