From 04cabf7f3ce3ad5cb86aa009ad637212b0acd138 Mon Sep 17 00:00:00 2001 From: pharan Date: Wed, 15 Feb 2017 13:43:31 +0800 Subject: [PATCH 1/9] [unity] Support attachmentless/skinless skeletons. --- .../Editor/SkeletonDataAssetInspector.cs | 90 ++++++++++--------- .../Asset Types/SkeletonDataAsset.cs | 39 ++++---- .../Editor/SkeletonRendererInspector.cs | 5 +- .../Editor/SpineEditorUtilities.cs | 13 ++- 4 files changed, 82 insertions(+), 65 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs b/spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs index e3af97f98..7b0375b1d 100644 --- a/spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs +++ b/spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs @@ -83,24 +83,6 @@ namespace Spine.Unity.Editor { SpineEditorUtilities.ConfirmInitialization(); m_skeletonDataAsset = (SkeletonDataAsset)target; - // Clear empty atlas array items. - { - bool hasNulls = false; - foreach (var a in m_skeletonDataAsset.atlasAssets) { - if (a == null) { - hasNulls = true; - break; - } - } - if (hasNulls) { - var trimmedAtlasAssets = new List(); - foreach (var a in m_skeletonDataAsset.atlasAssets) { - if (a != null) trimmedAtlasAssets.Add(a); - } - m_skeletonDataAsset.atlasAssets = trimmedAtlasAssets.ToArray(); - } - } - atlasAssets = serializedObject.FindProperty("atlasAssets"); skeletonJSON = serializedObject.FindProperty("skeletonJSON"); scale = serializedObject.FindProperty("scale"); @@ -126,8 +108,8 @@ namespace Spine.Unity.Editor { m_skeletonDataAssetGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(m_skeletonDataAsset)); EditorApplication.update += EditorUpdate; - m_skeletonData = m_skeletonDataAsset.GetSkeletonData(false); RepopulateWarnings(); + m_skeletonData = warnings.Count == 0 ? m_skeletonDataAsset.GetSkeletonData(false) : null; } void OnDestroy () { @@ -228,8 +210,9 @@ namespace Spine.Unity.Editor { m_previewUtility.Cleanup(); m_previewUtility = null; } - RepopulateWarnings(); - OnEnable(); + m_skeletonDataAsset.Clear(); + m_skeletonData = null; + OnEnable(); // Should call RepopulateWarnings. return; } } @@ -258,7 +241,6 @@ namespace Spine.Unity.Editor { using (new EditorGUI.DisabledGroupScope(skeletonJSON.objectReferenceValue == null)) { if (GUILayout.Button(new GUIContent("Attempt Reimport", Icons.warning))) { DoReimport(); - return; } } #else @@ -376,15 +358,12 @@ namespace Spine.Unity.Editor { void DoReimport () { SpineEditorUtilities.ImportSpineContent(new string[] { AssetDatabase.GetAssetPath(skeletonJSON.objectReferenceValue) }, true); - if (m_previewUtility != null) { m_previewUtility.Cleanup(); m_previewUtility = null; } - RepopulateWarnings(); - OnEnable(); - + OnEnable(); // Should call RepopulateWarnings. EditorUtility.SetDirty(m_skeletonDataAsset); } @@ -535,6 +514,25 @@ namespace Spine.Unity.Editor { void RepopulateWarnings () { warnings.Clear(); + // Clear null entries. + { + bool hasNulls = false; + foreach (var a in m_skeletonDataAsset.atlasAssets) { + if (a == null) { + hasNulls = true; + break; + } + } + if (hasNulls) { + var trimmedAtlasAssets = new List(); + foreach (var a in m_skeletonDataAsset.atlasAssets) { + if (a != null) trimmedAtlasAssets.Add(a); + } + m_skeletonDataAsset.atlasAssets = trimmedAtlasAssets.ToArray(); + } + serializedObject.Update(); + } + if (skeletonJSON.objectReferenceValue == null) { warnings.Add("Missing Skeleton JSON"); } else { @@ -544,12 +542,13 @@ namespace Spine.Unity.Editor { #if !SPINE_TK2D bool detectedNullAtlasEntry = false; var atlasList = new List(); - for (int i = 0; i < atlasAssets.arraySize; i++) { - if (atlasAssets.GetArrayElementAtIndex(i).objectReferenceValue == null) { + var actualAtlasAssets = m_skeletonDataAsset.atlasAssets; + for (int i = 0; i < actualAtlasAssets.Length; i++) { + if (m_skeletonDataAsset.atlasAssets[i] == null) { detectedNullAtlasEntry = true; break; } else { - atlasList.Add(((AtlasAsset)atlasAssets.GetArrayElementAtIndex(i).objectReferenceValue).GetAtlas()); + atlasList.Add(actualAtlasAssets[i].GetAtlas()); } } @@ -642,26 +641,37 @@ namespace Spine.Unity.Editor { void CreatePreviewInstances () { this.DestroyPreviewInstances(); + if (warnings.Count > 0) { + m_skeletonDataAsset.Clear(); + return; + } + var skeletonDataAsset = (SkeletonDataAsset)target; if (skeletonDataAsset.GetSkeletonData(false) == null) return; if (this.m_previewInstance == null) { string skinName = EditorPrefs.GetString(m_skeletonDataAssetGUID + "_lastSkin", ""); - m_previewInstance = SpineEditorUtilities.InstantiateSkeletonAnimation(skeletonDataAsset, skinName).gameObject; - if (m_previewInstance != null) { - m_previewInstance.hideFlags = HideFlags.HideAndDontSave; - m_previewInstance.layer = 0x1f; - m_skeletonAnimation = m_previewInstance.GetComponent(); - m_skeletonAnimation.initialSkinName = skinName; - m_skeletonAnimation.LateUpdate(); - m_skeletonData = m_skeletonAnimation.skeletonDataAsset.GetSkeletonData(true); - m_previewInstance.GetComponent().enabled = false; - m_initialized = true; + try { + m_previewInstance = SpineEditorUtilities.InstantiateSkeletonAnimation(skeletonDataAsset, skinName).gameObject; + + if (m_previewInstance != null) { + m_previewInstance.hideFlags = HideFlags.HideAndDontSave; + m_previewInstance.layer = 0x1f; + m_skeletonAnimation = m_previewInstance.GetComponent(); + m_skeletonAnimation.initialSkinName = skinName; + m_skeletonAnimation.LateUpdate(); + m_skeletonData = m_skeletonAnimation.skeletonDataAsset.GetSkeletonData(true); + m_previewInstance.GetComponent().enabled = false; + m_initialized = true; + } + + AdjustCameraGoals(true); + } catch { + DestroyPreviewInstances(); } - AdjustCameraGoals(true); } } diff --git a/spine-unity/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs b/spine-unity/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs index 8fb9ee307..d995ce854 100644 --- a/spine-unity/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs +++ b/spine-unity/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs @@ -89,14 +89,6 @@ namespace Spine.Unity { } public SkeletonData GetSkeletonData (bool quiet) { - if (atlasAssets == null) { - atlasAssets = new AtlasAsset[0]; - if (!quiet) - Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); - Clear(); - return null; - } - if (skeletonJSON == null) { if (!quiet) Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); @@ -104,17 +96,26 @@ namespace Spine.Unity { return null; } - #if !SPINE_TK2D - if (atlasAssets.Length == 0) { - Clear(); - return null; - } - #else - if (atlasAssets.Length == 0 && spriteCollection == null) { - Clear(); - return null; - } - #endif + // Support attachmentless/skinless SkeletonData. +// if (atlasAssets == null) { +// atlasAssets = new AtlasAsset[0]; +// if (!quiet) +// Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); +// Clear(); +// return null; +// } +// #if !SPINE_TK2D +// if (atlasAssets.Length == 0) { +// Clear(); +// return null; +// } +// #else +// if (atlasAssets.Length == 0 && spriteCollection == null) { +// Clear(); +// return null; +// } +// #endif + if (skeletonData != null) return skeletonData; diff --git a/spine-unity/Assets/spine-unity/Editor/SkeletonRendererInspector.cs b/spine-unity/Assets/spine-unity/Editor/SkeletonRendererInspector.cs index c3fe1d03a..c72e03421 100644 --- a/spine-unity/Assets/spine-unity/Editor/SkeletonRendererInspector.cs +++ b/spine-unity/Assets/spine-unity/Editor/SkeletonRendererInspector.cs @@ -214,8 +214,9 @@ namespace Spine.Unity.Editor { if (skinNameString == initialSkinName.stringValue) skinIndex = i; } - skinIndex = EditorGUILayout.Popup("Initial Skin", skinIndex, skins); - initialSkinName.stringValue = skins[skinIndex]; + skinIndex = EditorGUILayout.Popup("Initial Skin", skinIndex, skins); + if (skins.Length > 0) // Support attachmentless/skinless SkeletonData. + initialSkinName.stringValue = skins[skinIndex]; } } diff --git a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs index 05333e11e..b8b0b6b32 100644 --- a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs @@ -603,7 +603,7 @@ namespace Spine.Unity.Editor { var localAtlases = FindAtlasesAtPath(dir); var requiredPaths = GetRequiredAtlasRegions(sp); var atlasMatch = GetMatchingAtlas(requiredPaths, localAtlases); - if (atlasMatch != null) { + if (atlasMatch != null || requiredPaths.Count == 0) { IngestSpineProject(AssetDatabase.LoadAssetAtPath(sp, typeof(TextAsset)) as TextAsset, atlasMatch); } else { bool resolved = false; @@ -830,6 +830,8 @@ namespace Spine.Unity.Editor { StringReader reader = new StringReader(spineJson.text); var root = Json.Deserialize(reader) as Dictionary; + if (!root.ContainsKey("skins")) + return requiredPaths; foreach (KeyValuePair entry in (Dictionary)root["skins"]) { foreach (KeyValuePair slotEntry in (Dictionary)entry.Value) { @@ -1326,9 +1328,12 @@ namespace Spine.Unity.Editor { throw e; } - skin = skin ?? data.DefaultSkin ?? data.Skins.Items[0]; - newSkeletonAnimation.skeleton.SetSkin(skin); - newSkeletonAnimation.initialSkinName = skin.Name; + bool noSkins = data.DefaultSkin == null && (data.Skins == null || data.Skins.Count == 0); // Support attachmentless/skinless SkeletonData. + skin = skin ?? data.DefaultSkin ?? (noSkins ? null : data.Skins.Items[0]); + if (skin != null) { + newSkeletonAnimation.initialSkinName = skin.Name; + newSkeletonAnimation.skeleton.SetSkin(skin); + } newSkeletonAnimation.skeleton.Update(0); newSkeletonAnimation.state.Update(0); From 3ae51cb0ec4cee8759657e7193259c6c278adc01 Mon Sep 17 00:00:00 2001 From: pharan Date: Wed, 15 Feb 2017 13:44:13 +0800 Subject: [PATCH 2/9] [unity] Fix BoundingBoxFollower release build bug. --- .../BoundingBoxFollower.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs b/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs index 9a71ae8dc..2e5820c12 100644 --- a/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs +++ b/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs @@ -160,25 +160,25 @@ namespace Spine.Unity { } void DisposeColliders () { - #if UNITY_EDITOR var colliders = GetComponents(); if (colliders.Length == 0) return; - if (Application.isPlaying) { - foreach (var c in colliders) { - if (c != null) - Destroy(c); + if (Application.isEditor) { + if (Application.isPlaying) { + foreach (var c in colliders) { + if (c != null) + Destroy(c); + } + } else { + foreach (var c in colliders) + if (c != null) + DestroyImmediate(c); } } else { - foreach (var c in colliders) - if (c != null) - DestroyImmediate(c); + foreach (PolygonCollider2D c in colliders) + if (c != null) + Destroy(c); } - #else - foreach (PolygonCollider2D c in colliderTable.Values) - if (c != null) - Destroy(c); - #endif slot = null; currentAttachment = null; From 4df97a8d06ee15f36c7a52c5ea9553a1cd5cfe60 Mon Sep 17 00:00:00 2001 From: pharan Date: Wed, 15 Feb 2017 14:51:21 +0800 Subject: [PATCH 3/9] [unity] Some docs and minor additions to SkeletonExtensions --- .../Assets/spine-unity/SkeletonExtensions.cs | 106 +++++++++++++++++- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/spine-unity/Assets/spine-unity/SkeletonExtensions.cs b/spine-unity/Assets/spine-unity/SkeletonExtensions.cs index 8f04b0a8b..0e6e43987 100644 --- a/spine-unity/Assets/spine-unity/SkeletonExtensions.cs +++ b/spine-unity/Assets/spine-unity/SkeletonExtensions.cs @@ -100,16 +100,19 @@ namespace Spine.Unity { #endregion #region Bone + /// Sets the bone's (local) X and Y according to a Vector2 public static void SetPosition (this Bone bone, Vector2 position) { bone.X = position.x; bone.Y = position.y; } + /// Sets the bone's (local) X and Y according to a Vector3. The z component is ignored. public static void SetPosition (this Bone bone, Vector3 position) { bone.X = position.x; bone.Y = position.y; } + /// Gets the bone's local X and Y as a Vector2. public static Vector2 GetLocalPosition (this Bone bone) { return new Vector2(bone.x, bone.y); } @@ -126,10 +129,12 @@ namespace Spine.Unity { return o; } - public static Vector3 GetWorldPosition (this Bone bone, UnityEngine.Transform parentTransform) { - return parentTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY)); + /// Gets the bone's Unity World position using its Spine GameObject Transform. UpdateWorldTransform needs to have been called for this to return the correct, updated value. + public static Vector3 GetWorldPosition (this Bone bone, UnityEngine.Transform spineGameObjectTransform) { + return spineGameObjectTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY)); } + /// Gets the internal bone matrix as a Unity bonespace-to-skeletonspace transformation matrix. public static Matrix4x4 GetMatrix4x4 (this Bone bone) { return new Matrix4x4 { m00 = bone.a, m01 = bone.b, m03 = bone.worldX, @@ -138,7 +143,7 @@ namespace Spine.Unity { }; } - /// Outputs a 2x2 Transformation Matrix that can convert a skeleton-space position to a bone-local position. + /// Calculates a 2x2 Transformation Matrix that can convert a skeleton-space position to a bone-local position. public static void GetWorldToLocalMatrix (this Bone bone, out float ia, out float ib, out float ic, out float id) { float a = bone.a, b = bone.b, c = bone.c, d = bone.d; float invDet = 1 / (a * d - b * c); @@ -236,6 +241,8 @@ namespace Spine.Unity { } namespace Spine { + using System.Collections.Generic; + public static class SkeletonExtensions { public static bool IsWeighted (this VertexAttachment va) { return va.bones != null && va.bones.Length > 0; @@ -259,6 +266,85 @@ namespace Spine { animation.Apply(skeleton, lastTime, time, loop, events, 1f, false, false); } + internal static void SetPropertyToSetupPose (this Skeleton skeleton, int propertyID) { + int tt = propertyID >> 24; + var timelineType = (TimelineType)tt; + int i = propertyID - (tt << 24); + + Bone bone; + IkConstraint ikc; + PathConstraint pc; + + switch (timelineType) { + // Bone + case TimelineType.Rotate: + bone = skeleton.bones.Items[i]; + bone.rotation = bone.data.rotation; + break; + case TimelineType.Translate: + bone = skeleton.bones.Items[i]; + bone.x = bone.data.x; + bone.y = bone.data.y; + break; + case TimelineType.Scale: + bone = skeleton.bones.Items[i]; + bone.scaleX = bone.data.scaleX; + bone.scaleY = bone.data.scaleY; + break; + case TimelineType.Shear: + bone = skeleton.bones.Items[i]; + bone.shearX = bone.data.shearX; + bone.shearY = bone.data.shearY; + break; + + // Slot + case TimelineType.Attachment: + skeleton.SetSlotAttachmentToSetupPose(i); + break; + case TimelineType.Color: + skeleton.slots.Items[i].SetColorToSetupPose(); + break; + case TimelineType.Deform: + skeleton.slots.Items[i].attachmentVertices.Clear(); + break; + + // Skeleton + case TimelineType.DrawOrder: + skeleton.SetDrawOrderToSetupPose(); + break; + + // IK Constraint + case TimelineType.IkConstraint: + ikc = skeleton.ikConstraints.Items[i]; + ikc.mix = ikc.data.mix; + ikc.bendDirection = ikc.data.bendDirection; + break; + case TimelineType.TransformConstraint: + var tc = skeleton.transformConstraints.Items[i]; + var tcData = tc.data; + tc.rotateMix = tcData.rotateMix; + tc.translateMix = tcData.translateMix; + tc.scaleMix = tcData.scaleMix; + tc.shearMix = tcData.shearMix; + break; + + // Path Constraint + case TimelineType.PathConstraintPosition: + pc = skeleton.pathConstraints.Items[i]; + pc.position = pc.data.position; + break; + case TimelineType.PathConstraintSpacing: + pc = skeleton.pathConstraints.Items[i]; + pc.spacing = pc.data.spacing; + break; + case TimelineType.PathConstraintMix: + pc = skeleton.pathConstraints.Items[i]; + pc.rotateMix = pc.data.rotateMix; + pc.translateMix = pc.data.translateMix; + break; + } + } + /// Resets the DrawOrder to the Setup Pose's draw order public static void SetDrawOrderToSetupPose (this Skeleton skeleton) { var slotsItems = skeleton.slots.Items; @@ -315,5 +401,19 @@ namespace Spine { animation.Apply(skeleton, 0, 0, false, null, 0, true, true); } #endregion + + #region Skins + /// + public static void FindNamesForSlot (this Skin skin, string slotName, SkeletonData skeletonData, List results) { + int slotIndex = skeletonData.FindSlotIndex(slotName); + skin.FindNamesForSlot(slotIndex, results); + } + + /// + public static void FindAttachmentsForSlot (this Skin skin, string slotName, SkeletonData skeletonData, List results) { + int slotIndex = skeletonData.FindSlotIndex(slotName); + skin.FindAttachmentsForSlot(slotIndex, results); + } + #endregion } } From 0199570a27e9a1787db01cee0079834f2f53a282 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Feb 2017 10:22:33 +0800 Subject: [PATCH 4/9] [unity] Fix mesh bounds on SkeletonGraphic. --- .../Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs b/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs index 51284d47d..0e9ead5d1 100644 --- a/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs +++ b/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs @@ -96,7 +96,7 @@ namespace Spine.Unity.MeshGeneration { // Apply scale to vertices meshBoundsMax.x *= scale; meshBoundsMax.y *= scale; - meshBoundsMin.x *= scale; meshBoundsMax.y *= scale; + meshBoundsMin.x *= scale; meshBoundsMin.y *= scale; var vertices = this.meshVertices; for (int i = 0; i < totalVertexCount; i++) { Vector3 p = vertices[i]; From cee79b7beb06b00de87af824894a7acbc0aa12bb Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Feb 2017 15:28:02 +0800 Subject: [PATCH 5/9] [csharp] Allow events queued within callbacks. --- spine-csharp/src/AnimationState.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spine-csharp/src/AnimationState.cs b/spine-csharp/src/AnimationState.cs index 8ba41b284..8756f7b70 100644 --- a/spine-csharp/src/AnimationState.cs +++ b/spine-csharp/src/AnimationState.cs @@ -840,7 +840,7 @@ namespace Spine { } class EventQueue { - private readonly ExposedList eventQueueEntries = new ExposedList(); + private readonly List eventQueueEntries = new List(); public bool drainDisabled; private readonly AnimationState state; @@ -900,11 +900,11 @@ namespace Spine { drainDisabled = true; var entries = this.eventQueueEntries; - var entriesItems = entries.Items; AnimationState state = this.state; - for (int i = 0, n = entries.Count; i < n; i++) { - var queueEntry = entriesItems[i]; + // Don't cache entries.Count so callbacks can queue their own events (eg, call SetAnimation in AnimationState_Complete). + for (int i = 0; i < entries.Count; i++) { + var queueEntry = entries[i]; TrackEntry trackEntry = queueEntry.entry; switch (queueEntry.type) { From aefd9e4b0180052b9b8106350b3063d6e30f85fb Mon Sep 17 00:00:00 2001 From: id-ilych Date: Tue, 21 Feb 2017 12:17:14 +0200 Subject: [PATCH 6/9] Bug: wrong blend mode for MeshAttachment (#831) --- .../spine-starling/src/spine/starling/SkeletonSprite.as | 1 + 1 file changed, 1 insertion(+) diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as index 0530753cf..4a7019023 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as @@ -167,6 +167,7 @@ public class SkeletonSprite extends DisplayObject { mesh.setTexCoords(ii, uvs[iii], uvs[iii+1]); } vertexData.numVertices = verticesCount; + painter.state.blendMode = blendModes[slot.data.blendMode.ordinal]; // FIXME set smoothing/filter painter.batchMesh(mesh); } From 4502a432da45bb817a41939d70886b1bb120d01d Mon Sep 17 00:00:00 2001 From: shiverbrock Date: Tue, 21 Feb 2017 05:26:07 -0500 Subject: [PATCH 7/9] [ue4] Made compiling in VS work; defined behavior for GetTrackEntry() (#836) * Added include so that compiling in VS works. * Actually defined behavior for GetTrackEntry() --- .../Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h | 2 +- .../Source/SpinePlugin/Public/SpineSkeletonComponent.h | 1 + 2 files changed, 2 insertions(+), 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 e551e9bd6..899093b23 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h @@ -82,7 +82,7 @@ public: UTrackEntry () { } void SetTrackEntry (spTrackEntry* entry); - spTrackEntry* GetTrackEntry(); + spTrackEntry* GetTrackEntry() { return entry; } UFUNCTION(BlueprintCallable, Category="Components|Spine|TrackEntry") int GetTrackIndex () { return entry ? entry->trackIndex : 0; } diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h index 182a02ae1..9356f1ae1 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonComponent.h @@ -31,6 +31,7 @@ #pragma once #include "Components/ActorComponent.h" +#include "SpineSkeletonDataAsset.h" #include "spine/spine.h" #include "SpineSkeletonComponent.generated.h" From 7a2547831a44737343b3933c74ef7728f7627935 Mon Sep 17 00:00:00 2001 From: id-ilych Date: Thu, 23 Feb 2017 12:21:19 +0200 Subject: [PATCH 8/9] Bug: hitTest is broken for empty animation (#832) --- .../spine-starling/src/spine/starling/SkeletonSprite.as | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as index 4a7019023..dd90d3a60 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as @@ -184,6 +184,7 @@ public class SkeletonSprite extends DisplayObject { var maxX:Number = -Number.MAX_VALUE, maxY:Number = -Number.MAX_VALUE; var slots:Vector. = skeleton.slots; var worldVertices:Vector. = _tempVertices; + var empty:Boolean = true; for (var i:int = 0, n:int = slots.length; i < n; ++i) { var slot:Slot = slots[i]; var attachment:Attachment = slot.attachment; @@ -200,6 +201,10 @@ public class SkeletonSprite extends DisplayObject { mesh.computeWorldVertices(slot, worldVertices); } else continue; + + if (verticesLength != 0) + empty = false; + for (var ii:int = 0; ii < verticesLength; ii += 2) { var x:Number = worldVertices[ii], y:Number = worldVertices[ii + 1]; minX = minX < x ? minX : x; @@ -208,6 +213,9 @@ public class SkeletonSprite extends DisplayObject { maxY = maxY > y ? maxY : y; } } + + if (empty) + return null; var temp:Number; if (maxX < minX) { From 16b9d63bf7ad9a1313a072457ac40d2336fe8ab3 Mon Sep 17 00:00:00 2001 From: id-ilych Date: Thu, 23 Feb 2017 12:22:48 +0200 Subject: [PATCH 9/9] Bug: animation totally disappears if has alpha < 1 (#833) This problem was probably introduced while moving to new starling version where premultiplied alpha is no longer passed as an argument to `render()`. BTW if I get it right then there's no need to manually restore `blendMode` because `DisplayObjectContainer` wraps child's `render()` with `painter.pushState()`/`painter.popState()`. --- .../spine-starling/src/spine/starling/SkeletonSprite.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as index dd90d3a60..fdff71743 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as @@ -69,7 +69,7 @@ public class SkeletonSprite extends DisplayObject { } override public function render (painter:Painter) : void { - alpha *= this.alpha * skeleton.a; + painter.state.alpha *= skeleton.a; var originalBlendMode:String = painter.state.blendMode; var r:Number = skeleton.r * 255; var g:Number = skeleton.g * 255;