mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
Merge branch '3.7-beta' into 3.7-beta-cpp
This commit is contained in:
commit
bd3d9ee36a
@ -112,6 +112,8 @@ void SkeletonAnimation::initialize () {
|
|||||||
_state = new (__FILE__, __LINE__) AnimationState(new (__FILE__, __LINE__) AnimationStateData(_skeleton->getData()));
|
_state = new (__FILE__, __LINE__) AnimationState(new (__FILE__, __LINE__) AnimationStateData(_skeleton->getData()));
|
||||||
_state->setRendererObject(this);
|
_state->setRendererObject(this);
|
||||||
_state->setListener(animationCallback);
|
_state->setListener(animationCallback);
|
||||||
|
|
||||||
|
_firstDraw = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SkeletonAnimation::SkeletonAnimation ()
|
SkeletonAnimation::SkeletonAnimation ()
|
||||||
@ -132,6 +134,14 @@ void SkeletonAnimation::update (float deltaTime) {
|
|||||||
_skeleton->updateWorldTransform();
|
_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) {
|
void SkeletonAnimation::setAnimationStateData (AnimationStateData* stateData) {
|
||||||
CCASSERT(stateData, "stateData cannot be null.");
|
CCASSERT(stateData, "stateData cannot be null.");
|
||||||
|
|
||||||
|
|||||||
@ -67,6 +67,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual void update (float deltaTime) override;
|
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 setAnimationStateData (AnimationStateData* stateData);
|
||||||
void setMix (const std::string& fromAnimation, const std::string& toAnimation, float duration);
|
void setMix (const std::string& fromAnimation, const std::string& toAnimation, float duration);
|
||||||
@ -109,6 +110,7 @@ protected:
|
|||||||
AnimationState* _state;
|
AnimationState* _state;
|
||||||
|
|
||||||
bool _ownsAnimationStateData;
|
bool _ownsAnimationStateData;
|
||||||
|
bool _firstDraw;
|
||||||
|
|
||||||
StartListener _startListener;
|
StartListener _startListener;
|
||||||
InterruptListener _interruptListener;
|
InterruptListener _interruptListener;
|
||||||
|
|||||||
@ -997,7 +997,7 @@ public class AnimationState {
|
|||||||
|
|
||||||
/** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the
|
/** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the
|
||||||
* <code>eventThreshold</code>, event timelines are applied while this animation is being mixed out. Defaults to 0, so event
|
* <code>eventThreshold</code>, 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 () {
|
public float getEventThreshold () {
|
||||||
return eventThreshold;
|
return eventThreshold;
|
||||||
}
|
}
|
||||||
@ -1008,7 +1008,7 @@ public class AnimationState {
|
|||||||
|
|
||||||
/** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the
|
/** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the
|
||||||
* <code>attachmentThreshold</code>, attachment timelines are applied while this animation is being mixed out. Defaults to
|
* <code>attachmentThreshold</code>, 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 () {
|
public float getAttachmentThreshold () {
|
||||||
return attachmentThreshold;
|
return attachmentThreshold;
|
||||||
}
|
}
|
||||||
@ -1019,7 +1019,7 @@ public class AnimationState {
|
|||||||
|
|
||||||
/** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the
|
/** When the mix percentage ({@link #getMixTime()} / {@link #getMixDuration()}) is less than the
|
||||||
* <code>drawOrderThreshold</code>, draw order timelines are applied while this animation is being mixed out. Defaults to 0,
|
* <code>drawOrderThreshold</code>, 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 () {
|
public float getDrawOrderThreshold () {
|
||||||
return drawOrderThreshold;
|
return drawOrderThreshold;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,11 @@ using System.Collections.Generic;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
|
||||||
|
#if UNITY_2018_3 || UNITY_2019
|
||||||
|
#define NEW_PREFAB_SYSTEM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace Spine.Unity.Editor {
|
namespace Spine.Unity.Editor {
|
||||||
|
|
||||||
using Editor = UnityEditor.Editor;
|
using Editor = UnityEditor.Editor;
|
||||||
@ -11,6 +16,7 @@ namespace Spine.Unity.Editor {
|
|||||||
public class SkeletonBakingWindow : EditorWindow {
|
public class SkeletonBakingWindow : EditorWindow {
|
||||||
const bool IsUtilityWindow = true;
|
const bool IsUtilityWindow = true;
|
||||||
|
|
||||||
|
#if !NEW_PREFAB_SYSTEM
|
||||||
[MenuItem("CONTEXT/SkeletonDataAsset/Skeleton Baking", false, 5000)]
|
[MenuItem("CONTEXT/SkeletonDataAsset/Skeleton Baking", false, 5000)]
|
||||||
public static void Init (MenuCommand command) {
|
public static void Init (MenuCommand command) {
|
||||||
var window = EditorWindow.GetWindow<SkeletonBakingWindow>(IsUtilityWindow);
|
var window = EditorWindow.GetWindow<SkeletonBakingWindow>(IsUtilityWindow);
|
||||||
@ -20,6 +26,7 @@ namespace Spine.Unity.Editor {
|
|||||||
window.skeletonDataAsset = command.context as SkeletonDataAsset;
|
window.skeletonDataAsset = command.context as SkeletonDataAsset;
|
||||||
window.Show();
|
window.Show();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
public SkeletonDataAsset skeletonDataAsset;
|
public SkeletonDataAsset skeletonDataAsset;
|
||||||
[SpineSkin(dataField:"skeletonDataAsset")]
|
[SpineSkin(dataField:"skeletonDataAsset")]
|
||||||
|
|||||||
@ -477,7 +477,7 @@ namespace Spine.Unity.Editor {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
foreach (var slot in skeleton.DrawOrder) {
|
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++) {
|
for (int i = 0, n = slotNames.Length; i < n; i++) {
|
||||||
if (string.Equals(slotNames[i], slot.Data.Name, System.StringComparison.Ordinal)) {
|
if (string.Equals(slotNames[i], slot.Data.Name, System.StringComparison.Ordinal)) {
|
||||||
EditorGUILayout.LabelField(SeparatorString);
|
EditorGUILayout.LabelField(SeparatorString);
|
||||||
|
|||||||
@ -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);
|
var field = SpineInspectorUtility.GetNonPublicField(typeof(SkeletonRenderer), SeparatorSlotNamesFieldName);
|
||||||
return field.GetValue(skeletonRenderer) as string[];
|
return field.GetValue(skeletonRenderer) as string[];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -367,6 +367,47 @@ namespace Spine.Unity {
|
|||||||
currentSmartMesh.instructionUsed.Set(currentInstructions);
|
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<string, bool> 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<string>();
|
||||||
|
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 () {
|
public void ReapplySeparatorSlotNames () {
|
||||||
if (!valid)
|
if (!valid)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -128,10 +128,11 @@ namespace Spine.Unity.Modules {
|
|||||||
meshRenderer.SetPropertyBlock(block);
|
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));
|
var go = new GameObject(name, typeof(MeshFilter), typeof(MeshRenderer));
|
||||||
go.transform.SetParent(parent, false);
|
go.transform.SetParent(parent, false);
|
||||||
var returnComponent = go.AddComponent<SkeletonPartsRenderer>();
|
var returnComponent = go.AddComponent<SkeletonPartsRenderer>();
|
||||||
|
returnComponent.MeshRenderer.sortingOrder = sortingOrder;
|
||||||
|
|
||||||
return returnComponent;
|
return returnComponent;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -106,6 +106,8 @@ namespace Spine.Unity.Modules {
|
|||||||
componentRenderers.Add(spr);
|
componentRenderers.Add(spr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srs.OnEnable();
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
// Make sure editor updates properly in edit mode.
|
// Make sure editor updates properly in edit mode.
|
||||||
if (!Application.isPlaying) {
|
if (!Application.isPlaying) {
|
||||||
@ -119,7 +121,7 @@ namespace Spine.Unity.Modules {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Add a child SkeletonPartsRenderer GameObject to this SkeletonRenderSeparator.</summary>
|
/// <summary>Add a child SkeletonPartsRenderer GameObject to this SkeletonRenderSeparator.</summary>
|
||||||
public void AddPartsRenderer (int sortingOrderIncrement = DefaultSortingOrderIncrement) {
|
public SkeletonPartsRenderer AddPartsRenderer (int sortingOrderIncrement = DefaultSortingOrderIncrement, string name = null) {
|
||||||
int sortingLayerID = 0;
|
int sortingLayerID = 0;
|
||||||
int sortingOrder = 0;
|
int sortingOrder = 0;
|
||||||
if (partsRenderers.Count > 0) {
|
if (partsRenderers.Count > 0) {
|
||||||
@ -129,12 +131,17 @@ namespace Spine.Unity.Modules {
|
|||||||
sortingOrder = previousMeshRenderer.sortingOrder + sortingOrderIncrement;
|
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);
|
partsRenderers.Add(spr);
|
||||||
|
|
||||||
var mr = spr.MeshRenderer;
|
var mr = spr.MeshRenderer;
|
||||||
mr.sortingLayerID = sortingLayerID;
|
mr.sortingLayerID = sortingLayerID;
|
||||||
mr.sortingOrder = sortingOrder;
|
mr.sortingOrder = sortingOrder;
|
||||||
|
|
||||||
|
return spr;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user