diff --git a/spine-cocos2dx/src/spine/SkeletonAnimation.cpp b/spine-cocos2dx/src/spine/SkeletonAnimation.cpp index 2d9fcc743..8ee41a4e4 100644 --- a/spine-cocos2dx/src/spine/SkeletonAnimation.cpp +++ b/spine-cocos2dx/src/spine/SkeletonAnimation.cpp @@ -38,7 +38,7 @@ using std::min; using std::max; using std::vector; -namespace spine { +namespace spine { typedef struct _TrackEntryListeners { StartListener startListener; @@ -112,6 +112,8 @@ void SkeletonAnimation::initialize () { _state = new (__FILE__, __LINE__) AnimationState(new (__FILE__, __LINE__) AnimationStateData(_skeleton->getData())); _state->setRendererObject(this); _state->setListener(animationCallback); + + _firstDraw = true; } SkeletonAnimation::SkeletonAnimation () @@ -126,12 +128,20 @@ SkeletonAnimation::~SkeletonAnimation () { void SkeletonAnimation::update (float deltaTime) { super::update(deltaTime); - deltaTime *= _timeScale; - _state->update(deltaTime); - _state->apply(*_skeleton); + deltaTime *= _timeScale; + _state->update(deltaTime); + _state->apply(*_skeleton); _skeleton->updateWorldTransform(); } +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 (AnimationStateData* stateData) { CCASSERT(stateData, "stateData cannot be null."); diff --git a/spine-cocos2dx/src/spine/SkeletonAnimation.h b/spine-cocos2dx/src/spine/SkeletonAnimation.h index 17fb8e24f..41215d1a8 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 (AnimationStateData* stateData); void setMix (const std::string& fromAnimation, const std::string& toAnimation, float duration); @@ -109,6 +110,7 @@ protected: AnimationState* _state; bool _ownsAnimationStateData; + bool _firstDraw; StartListener _startListener; InterruptListener _interruptListener; 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; } 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")] 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