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