From 68f0c2f9f3573f30de8dc61302c541a5f570816b Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 14 Aug 2019 18:02:02 +0200 Subject: [PATCH 1/5] [unity] BoneFollower now has an additional option to not follow xy position (to follow rotation only). Closes #1451. --- .../Editor/Components/BoneFollowerGraphicInspector.cs | 4 +++- .../Editor/Components/BoneFollowerInspector.cs | 4 +++- .../spine-unity/Components/Following/BoneFollower.cs | 9 ++++++++- .../Components/Following/BoneFollowerGraphic.cs | 9 ++++++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/BoneFollowerGraphicInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/BoneFollowerGraphicInspector.cs index f76ecd4cc..12c577e20 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/BoneFollowerGraphicInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/BoneFollowerGraphicInspector.cs @@ -39,7 +39,7 @@ namespace Spine.Unity.Editor { [CustomEditor(typeof(BoneFollowerGraphic)), CanEditMultipleObjects] public class BoneFollowerGraphicInspector : Editor { - SerializedProperty boneName, skeletonGraphic, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip; + SerializedProperty boneName, skeletonGraphic, followXYPosition, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip; BoneFollowerGraphic targetBoneFollower; bool needsReset; @@ -73,6 +73,7 @@ namespace Spine.Unity.Editor { skeletonGraphic = serializedObject.FindProperty("skeletonGraphic"); boneName = serializedObject.FindProperty("boneName"); followBoneRotation = serializedObject.FindProperty("followBoneRotation"); + followXYPosition = serializedObject.FindProperty("followXYPosition"); followZPosition = serializedObject.FindProperty("followZPosition"); followLocalScale = serializedObject.FindProperty("followLocalScale"); followSkeletonFlip = serializedObject.FindProperty("followSkeletonFlip"); @@ -166,6 +167,7 @@ namespace Spine.Unity.Editor { needsReset |= EditorGUI.EndChangeCheck(); EditorGUILayout.PropertyField(followBoneRotation); + EditorGUILayout.PropertyField(followXYPosition); EditorGUILayout.PropertyField(followZPosition); EditorGUILayout.PropertyField(followLocalScale); EditorGUILayout.PropertyField(followSkeletonFlip); diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/BoneFollowerInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/BoneFollowerInspector.cs index ef9b9d707..33e23db8d 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/BoneFollowerInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/BoneFollowerInspector.cs @@ -37,7 +37,7 @@ namespace Spine.Unity.Editor { [CustomEditor(typeof(BoneFollower)), CanEditMultipleObjects] public class BoneFollowerInspector : Editor { - SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip; + SerializedProperty boneName, skeletonRenderer, followXYPosition, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip; BoneFollower targetBoneFollower; bool needsReset; @@ -82,6 +82,7 @@ namespace Spine.Unity.Editor { skeletonRenderer = serializedObject.FindProperty("skeletonRenderer"); boneName = serializedObject.FindProperty("boneName"); followBoneRotation = serializedObject.FindProperty("followBoneRotation"); + followXYPosition = serializedObject.FindProperty("followXYPosition"); followZPosition = serializedObject.FindProperty("followZPosition"); followLocalScale = serializedObject.FindProperty("followLocalScale"); followSkeletonFlip = serializedObject.FindProperty("followSkeletonFlip"); @@ -172,6 +173,7 @@ namespace Spine.Unity.Editor { needsReset |= EditorGUI.EndChangeCheck(); EditorGUILayout.PropertyField(followBoneRotation); + EditorGUILayout.PropertyField(followXYPosition); EditorGUILayout.PropertyField(followZPosition); EditorGUILayout.PropertyField(followLocalScale); EditorGUILayout.PropertyField(followSkeletonFlip); diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/Following/BoneFollower.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/Following/BoneFollower.cs index a18ed6f30..b0edb485c 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/Following/BoneFollower.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/Following/BoneFollower.cs @@ -59,6 +59,7 @@ namespace Spine.Unity { [SpineBone(dataField: "skeletonRenderer")] [SerializeField] public string boneName; + public bool followXYPosition = true; public bool followZPosition = true; public bool followBoneRotation = true; @@ -142,7 +143,9 @@ namespace Spine.Unity { Transform thisTransform = this.transform; if (skeletonTransformIsParent) { // Recommended setup: Use local transform properties if Spine GameObject is the immediate parent - thisTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : thisTransform.localPosition.z); + thisTransform.localPosition = new Vector3(followXYPosition ? bone.worldX : thisTransform.localPosition.x, + followXYPosition ? bone.worldY : thisTransform.localPosition.y, + followZPosition ? 0f : thisTransform.localPosition.z); if (followBoneRotation) { float halfRotation = Mathf.Atan2(bone.c, bone.a) * 0.5f; if (followLocalScale && bone.scaleX < 0) // Negate rotation from negative scaleX. Don't use negative determinant. local scaleY doesn't factor into used rotation. @@ -157,6 +160,10 @@ namespace Spine.Unity { // For special cases: Use transform world properties if transform relationship is complicated Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f)); if (!followZPosition) targetWorldPosition.z = thisTransform.position.z; + if (!followXYPosition) { + targetWorldPosition.x = thisTransform.position.x; + targetWorldPosition.y = thisTransform.position.y; + } float boneWorldRotation = bone.WorldRotationX; diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/Following/BoneFollowerGraphic.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/Following/BoneFollowerGraphic.cs index 76077bcf1..7ba99ca1b 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Components/Following/BoneFollowerGraphic.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Components/Following/BoneFollowerGraphic.cs @@ -63,6 +63,7 @@ namespace Spine.Unity { public bool followSkeletonFlip = true; [Tooltip("Follows the target bone's local scale. BoneFollower cannot inherit world/skewed scale because of UnityEngine.Transform property limitations.")] public bool followLocalScale = false; + public bool followXYPosition = true; public bool followZPosition = true; [System.NonSerialized] public Bone bone; @@ -134,12 +135,18 @@ namespace Spine.Unity { if (skeletonTransformIsParent) { // Recommended setup: Use local transform properties if Spine GameObject is the immediate parent - thisTransform.localPosition = new Vector3(bone.worldX * scale, bone.worldY * scale, followZPosition ? 0f : thisTransform.localPosition.z); + thisTransform.localPosition = new Vector3(followXYPosition ? bone.worldX * scale : thisTransform.localPosition.x, + followXYPosition ? bone.worldY * scale : thisTransform.localPosition.y, + followZPosition ? 0f : thisTransform.localPosition.z); if (followBoneRotation) thisTransform.localRotation = bone.GetQuaternion(); } else { // For special cases: Use transform world properties if transform relationship is complicated Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX * scale, bone.worldY * scale, 0f)); if (!followZPosition) targetWorldPosition.z = thisTransform.position.z; + if (!followXYPosition) { + targetWorldPosition.x = thisTransform.position.x; + targetWorldPosition.y = thisTransform.position.y; + } float boneWorldRotation = bone.WorldRotationX; From 4d2118057059b57101f608de6132ede609471a37 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Thu, 15 Aug 2019 11:15:00 +0200 Subject: [PATCH 2/5] [csharp] Fixed MeshAttachment copies not copying rotation. Closes #1452. --- spine-csharp/src/Attachments/MeshAttachment.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spine-csharp/src/Attachments/MeshAttachment.cs b/spine-csharp/src/Attachments/MeshAttachment.cs index f9840f84c..1341aacf7 100644 --- a/spine-csharp/src/Attachments/MeshAttachment.cs +++ b/spine-csharp/src/Attachments/MeshAttachment.cs @@ -160,6 +160,8 @@ namespace Spine { copy.regionHeight = regionHeight; copy.regionOriginalWidth = regionOriginalWidth; copy.regionOriginalHeight = regionOriginalHeight; + copy.RegionRotate = RegionRotate; + copy.RegionDegrees = RegionDegrees; copy.Path = Path; copy.r = r; copy.g = g; @@ -195,6 +197,8 @@ namespace Spine { mesh.regionHeight = regionHeight; mesh.regionOriginalWidth = regionOriginalWidth; mesh.regionOriginalHeight = regionOriginalHeight; + mesh.RegionDegrees = RegionDegrees; + mesh.RegionRotate = RegionRotate; mesh.Path = Path; mesh.r = r; From 7a789752acb657e163950cbc77fea5833de51685 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Thu, 15 Aug 2019 14:12:55 +0200 Subject: [PATCH 3/5] [unity] Fixed GetRepackedSkin ignoring whitespace stripping. Closes #1399. --- .../Runtime/spine-unity/Utility/AtlasUtilities.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs index 70e55c0f7..933bf89e6 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs @@ -289,7 +289,8 @@ namespace Spine.Unity.AttachmentTools { var repackedRegions = new List(); for (int i = 0, n = originalRegions.Count; i < n; i++) { var oldRegion = originalRegions[i]; - var newRegion = UVRectToAtlasRegion(rects[i], oldRegion.name, page, oldRegion.offsetX, oldRegion.offsetY, oldRegion.rotate); + var newRegion = UVRectToAtlasRegion(rects[i], oldRegion.name, page, oldRegion.offsetX, oldRegion.offsetY, + oldRegion.rotate, oldRegion.originalWidth, oldRegion.originalHeight); repackedRegions.Add(newRegion); } @@ -381,7 +382,8 @@ namespace Spine.Unity.AttachmentTools { var repackedRegions = new List(); for (int i = 0, n = originalRegions.Count; i < n; i++) { var oldRegion = originalRegions[i]; - var newRegion = UVRectToAtlasRegion(rects[i], oldRegion.name, page, oldRegion.offsetX, oldRegion.offsetY, oldRegion.rotate); + var newRegion = UVRectToAtlasRegion(rects[i], oldRegion.name, page, oldRegion.offsetX, oldRegion.offsetY, + oldRegion.rotate, oldRegion.originalWidth, oldRegion.originalHeight); repackedRegions.Add(newRegion); } @@ -424,7 +426,7 @@ namespace Spine.Unity.AttachmentTools { CachedRegionTextures.TryGetValue(ar, out output); if (output == null) { Texture2D sourceTexture = ar.GetMainTexture(); - Rect r = ar.GetUnityRect(sourceTexture.height); + Rect r = ar.GetUnityRect(); int width = (int)r.width; int height = (int)r.height; output = new Texture2D(width, height, textureFormat, mipmaps) { name = ar.name }; @@ -516,7 +518,8 @@ namespace Spine.Unity.AttachmentTools { /// /// Creates a new Spine AtlasRegion according to a Unity UV Rect (x-right, y-up, uv-normalized). - static AtlasRegion UVRectToAtlasRegion (Rect uvRect, string name, AtlasPage page, float offsetX, float offsetY, bool rotate) { + static AtlasRegion UVRectToAtlasRegion (Rect uvRect, string name, AtlasPage page, float offsetX, float offsetY, bool rotate, + int originalWidth, int originalHeight) { var tr = UVRectToTextureRect(uvRect, page.width, page.height); var rr = tr.SpineUnityFlipRect(page.height); @@ -542,9 +545,9 @@ namespace Spine.Unity.AttachmentTools { index = -1, width = w, - originalWidth = w, + originalWidth = originalWidth, height = h, - originalHeight = h, + originalHeight = originalHeight, offsetX = offsetX, offsetY = offsetY, x = x, From ae4790b85c763165162d5aebf707bd94bea907e5 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Mon, 19 Aug 2019 11:48:16 +0200 Subject: [PATCH 4/5] [unity] Fixed code where a default skin was assumed to exist (which is no longer the case). Fixes an error at SkeletonDataAsset inspector -> show slots -> show attachments. Closes #1453. --- .../Sample Components/Legacy/SpriteAttacher.cs | 3 ++- .../Asset Types/SkeletonDataAssetInspector.cs | 15 +++++++++------ .../Editor/Windows/SkeletonDebugWindow.cs | 2 +- .../Runtime/spine-unity/Utility/SkinUtilities.cs | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/Legacy/SpriteAttacher.cs b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/Legacy/SpriteAttacher.cs index 29c0e71c9..950cb90f5 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/Sample Components/Legacy/SpriteAttacher.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/Sample Components/Legacy/SpriteAttacher.cs @@ -170,7 +170,8 @@ namespace Spine.Unity.Examples { if (skinName != "") skin = skeletonData.FindSkin(skinName); - skin.SetAttachment(slotIndex, att.Name, att); + if (skin != null) + skin.SetAttachment(slotIndex, att.Name, att); return att; } diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Asset Types/SkeletonDataAssetInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Asset Types/SkeletonDataAssetInspector.cs index 3817aab83..867489157 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Asset Types/SkeletonDataAssetInspector.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Asset Types/SkeletonDataAssetInspector.cs @@ -497,12 +497,15 @@ namespace Spine.Unity.Editor { using (new SpineInspectorUtility.IndentScope()) { { skin.GetAttachments(i, slotAttachments); - if (skin != defaultSkin) { - defaultSkin.GetAttachments(i, slotAttachments); - defaultSkin.GetAttachments(i, defaultSkinAttachments); - } else { - defaultSkin.GetAttachments(i, defaultSkinAttachments); - } + if (defaultSkin != null) { + if (skin != defaultSkin) { + defaultSkin.GetAttachments(i, slotAttachments); + defaultSkin.GetAttachments(i, defaultSkinAttachments); + } + else { + defaultSkin.GetAttachments(i, defaultSkinAttachments); + } + } } for (int a = 0; a < slotAttachments.Count; a++) { diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Windows/SkeletonDebugWindow.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Windows/SkeletonDebugWindow.cs index db0b23e70..a95c7806d 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Windows/SkeletonDebugWindow.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Windows/SkeletonDebugWindow.cs @@ -582,7 +582,7 @@ namespace Spine.Unity.Editor { attachmentTable.Add(skeleton.Slots.Items[i], attachments); // Add skin attachments. skin.GetAttachments(i, attachments); - if (notDefaultSkin) // Add default skin attachments. + if (notDefaultSkin && defaultSkin != null) // Add default skin attachments. defaultSkin.GetAttachments(i, attachments); } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/SkinUtilities.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/SkinUtilities.cs index 22f3e76f1..c26c6a601 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/SkinUtilities.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/SkinUtilities.cs @@ -58,7 +58,7 @@ namespace Spine.Unity.AttachmentTools { var defaultSkin = skeleton.data.DefaultSkin; var activeSkin = skeleton.skin; - if (includeDefaultSkin) + if (includeDefaultSkin && defaultSkin != null) defaultSkin.CopyTo(newSkin, true, cloneAttachments, cloneMeshesAsLinked); if (activeSkin != null) From a232f6ee7fad63d796867f9c8bf1884a3e85344c Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Mon, 19 Aug 2019 15:49:03 +0200 Subject: [PATCH 5/5] [unity] Fixed incorrect region after GetRepackedSkin when maxAtlasSize leads to downscaling. Previous commit be77b0c let this problem surface more often. Closes #1455. --- .../spine-unity/Utility/AtlasUtilities.cs | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs index 933bf89e6..cd4f22e6d 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Utility/AtlasUtilities.cs @@ -289,8 +289,7 @@ namespace Spine.Unity.AttachmentTools { var repackedRegions = new List(); for (int i = 0, n = originalRegions.Count; i < n; i++) { var oldRegion = originalRegions[i]; - var newRegion = UVRectToAtlasRegion(rects[i], oldRegion.name, page, oldRegion.offsetX, oldRegion.offsetY, - oldRegion.rotate, oldRegion.originalWidth, oldRegion.originalHeight); + var newRegion = UVRectToAtlasRegion(rects[i], oldRegion, page); repackedRegions.Add(newRegion); } @@ -382,8 +381,7 @@ namespace Spine.Unity.AttachmentTools { var repackedRegions = new List(); for (int i = 0, n = originalRegions.Count; i < n; i++) { var oldRegion = originalRegions[i]; - var newRegion = UVRectToAtlasRegion(rects[i], oldRegion.name, page, oldRegion.offsetX, oldRegion.offsetY, - oldRegion.rotate, oldRegion.originalWidth, oldRegion.originalHeight); + var newRegion = UVRectToAtlasRegion(rects[i], oldRegion, page); repackedRegions.Add(newRegion); } @@ -518,14 +516,13 @@ namespace Spine.Unity.AttachmentTools { /// /// Creates a new Spine AtlasRegion according to a Unity UV Rect (x-right, y-up, uv-normalized). - static AtlasRegion UVRectToAtlasRegion (Rect uvRect, string name, AtlasPage page, float offsetX, float offsetY, bool rotate, - int originalWidth, int originalHeight) { + static AtlasRegion UVRectToAtlasRegion (Rect uvRect, AtlasRegion referenceRegion, AtlasPage page) { var tr = UVRectToTextureRect(uvRect, page.width, page.height); var rr = tr.SpineUnityFlipRect(page.height); int x = (int)rr.x, y = (int)rr.y; int w, h; - if (rotate) { + if (referenceRegion.rotate) { w = (int)rr.height; h = (int)rr.width; } else { @@ -533,9 +530,14 @@ namespace Spine.Unity.AttachmentTools { h = (int)rr.height; } + int originalW = Mathf.RoundToInt((float)w * ((float)referenceRegion.originalWidth / (float)referenceRegion.width)); + int originalH = Mathf.RoundToInt((float)h * ((float)referenceRegion.originalHeight / (float)referenceRegion.height)); + int offsetX = Mathf.RoundToInt((float)referenceRegion.offsetX * ((float)w / (float)referenceRegion.width)); + int offsetY = Mathf.RoundToInt((float)referenceRegion.offsetY * ((float)h / (float)referenceRegion.height)); + return new AtlasRegion { page = page, - name = name, + name = referenceRegion.name, u = uvRect.xMin, u2 = uvRect.xMax, @@ -545,15 +547,15 @@ namespace Spine.Unity.AttachmentTools { index = -1, width = w, - originalWidth = originalWidth, + originalWidth = originalW, height = h, - originalHeight = originalHeight, + originalHeight = originalH, offsetX = offsetX, offsetY = offsetY, x = x, y = y, - rotate = rotate + rotate = referenceRegion.rotate }; }