From bd40a5fa33764e2886a8f290ebf25027d35241db Mon Sep 17 00:00:00 2001 From: Fenrisul Date: Thu, 11 Sep 2014 20:10:33 -0700 Subject: [PATCH] SkeletonUtility initial commit --- .../{BoneComponent.cs => BoneFollower.cs} | 48 ++- ...Component.cs.meta => BoneFollower.cs.meta} | 2 +- .../Editor/BoneFollowerInspector.cs | 106 ++++++ .../Editor/BoneFollowerInspector.cs.meta | 8 + .../Editor/GUI/icon-animation.png.meta | 1 + .../Editor/GUI/icon-animationRoot.png.meta | 1 + .../spine-unity/Editor/GUI/icon-bone.png | Bin 0 -> 515 bytes .../spine-unity/Editor/GUI/icon-bone.png.meta | 47 +++ .../spine-unity/Editor/GUI/icon-boneNib.png | Bin 0 -> 3364 bytes .../Editor/GUI/icon-boneNib.png.meta | 47 +++ .../Editor/GUI/icon-boundingBox.png | Bin 0 -> 3016 bytes .../Editor/GUI/icon-boundingBox.png.meta | 47 +++ .../Editor/GUI/icon-constraintNib.png | Bin 0 -> 14078 bytes .../Editor/GUI/icon-constraintNib.png.meta | 47 +++ .../Editor/GUI/icon-event.png.meta | 1 + .../Editor/GUI/icon-hingeChain.png | Bin 0 -> 757 bytes .../Editor/GUI/icon-hingeChain.png.meta | 47 +++ .../spine-unity/Editor/GUI/icon-image.png | Bin 0 -> 3132 bytes .../Editor/GUI/icon-image.png.meta | 47 +++ .../spine-unity/Editor/GUI/icon-mesh.png | Bin 0 -> 603 bytes .../spine-unity/Editor/GUI/icon-mesh.png.meta | 47 +++ .../spine-unity/Editor/GUI/icon-null.png | Bin 0 -> 3023 bytes .../spine-unity/Editor/GUI/icon-null.png.meta | 47 +++ .../spine-unity/Editor/GUI/icon-poseBones.png | Bin 0 -> 555 bytes .../Editor/GUI/icon-poseBones.png.meta | 47 +++ .../Editor/GUI/icon-skeleton.png.meta | 1 + .../Editor/GUI/icon-skeletonUtility.png | Bin 0 -> 1133 bytes .../Editor/GUI/icon-skeletonUtility.png.meta | 47 +++ .../spine-unity/Editor/GUI/icon-skin.png | Bin 0 -> 3430 bytes .../spine-unity/Editor/GUI/icon-skin.png.meta | 47 +++ .../Editor/GUI/icon-skinPlaceholder.png | Bin 0 -> 3370 bytes .../Editor/GUI/icon-skinPlaceholder.png.meta | 47 +++ .../Editor/GUI/icon-skinsRoot.png.meta | 1 + .../spine-unity/Editor/GUI/icon-slot.png | Bin 0 -> 3387 bytes .../spine-unity/Editor/GUI/icon-slot.png.meta | 47 +++ .../Editor/GUI/icon-spine.png.meta | 1 + .../Editor/GUI/icon-subMeshRenderer.png | Bin 0 -> 3536 bytes .../Editor/GUI/icon-subMeshRenderer.png.meta | 47 +++ .../spine-unity/Editor/GUI/icon-warning.png | Bin 0 -> 1713 bytes .../Editor/GUI/icon-warning.png.meta | 47 +++ .../Editor/SkeletonAnimationInspector.cs | 37 ++ .../Editor/SkeletonDataAssetInspector.cs | 37 +- .../Editor/SpineEditorUtilities.cs | 114 +++++- .../Assets/spine-unity/Shaders/Bones.shader | 69 ++++ .../spine-unity/Shaders/Bones.shader.meta | 5 + .../Assets/spine-unity/Shaders/HiddenPass.mat | Bin 0 -> 4288 bytes .../spine-unity/Shaders/HiddenPass.mat.meta | 4 + .../spine-unity/Shaders/HiddenPass.shader | 21 ++ .../Shaders/HiddenPass.shader.meta | 5 + .../Assets/spine-unity/SkeletonAnimation.cs | 18 +- .../Assets/spine-unity/SkeletonExtensions.cs | 37 +- .../Assets/spine-unity/SkeletonRenderer.cs | 11 +- .../Assets/spine-unity/SkeletonUtility.meta | 5 + .../spine-unity/SkeletonUtility/Editor.meta | 5 + .../Editor/SkeletonUtilityBoneInspector.cs | 287 +++++++++++++++ .../SkeletonUtilityBoneInspector.cs.meta | 8 + .../Editor/SkeletonUtilityInspector.cs | 316 +++++++++++++++++ .../Editor/SkeletonUtilityInspector.cs.meta | 8 + .../SkeletonUtility/SkeletonUtility.cs | 335 ++++++++++++++++++ .../SkeletonUtility/SkeletonUtility.cs.meta | 8 + .../SkeletonUtility/SkeletonUtilityBone.cs | 218 ++++++++++++ .../SkeletonUtilityBone.cs.meta | 8 + .../SkeletonUtilityConstraint.cs | 22 ++ .../SkeletonUtilityConstraint.cs.meta | 8 + .../SkeletonUtilityEyeConstraint.cs | 61 ++++ .../SkeletonUtilityEyeConstraint.cs.meta | 8 + .../SkeletonUtilityGroundConstraint.cs | 58 +++ .../SkeletonUtilityGroundConstraint.cs.meta | 8 + .../SkeletonUtilityKinematicShadow.cs | 81 +++++ .../SkeletonUtilityKinematicShadow.cs.meta | 8 + .../SkeletonUtilitySubmeshRenderer.cs | 102 ++++++ .../SkeletonUtilitySubmeshRenderer.cs.meta | 12 + 72 files changed, 2751 insertions(+), 48 deletions(-) rename spine-unity/Assets/spine-unity/{BoneComponent.cs => BoneFollower.cs} (85%) rename spine-unity/Assets/spine-unity/{BoneComponent.cs.meta => BoneFollower.cs.meta} (78%) create mode 100644 spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs create mode 100644 spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-bone.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-bone.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-boneNib.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-boneNib.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-boundingBox.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-boundingBox.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-constraintNib.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-constraintNib.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-hingeChain.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-hingeChain.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-image.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-image.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-mesh.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-mesh.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-null.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-null.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-poseBones.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-poseBones.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-skin.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-skin.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-slot.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-slot.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-subMeshRenderer.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-subMeshRenderer.png.meta create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-warning.png create mode 100644 spine-unity/Assets/spine-unity/Editor/GUI/icon-warning.png.meta create mode 100644 spine-unity/Assets/spine-unity/Shaders/Bones.shader create mode 100644 spine-unity/Assets/spine-unity/Shaders/Bones.shader.meta create mode 100644 spine-unity/Assets/spine-unity/Shaders/HiddenPass.mat create mode 100644 spine-unity/Assets/spine-unity/Shaders/HiddenPass.mat.meta create mode 100644 spine-unity/Assets/spine-unity/Shaders/HiddenPass.shader create mode 100644 spine-unity/Assets/spine-unity/Shaders/HiddenPass.shader.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/Editor.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityEyeConstraint.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityEyeConstraint.cs.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityGroundConstraint.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityGroundConstraint.cs.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityKinematicShadow.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityKinematicShadow.cs.meta create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs create mode 100644 spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs.meta diff --git a/spine-unity/Assets/spine-unity/BoneComponent.cs b/spine-unity/Assets/spine-unity/BoneFollower.cs similarity index 85% rename from spine-unity/Assets/spine-unity/BoneComponent.cs rename to spine-unity/Assets/spine-unity/BoneFollower.cs index acfe183cb..5c8fa3f92 100644 --- a/spine-unity/Assets/spine-unity/BoneComponent.cs +++ b/spine-unity/Assets/spine-unity/BoneFollower.cs @@ -36,8 +36,9 @@ using Spine; /// Sets a GameObject's transform to match a bone on a Spine skeleton. [ExecuteInEditMode] -[AddComponentMenu("Spine/BoneComponent")] -public class BoneComponent : MonoBehaviour { +[AddComponentMenu("Spine/BoneFollower")] +public class BoneFollower : MonoBehaviour { + [System.NonSerialized] public bool valid; @@ -55,31 +56,50 @@ public class BoneComponent : MonoBehaviour { } } - // TODO: Make the rotation behavior more customizable - // public bool followTransformRotation = false; - - // TODO: Make transform follow bone scale? too specific? This is really useful for shared shadow assets. - //public bool followBoneScale = false; /// If a bone isn't set, boneName is used to find the bone. public String boneName; + public bool resetOnAwake = true; + protected Transform cachedTransform; protected Transform skeletonTransform; - + + public void HandleResetRenderer(SkeletonRenderer skeletonRenderer){ + Reset(); + } + public void Reset () { bone = null; cachedTransform = transform; valid = skeletonRenderer != null && skeletonRenderer.valid; if (!valid) return; skeletonTransform = skeletonRenderer.transform; + + skeletonRenderer.OnReset -= HandleResetRenderer; + skeletonRenderer.OnReset += HandleResetRenderer; + + if(Application.isEditor) + DoUpdate(); + } + + void OnDestroy(){ + //cleanup + if(skeletonRenderer != null) + skeletonRenderer.OnReset -= HandleResetRenderer; } public void Awake () { - Reset(); + if(resetOnAwake) + Reset(); } - public void LateUpdate () { + void LateUpdate(){ + DoUpdate(); + } + + + public void DoUpdate () { if (!valid) { Reset(); return; @@ -92,6 +112,9 @@ public class BoneComponent : MonoBehaviour { Debug.LogError("Bone not found: " + boneName, this); return; } + else{ + + } } Spine.Skeleton skeleton = skeletonRenderer.skeleton; @@ -113,9 +136,10 @@ public class BoneComponent : MonoBehaviour { if(followBoneRotation) { Vector3 rotation = skeletonTransform.rotation.eulerAngles; - cachedTransform.rotation = Quaternion.Euler(rotation.x, rotation.y, - skeletonTransform.rotation.eulerAngles.z + (bone.worldRotation * flipRotation) ); + + cachedTransform.rotation = Quaternion.Euler(rotation.x, rotation.y, skeletonTransform.rotation.eulerAngles.z + (bone.worldRotation * flipRotation) ); } } + } } \ No newline at end of file diff --git a/spine-unity/Assets/spine-unity/BoneComponent.cs.meta b/spine-unity/Assets/spine-unity/BoneFollower.cs.meta similarity index 78% rename from spine-unity/Assets/spine-unity/BoneComponent.cs.meta rename to spine-unity/Assets/spine-unity/BoneFollower.cs.meta index a6a16dd66..29dabc13e 100644 --- a/spine-unity/Assets/spine-unity/BoneComponent.cs.meta +++ b/spine-unity/Assets/spine-unity/BoneFollower.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 487b42efe96d8cc408a757541ea3f169 +guid: a1fd8daaed7b64148a34acb96ba14ce1 MonoImporter: serializedVersion: 2 defaultReferences: [] diff --git a/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs new file mode 100644 index 000000000..bbf164b4e --- /dev/null +++ b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs @@ -0,0 +1,106 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), you + * may not (a) modify, translate, adapt or otherwise create derivative works, + * improvements of the Software or develop new applications using the Software + * or (b) remove, delete, alter or obscure any trademarks or any copyright, + * trademark, patent or other intellectual property or proprietary rights + * notices on or in the Software, including any copy thereof. Redistributions + * in binary or source form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using UnityEditor; +using UnityEngine; + +[CustomEditor(typeof(BoneFollower))] +public class BoneFollowerInspector : Editor { + private SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation; + BoneFollower component; + void OnEnable () { + skeletonRenderer = serializedObject.FindProperty("skeletonRenderer"); + boneName = serializedObject.FindProperty("boneName"); + followBoneRotation = serializedObject.FindProperty("followBoneRotation"); + followZPosition = serializedObject.FindProperty("followZPosition"); + component = (BoneFollower)target; + ForceReload(); + } + + void FindRenderer(){ + if(skeletonRenderer.objectReferenceValue == null){ + SkeletonRenderer parentRenderer = component.GetComponentInParent(); + if(parentRenderer != null){ + skeletonRenderer.objectReferenceValue = (UnityEngine.Object)parentRenderer; + } + } + } + + void ForceReload(){ + if(component.skeletonRenderer != null){ + if(component.skeletonRenderer.valid == false) + component.skeletonRenderer.Reset(); + } + } + + override public void OnInspectorGUI () { + serializedObject.Update(); + + FindRenderer(); + + EditorGUILayout.PropertyField(skeletonRenderer); + + if (component.valid) { + String[] bones = new String[1]; + try{ + bones = new String[component.skeletonRenderer.skeleton.Data.Bones.Count + 1]; + } + catch{ + + } + + bones[0] = ""; + for (int i = 0; i < bones.Length - 1; i++) + bones[i + 1] = component.skeletonRenderer.skeleton.Data.Bones[i].Name; + Array.Sort(bones); + int boneIndex = Math.Max(0, Array.IndexOf(bones, boneName.stringValue)); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Bone"); + EditorGUIUtility.LookLikeControls(); + boneIndex = EditorGUILayout.Popup(boneIndex, bones); + EditorGUILayout.EndHorizontal(); + + boneName.stringValue = boneIndex == 0 ? null : bones[boneIndex]; + EditorGUILayout.PropertyField(followBoneRotation); + EditorGUILayout.PropertyField(followZPosition); + } + else{ + GUILayout.Label("INVALID"); + } + + if (serializedObject.ApplyModifiedProperties() || + (Event.current.type == EventType.ValidateCommand && Event.current.commandName == "UndoRedoPerformed") + ) { + component.Reset(); + } + } +} diff --git a/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs.meta b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs.meta new file mode 100644 index 000000000..a5cf9ae89 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c71ca35fd6241cb49a0b0756a664fcf7 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-animation.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-animation.png.meta index f8ac9f868..6d9bc41dd 100644 --- a/spine-unity/Assets/spine-unity/Editor/GUI/icon-animation.png.meta +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-animation.png.meta @@ -1,6 +1,7 @@ fileFormatVersion: 2 guid: 52b12ec801461494185a4d3dc66f3d1d TextureImporter: + fileIDToRecycleName: {} serializedVersion: 2 mipmaps: mipMapMode: 0 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-animationRoot.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-animationRoot.png.meta index 1b4c1e24f..4bcf433e8 100644 --- a/spine-unity/Assets/spine-unity/Editor/GUI/icon-animationRoot.png.meta +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-animationRoot.png.meta @@ -1,6 +1,7 @@ fileFormatVersion: 2 guid: 3d1be4ea889f3a14b864352fe49a1bde TextureImporter: + fileIDToRecycleName: {} serializedVersion: 2 mipmaps: mipMapMode: 0 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-bone.png b/spine-unity/Assets/spine-unity/Editor/GUI/icon-bone.png new file mode 100644 index 0000000000000000000000000000000000000000..ec66a6a85588b584071e68bfa670eb2e758a3e6b GIT binary patch literal 515 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 KMNUMnLSTYb4V82N literal 0 HcmV?d00001 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-boundingBox.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-boundingBox.png.meta new file mode 100644 index 000000000..c90f54d3c --- /dev/null +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-boundingBox.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 955aed20030d0504b8a9c6934a5cb47a +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-constraintNib.png b/spine-unity/Assets/spine-unity/Editor/GUI/icon-constraintNib.png new file mode 100644 index 0000000000000000000000000000000000000000..175bcb047ad5242ad2d48ca94298a65eeed61514 GIT binary patch literal 14078 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 E7aRC%)c^nh literal 0 HcmV?d00001 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-constraintNib.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-constraintNib.png.meta new file mode 100644 index 000000000..e7ab7aca3 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-constraintNib.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: de1a4f5ad4bdf1a4ea072c4d59ba87d8 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-event.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-event.png.meta index 71c672b9c..2ab786189 100644 --- a/spine-unity/Assets/spine-unity/Editor/GUI/icon-event.png.meta +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-event.png.meta @@ -1,6 +1,7 @@ fileFormatVersion: 2 guid: d226a80acc775714aa78b85e16a00e9b TextureImporter: + fileIDToRecycleName: {} serializedVersion: 2 mipmaps: mipMapMode: 0 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-hingeChain.png b/spine-unity/Assets/spine-unity/Editor/GUI/icon-hingeChain.png new file mode 100644 index 0000000000000000000000000000000000000000..a27af1c7c529ca05ab5f82b5b0f72d093b37fb8e GIT binary patch literal 757 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 WK!44B#El970000-n zl9S}FA$SID@;pHjY3hIw2yregKVKUl9TZ>c|Kxy_Y<%JECX%8N-6*>5VE%y`O9;_#=-k_0h{dXyka=~ zOqTsFwbU*EJV=L&iviF99;nw9@YIWVi>?tGlh zveZwemcd%-^*LZky{^tbJ`?bgDEi{twB;#`V>Frq?)qH<+*7an)oc$|Jeww~t7pJr z;fV@^)6=0B?m4jGnJg8GmvpN5z&r5~aeU|SIOp5Du)jEOG24SDz=0&^YZi!O3oIC8 zjwHD&A0$bJq{i8afH%Mz@YqkK!*yr2t4_3b2H@At+Ym*seXmy$$9BS*twICpo!FUJ pVNsLk$zKLWQtfY?{CWSX`2(S2E9%66Rh0k$002ovPDHLkV1oU23VZ+n literal 0 HcmV?d00001 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-mesh.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-mesh.png.meta new file mode 100644 index 000000000..a98b0e9c8 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-mesh.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: a309a2e14638a204091b915126910f45 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-null.png b/spine-unity/Assets/spine-unity/Editor/GUI/icon-null.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6d738ebd50b85b80645160e244c3886933b4d8 GIT binary patch literal 3023 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 literal 0 HcmV?d00001 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png.meta new file mode 100644 index 000000000..9d3c22794 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 5bb0631368b462047869d8788673cb48 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-skin.png b/spine-unity/Assets/spine-unity/Editor/GUI/icon-skin.png new file mode 100644 index 0000000000000000000000000000000000000000..3d9bddeb4a3c2c2889143bc1a79853dbb84166a4 GIT binary patch literal 3430 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 literal 0 HcmV?d00001 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-skin.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-skin.png.meta new file mode 100644 index 000000000..3be7a6e69 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-skin.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: bfd9f3d2607e9e44c97384d7575a17dc +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png b/spine-unity/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png new file mode 100644 index 0000000000000000000000000000000000000000..3b11d379e43d42f770f6b3aaa58588f63774553b GIT binary patch literal 3370 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.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 W*c~!{*LmCX6HzHP$&V*%EB^-QZFN}y literal 0 HcmV?d00001 diff --git a/spine-unity/Assets/spine-unity/Editor/GUI/icon-warning.png.meta b/spine-unity/Assets/spine-unity/Editor/GUI/icon-warning.png.meta new file mode 100644 index 000000000..e32950ca4 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Editor/GUI/icon-warning.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 754d724c1bd750048852e8cf3d4a05ee +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs b/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs index bc6d6b19c..f8d29894e 100644 --- a/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs +++ b/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs @@ -31,16 +31,23 @@ using System; using UnityEditor; using UnityEngine; +using Spine; [CustomEditor(typeof(SkeletonAnimation))] public class SkeletonAnimationInspector : SkeletonRendererInspector { protected SerializedProperty animationName, loop, timeScale; + protected bool isPrefab; protected override void OnEnable () { base.OnEnable(); animationName = serializedObject.FindProperty("_animationName"); loop = serializedObject.FindProperty("loop"); timeScale = serializedObject.FindProperty("timeScale"); + + if(PrefabUtility.GetPrefabType(this.target) == PrefabType.Prefab) + isPrefab = true; + + } protected override void gui () { @@ -49,6 +56,25 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector { SkeletonAnimation component = (SkeletonAnimation)target; if (!component.valid) return; + //catch case where SetAnimation was used to set track 0 without using AnimationName + if(Application.isPlaying){ + TrackEntry currentState = component.state.GetCurrent(0); + if(currentState != null){ + if(component.AnimationName != animationName.stringValue){ + animationName.stringValue = currentState.Animation.Name; + } + + if(loop.boolValue != currentState.Loop){ + loop.boolValue = currentState.Loop; + } + + if(timeScale.floatValue != currentState.TimeScale){ + timeScale.floatValue = currentState.TimeScale; + } + } + } + + // Animation name. { String[] animations = new String[component.skeleton.Data.Animations.Count + 1]; @@ -69,10 +95,21 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector { String selectedAnimationName = animationIndex == 0 ? null : animations[animationIndex]; component.AnimationName = selectedAnimationName; animationName.stringValue = selectedAnimationName; + + } EditorGUILayout.PropertyField(loop); EditorGUILayout.PropertyField(timeScale); component.timeScale = Math.Max(component.timeScale, 0); + EditorGUILayout.Space(); + + if(!isPrefab){ + if(component.GetComponent() == null){ + if(GUILayout.Button(new GUIContent("Add Skeleton Utility", SpineEditorUtilities.Icons.skeletonUtility), GUILayout.Height(30))){ + component.gameObject.AddComponent(); + } + } + } } } diff --git a/spine-unity/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs b/spine-unity/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs index d77647e42..09618fa45 100644 --- a/spine-unity/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs +++ b/spine-unity/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs @@ -28,6 +28,11 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ +/***************************************************************************** + * Automatic import and advanced preview added by Mitch Thompson + * Full irrevocable rights and permissions granted to Esoteric Software +*****************************************************************************/ + using System; using System.Collections.Generic; using UnityEditor; @@ -53,18 +58,26 @@ public class SkeletonDataAssetInspector : Editor { private string m_skeletonDataAssetGUID; void OnEnable () { - atlasAsset = serializedObject.FindProperty("atlasAsset"); - skeletonJSON = serializedObject.FindProperty("skeletonJSON"); - scale = serializedObject.FindProperty("scale"); - fromAnimation = serializedObject.FindProperty("fromAnimation"); - toAnimation = serializedObject.FindProperty("toAnimation"); - duration = serializedObject.FindProperty("duration"); - defaultMix = serializedObject.FindProperty("defaultMix"); - - m_skeletonDataAsset = (SkeletonDataAsset)target; - m_skeletonDataAssetGUID = AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath(m_skeletonDataAsset) ); - - EditorApplication.update += Update; + try{ + + atlasAsset = serializedObject.FindProperty("atlasAsset"); + skeletonJSON = serializedObject.FindProperty("skeletonJSON"); + scale = serializedObject.FindProperty("scale"); + fromAnimation = serializedObject.FindProperty("fromAnimation"); + toAnimation = serializedObject.FindProperty("toAnimation"); + duration = serializedObject.FindProperty("duration"); + defaultMix = serializedObject.FindProperty("defaultMix"); + + m_skeletonDataAsset = (SkeletonDataAsset)target; + m_skeletonDataAssetGUID = AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath(m_skeletonDataAsset) ); + + EditorApplication.update += Update; + + } + catch{ + + + } } void OnDestroy(){ diff --git a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs index eec7fc04d..ef614a1e0 100644 --- a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs @@ -1,4 +1,38 @@ #pragma warning disable 0219 +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), you + * may not (a) modify, translate, adapt or otherwise create derivative works, + * improvements of the Software or develop new applications using the Software + * or (b) remove, delete, alter or obscure any trademarks or any copyright, + * trademark, patent or other intellectual property or proprietary rights + * notices on or in the Software, including any copy thereof. Redistributions + * in binary or source form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +/***************************************************************************** + * Spine Editor Utilities created by Mitch Thompson + * Full irrevocable rights and permissions granted to Esoteric Software +*****************************************************************************/ using UnityEngine; using UnityEditor; @@ -15,6 +49,7 @@ public class SpineEditorUtilities : AssetPostprocessor { public static Texture2D skeleton; public static Texture2D nullBone; public static Texture2D bone; + public static Texture2D poseBones; public static Texture2D boneNib; public static Texture2D slot; public static Texture2D skinPlaceholder; @@ -27,6 +62,11 @@ public class SpineEditorUtilities : AssetPostprocessor { public static Texture2D animationRoot; public static Texture2D spine; public static Texture2D _event; + public static Texture2D constraintNib; + public static Texture2D warning; + public static Texture2D skeletonUtility; + public static Texture2D hingeChain; + public static Texture2D subMeshRenderer; public static Mesh boneMesh{ get{ @@ -61,6 +101,7 @@ public class SpineEditorUtilities : AssetPostprocessor { skeleton = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-skeleton.png"); nullBone = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-null.png"); bone = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-bone.png"); + poseBones = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-poseBones.png"); boneNib = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-boneNib.png"); slot = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-slot.png"); skinPlaceholder = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-skinPlaceholder.png"); @@ -73,6 +114,12 @@ public class SpineEditorUtilities : AssetPostprocessor { animationRoot = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-animationRoot.png"); spine = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-spine.png"); _event = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-event.png"); + constraintNib = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-constraintNib.png"); + warning = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-warning.png"); + skeletonUtility = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-skeletonUtility.png"); + hingeChain = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-hingeChain.png"); + subMeshRenderer = (Texture2D)AssetDatabase.LoadMainAssetAtPath( SpineEditorUtilities.editorGUIPath + "/icon-subMeshRenderer.png"); + } } @@ -81,8 +128,9 @@ public class SpineEditorUtilities : AssetPostprocessor { public static string editorPath = ""; public static string editorGUIPath = ""; - - static List skeletonRendererInstanceIDs; + + static Dictionary skeletonRendererTable; + static Dictionary skeletonUtilityBoneTable; public static float defaultScale = 0.01f; public static float defaultMix = 0.2f; @@ -96,7 +144,8 @@ public class SpineEditorUtilities : AssetPostprocessor { Icons.Initialize(); - skeletonRendererInstanceIDs = new List(); + skeletonRendererTable = new Dictionary(); + skeletonUtilityBoneTable = new Dictionary(); EditorApplication.hierarchyWindowChanged += HierarchyWindowChanged; EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI; @@ -105,22 +154,49 @@ public class SpineEditorUtilities : AssetPostprocessor { } static void HierarchyWindowChanged(){ - skeletonRendererInstanceIDs.Clear(); + skeletonRendererTable.Clear(); + skeletonUtilityBoneTable.Clear(); SkeletonRenderer[] arr = Object.FindObjectsOfType(); foreach(SkeletonRenderer r in arr) - skeletonRendererInstanceIDs.Add(r.gameObject.GetInstanceID()); + skeletonRendererTable.Add( r.gameObject.GetInstanceID(), r.gameObject ); + + SkeletonUtilityBone[] boneArr = Object.FindObjectsOfType(); + foreach(SkeletonUtilityBone b in boneArr) + skeletonUtilityBoneTable.Add(b.gameObject.GetInstanceID(), b); } static void HierarchyWindowItemOnGUI(int instanceId, Rect selectionRect){ - if(skeletonRendererInstanceIDs.Contains(instanceId)){ + if(skeletonRendererTable.ContainsKey(instanceId)){ Rect r = new Rect (selectionRect); r.x = r.width - 15; r.width = 15; GUI.Label(r, Icons.spine); } + else if(skeletonUtilityBoneTable.ContainsKey(instanceId)){ + Rect r = new Rect (selectionRect); + //r.x = r.width - 15; + r.x -= 26; + + if(skeletonUtilityBoneTable[instanceId] != null){ + if( skeletonUtilityBoneTable[instanceId].transform.childCount == 0 ) + r.x += 15; + + + r.width = 15; + + if( skeletonUtilityBoneTable[instanceId].mode == SkeletonUtilityBone.Mode.Follow ){ + GUI.Label(r, Icons.bone); + } + else{ + GUI.Label(r, Icons.poseBones); + } + } + + } + } [MenuItem("Assets/Spine/Ingest")] @@ -335,20 +411,24 @@ public class SpineEditorUtilities : AssetPostprocessor { string primaryName = Path.GetFileNameWithoutExtension(spineJson.name); string assetPath = Path.GetDirectoryName( AssetDatabase.GetAssetPath(spineJson)); + string filePath = assetPath + "/" + primaryName + "_SkeletonData.asset"; if(spineJson != null && atlasAsset != null){ - SkeletonDataAsset skelDataAsset = SkeletonDataAsset.CreateInstance(); - skelDataAsset.atlasAsset = atlasAsset; - skelDataAsset.skeletonJSON = spineJson; - skelDataAsset.fromAnimation = new string[0]; - skelDataAsset.toAnimation = new string[0]; - skelDataAsset.duration = new float[0]; - skelDataAsset.defaultMix = defaultMix; - skelDataAsset.scale = defaultScale; - - AssetDatabase.CreateAsset(skelDataAsset, assetPath + "/" + primaryName + "_SkeletonData.asset"); - AssetDatabase.SaveAssets(); + SkeletonDataAsset skelDataAsset = (SkeletonDataAsset)AssetDatabase.LoadAssetAtPath(filePath, typeof(SkeletonDataAsset)); + if(skelDataAsset == null){ + skelDataAsset = SkeletonDataAsset.CreateInstance(); + skelDataAsset.atlasAsset = atlasAsset; + skelDataAsset.skeletonJSON = spineJson; + skelDataAsset.fromAnimation = new string[0]; + skelDataAsset.toAnimation = new string[0]; + skelDataAsset.duration = new float[0]; + skelDataAsset.defaultMix = defaultMix; + skelDataAsset.scale = defaultScale; + + AssetDatabase.CreateAsset(skelDataAsset, filePath); + AssetDatabase.SaveAssets(); + } return skelDataAsset; } diff --git a/spine-unity/Assets/spine-unity/Shaders/Bones.shader b/spine-unity/Assets/spine-unity/Shaders/Bones.shader new file mode 100644 index 000000000..61fc977e5 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Shaders/Bones.shader @@ -0,0 +1,69 @@ +Shader "Spine/Bones" { +Properties { + _Color ("Color", Color) = (0.5,0.5,0.5,0.5) + _MainTex ("Particle Texture", 2D) = "white" {} +} + +Category { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend SrcAlpha OneMinusSrcAlpha + AlphaTest Greater .01 + ColorMask RGB + + Lighting Off Cull Off ZTest Always ZWrite Off Fog { Mode Off } + + SubShader { + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_particles + + #include "UnityCG.cginc" + + sampler2D _MainTex; + fixed4 _Color; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + #ifdef SOFTPARTICLES_ON + float4 projPos : TEXCOORD1; + #endif + }; + + float4 _MainTex_ST; + + v2f vert (appdata_t v) + { + v2f o; + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + #ifdef SOFTPARTICLES_ON + o.projPos = ComputeScreenPos (o.vertex); + COMPUTE_EYEDEPTH(o.projPos.z); + #endif + o.color = v.color; + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + return o; + } + + sampler2D_float _CameraDepthTexture; + + + fixed4 frag (v2f i) : SV_Target + { + return 2.0f * i.color * _Color * tex2D(_MainTex, i.texcoord); + } + ENDCG + } + } +} +} diff --git a/spine-unity/Assets/spine-unity/Shaders/Bones.shader.meta b/spine-unity/Assets/spine-unity/Shaders/Bones.shader.meta new file mode 100644 index 000000000..d01814ef9 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Shaders/Bones.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 66988de88a15abd4e8846c6805485f57 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/spine-unity/Assets/spine-unity/Shaders/HiddenPass.mat b/spine-unity/Assets/spine-unity/Shaders/HiddenPass.mat new file mode 100644 index 0000000000000000000000000000000000000000..31cf39d9972a7839972b6b5bf7d5263c728f8252 GIT binary patch literal 4288 zcmeHK+j87Q5FHZ&xj-P?!zEcD+`&NX0D;8u1#fUsAxoTu$E~q7@`~D(T%%dz!xv;41U<%ineF5z>14T6qyDX}AI-M= zCQD3rsCP>BC_&&5f~VJeJ!h}3Cz&hk`o1&dq{x?Oe9xLxZ}qe_xf5R;w^UCb%8 zC15ujnvJhH4yV<`kw^mSX*Z}rNC+ay2#AxB$cH&> z|M3W@bT-R(X!hUfkuZ&z5YDoa=Zdv@qU4U%pv7w_om*B7CuR1tVLna~03uTreS4s- zO0?75ds;fD5KPAAKqtn64AGc`CjvCoC<#vnAYnH`!kGwYkLsqdO~h}_nZ z092~OyCoeK+Npg$JKk>D(G>fH?e9eFL7-b{T2evc7<;#c#N@(A@3rh`hLPTn*rj~C z$XBZOgAi27TDNQ9L&AVKCXXr9+h>Q@=F7)Z@oktf*=;9&O`>~)KIEJ;W_mc>w zo%yGANQ{qG@1?+r&wjdk7a|B@xvpEh7Z(Fit=1>SS}`oFP<=TBRl-F(;m-)e$pTB5 zBUFD51Bp)-`ZU#Fpo@eN)qfroR~UQ<$FMflUq&$P%)cUx&pb-?)xe3*ewylQ5d`yh z`^M^uKPK?DS_*(lb$DONnpoDa2lhF#L&Uzr_GRwz`F6M^_AR!r{HtBFeKlf77pB!Y z-GQp^(}lMcF7&H&Yd;+S?ZTBCzbu{{{QB3Qf8cDJ$&7&+12YC@4E$diz^@|xv?nI- z>9VYk`lSt?4nEs)^y6c$e^X~UeY&!NZxy|zaEahWk3Zc0+SnCos(yd);2MwH$oIPR hO9?D6_*L%nOOX^F@BLKQkxTy$ecCp51^@n1{{ZTN@%aD% literal 0 HcmV?d00001 diff --git a/spine-unity/Assets/spine-unity/Shaders/HiddenPass.mat.meta b/spine-unity/Assets/spine-unity/Shaders/HiddenPass.mat.meta new file mode 100644 index 000000000..ef267ef07 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Shaders/HiddenPass.mat.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 43227e5adadc6f24bb4bf74b92a56fb4 +NativeFormatImporter: + userData: diff --git a/spine-unity/Assets/spine-unity/Shaders/HiddenPass.shader b/spine-unity/Assets/spine-unity/Shaders/HiddenPass.shader new file mode 100644 index 000000000..3a0de6756 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Shaders/HiddenPass.shader @@ -0,0 +1,21 @@ +Shader "Spine/HiddenPass" { + SubShader + + { + + Tags {"Queue" = "Geometry-1" } + + Lighting Off + + Pass + + { + + ZWrite Off + + ColorMask 0 + + } + + } +} diff --git a/spine-unity/Assets/spine-unity/Shaders/HiddenPass.shader.meta b/spine-unity/Assets/spine-unity/Shaders/HiddenPass.shader.meta new file mode 100644 index 000000000..bcc031d30 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Shaders/HiddenPass.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 913475501bf19374c84390868a9d6d3d +ShaderImporter: + defaultTextures: [] + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonAnimation.cs b/spine-unity/Assets/spine-unity/SkeletonAnimation.cs index 8810a5383..b2b367167 100644 --- a/spine-unity/Assets/spine-unity/SkeletonAnimation.cs +++ b/spine-unity/Assets/spine-unity/SkeletonAnimation.cs @@ -42,7 +42,9 @@ public class SkeletonAnimation : SkeletonRenderer { public Spine.AnimationState state; public delegate void UpdateBonesDelegate(SkeletonAnimation skeleton); - public UpdateBonesDelegate UpdateBones; + public UpdateBonesDelegate UpdateLocal; + public UpdateBonesDelegate UpdateWorld; + public UpdateBonesDelegate UpdateComplete; [SerializeField] private String _animationName; @@ -83,7 +85,19 @@ public class SkeletonAnimation : SkeletonRenderer { skeleton.Update(deltaTime); state.Update(deltaTime); state.Apply(skeleton); - if (UpdateBones != null) UpdateBones(this); + + if (UpdateLocal != null) + UpdateLocal(this); + skeleton.UpdateWorldTransform(); + + if (UpdateWorld != null){ + UpdateWorld(this); + skeleton.UpdateWorldTransform(); + } + + if (UpdateComplete != null){ + UpdateComplete(this); + } } } diff --git a/spine-unity/Assets/spine-unity/SkeletonExtensions.cs b/spine-unity/Assets/spine-unity/SkeletonExtensions.cs index ca8e263df..06b414658 100644 --- a/spine-unity/Assets/spine-unity/SkeletonExtensions.cs +++ b/spine-unity/Assets/spine-unity/SkeletonExtensions.cs @@ -1,4 +1,39 @@ -using UnityEngine; +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), you + * may not (a) modify, translate, adapt or otherwise create derivative works, + * improvements of the Software or develop new applications using the Software + * or (b) remove, delete, alter or obscure any trademarks or any copyright, + * trademark, patent or other intellectual property or proprietary rights + * notices on or in the Software, including any copy thereof. Redistributions + * in binary or source form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +/***************************************************************************** + * Spine Extensions created by Mitch Thompson + * Full irrevocable rights and permissions granted to Esoteric Software +*****************************************************************************/ + +using UnityEngine; using System.Collections; using Spine; diff --git a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs index 56d475131..a09838247 100644 --- a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs +++ b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs @@ -37,6 +37,10 @@ using Spine; /// Renders a skeleton. [ExecuteInEditMode, RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class SkeletonRenderer : MonoBehaviour { + + public delegate void SkeletonRendererDelegate(SkeletonRenderer skeletonRenderer); + public SkeletonRendererDelegate OnReset; + [System.NonSerialized] public bool valid; [System.NonSerialized] @@ -96,6 +100,7 @@ public class SkeletonRenderer : MonoBehaviour { skeleton = new Skeleton(skeletonData); if (initialSkinName != null && initialSkinName.Length > 0 && initialSkinName != "default") skeleton.SetSkin(initialSkinName); + if(OnReset != null) OnReset(this); } public void Awake () { @@ -112,7 +117,6 @@ public class SkeletonRenderer : MonoBehaviour { public virtual void LateUpdate () { if (!valid) return; - // Count vertices and submesh triangles. int vertexCount = 0; int submeshTriangleCount = 0, submeshFirstVertex = 0, submeshStartSlotIndex = 0; @@ -122,7 +126,8 @@ public class SkeletonRenderer : MonoBehaviour { int drawOrderCount = drawOrder.Count; bool renderMeshes = this.renderMeshes; for (int i = 0; i < drawOrderCount; i++) { - Attachment attachment = drawOrder[i].attachment; + Slot slot = drawOrder[i]; + Attachment attachment = slot.attachment; object rendererObject; int attachmentVertexCount, attachmentTriangleCount; @@ -149,7 +154,7 @@ public class SkeletonRenderer : MonoBehaviour { // Populate submesh when material changes. Material material = (Material)((AtlasRegion)rendererObject).page.rendererObject; - if (lastMaterial != material && lastMaterial != null) { + if ((lastMaterial != material && lastMaterial != null) || slot.Data.name[0] == '*') { AddSubmesh(lastMaterial, submeshStartSlotIndex, i, submeshTriangleCount, submeshFirstVertex, false); submeshTriangleCount = 0; submeshFirstVertex = vertexCount; diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility.meta b/spine-unity/Assets/spine-unity/SkeletonUtility.meta new file mode 100644 index 000000000..d690c94de --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: f6e0caaafe294de48af468a6a9321473 +folderAsset: yes +DefaultImporter: + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor.meta new file mode 100644 index 000000000..386e1e90b --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: a751a9d1e3e26d64d997b66a781df8e9 +folderAsset: yes +DefaultImporter: + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs new file mode 100644 index 000000000..1a6b80054 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs @@ -0,0 +1,287 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), you + * may not (a) modify, translate, adapt or otherwise create derivative works, + * improvements of the Software or develop new applications using the Software + * or (b) remove, delete, alter or obscure any trademarks or any copyright, + * trademark, patent or other intellectual property or proprietary rights + * notices on or in the Software, including any copy thereof. Redistributions + * in binary or source form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +/***************************************************************************** + * Skeleton Utility created by Mitch Thompson + * Full irrevocable rights and permissions granted to Esoteric Software +*****************************************************************************/ + +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; +using Spine; + +[CustomEditor(typeof(SkeletonUtilityBone)), CanEditMultipleObjects] +public class SkeletonUtilityBoneInspector : Editor { + SerializedProperty mode, boneName, zPosition, position, rotation, scale, overrideAlpha, parentReference; + + //multi selected flags + bool containsFollows, containsOverrides, multiObject; + + //single selected helpers + SkeletonUtilityBone utilityBone; + SkeletonUtility skeletonUtility; + bool canCreateHingeChain = false; + + void OnEnable(){ + mode = this.serializedObject.FindProperty("mode"); + boneName = this.serializedObject.FindProperty("boneName"); + zPosition = this.serializedObject.FindProperty("zPosition"); + position = this.serializedObject.FindProperty("position"); + rotation = this.serializedObject.FindProperty("rotation"); + scale = this.serializedObject.FindProperty("scale"); + overrideAlpha = this.serializedObject.FindProperty("overrideAlpha"); + parentReference = this.serializedObject.FindProperty("parentReference"); + + EvaluateFlags(); + + if(utilityBone.valid == false && skeletonUtility != null && skeletonUtility.skeletonRenderer != null){ + skeletonUtility.skeletonRenderer.Reset(); + } + + canCreateHingeChain = CanCreateHingeChain(); + } + + /// + /// Evaluates the flags. + /// + void EvaluateFlags(){ + utilityBone = (SkeletonUtilityBone)target; + skeletonUtility = utilityBone.skeletonUtility; + + if(Selection.objects.Length == 1){ + containsFollows = utilityBone.mode == SkeletonUtilityBone.Mode.Follow; + containsOverrides = utilityBone.mode == SkeletonUtilityBone.Mode.Override; + } + else{ + int boneCount = 0; + foreach(Object o in Selection.objects){ + if(o is GameObject){ + GameObject go = (GameObject)o; + SkeletonUtilityBone sub = go.GetComponent(); + if(sub != null){ + boneCount++; + if(sub.mode == SkeletonUtilityBone.Mode.Follow) + containsFollows = true; + if(sub.mode == SkeletonUtilityBone.Mode.Override) + containsOverrides = true; + } + } + } + + if(boneCount > 1) + multiObject = true; + } + } + + public override void OnInspectorGUI () + { + serializedObject.Update(); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(mode); + if(EditorGUI.EndChangeCheck()){ + containsOverrides = mode.enumValueIndex == 1; + containsFollows = mode.enumValueIndex == 0; + } + + EditorGUI.BeginDisabledGroup( multiObject ); + { + string str = boneName.stringValue; + if(str == "") str = ""; + if(multiObject) str = ""; + + GUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel("Bone"); + + if(GUILayout.Button( str, EditorStyles.popup )){ + BoneSelectorContextMenu( str, ((SkeletonUtilityBone)target).skeletonUtility.skeletonRenderer.skeleton.Bones, "", TargetBoneSelected ); + } + + GUILayout.EndHorizontal(); + } + EditorGUI.EndDisabledGroup(); + + EditorGUILayout.PropertyField(zPosition); + EditorGUILayout.PropertyField(position); + EditorGUILayout.PropertyField(rotation); + EditorGUILayout.PropertyField(scale); + + EditorGUI.BeginDisabledGroup( containsFollows ); + { + EditorGUILayout.PropertyField(overrideAlpha); + EditorGUILayout.PropertyField(parentReference); + } + EditorGUI.EndDisabledGroup(); + + EditorGUILayout.Space(); + + GUILayout.BeginHorizontal(); + { + EditorGUI.BeginDisabledGroup( multiObject || !utilityBone.valid || utilityBone.bone == null || utilityBone.bone.Children.Count == 0); + { + if(GUILayout.Button(new GUIContent("Add Child", SpineEditorUtilities.Icons.bone), GUILayout.Width(150), GUILayout.Height(24))) + BoneSelectorContextMenu( "", utilityBone.bone.Children, "", SpawnChildBoneSelected); + } + EditorGUI.EndDisabledGroup(); + + EditorGUI.BeginDisabledGroup( multiObject || !utilityBone.valid || utilityBone.bone == null || containsOverrides); + { + if(GUILayout.Button(new GUIContent("Add Override", SpineEditorUtilities.Icons.poseBones), GUILayout.Width(150), GUILayout.Height(24))) + SpawnOverride(); + } + EditorGUI.EndDisabledGroup(); + + EditorGUI.BeginDisabledGroup( multiObject || !utilityBone.valid || !canCreateHingeChain ); + { + if(GUILayout.Button(new GUIContent("Create Hinge Chain", SpineEditorUtilities.Icons.hingeChain), GUILayout.Width(150), GUILayout.Height(24))) + CreateHingeChain(); + } + EditorGUI.EndDisabledGroup(); + + } + GUILayout.EndHorizontal(); + + serializedObject.ApplyModifiedProperties(); + } + + void BoneSelectorContextMenu(string current, List bones, string topValue, GenericMenu.MenuFunction2 callback){ + GenericMenu menu = new GenericMenu(); + + if(topValue != "") + menu.AddItem( new GUIContent(topValue), current == topValue, callback, null ); + + for(int i = 0; i < bones.Count; i++){ + menu.AddItem( new GUIContent(bones[i].Data.Name), bones[i].Data.Name == current, callback, bones[i] ); + } + + menu.ShowAsContext(); + + } + + + void TargetBoneSelected(object obj){ + if(obj == null){ + boneName.stringValue = ""; + serializedObject.ApplyModifiedProperties(); + } + else{ + Bone bone = (Bone)obj; + boneName.stringValue = bone.Data.Name; + serializedObject.ApplyModifiedProperties(); + + utilityBone.Reset(); + } + } + + void SpawnChildBoneSelected(object obj){ + if(obj == null){ + //add recursively + foreach(var bone in utilityBone.bone.Children){ + GameObject go = skeletonUtility.SpawnBoneRecursively( bone, utilityBone.transform, utilityBone.mode, utilityBone.position, utilityBone.rotation, utilityBone.scale ); + SkeletonUtilityBone[] newUtilityBones = go.GetComponentsInChildren(); + foreach(SkeletonUtilityBone utilBone in newUtilityBones) + SkeletonUtilityInspector.AttachIcon(utilBone); + } + } + else{ + Bone bone = (Bone)obj; + GameObject go = skeletonUtility.SpawnBone( bone, utilityBone.transform, utilityBone.mode, utilityBone.position, utilityBone.rotation, utilityBone.scale ); + SkeletonUtilityInspector.AttachIcon(go.GetComponent()); + Selection.activeGameObject = go; + EditorGUIUtility.PingObject(go); + } + } + + void SpawnOverride(){ + GameObject go = skeletonUtility.SpawnBone( utilityBone.bone, utilityBone.transform.parent, SkeletonUtilityBone.Mode.Override, utilityBone.position, utilityBone.rotation, utilityBone.scale); + go.name = go.name + " [Override]"; + SkeletonUtilityInspector.AttachIcon(go.GetComponent()); + Selection.activeGameObject = go; + EditorGUIUtility.PingObject(go); + } + + bool CanCreateHingeChain(){ + if(utilityBone == null) return false; + if(utilityBone.rigidbody != null) return false; + if(utilityBone.bone != null && utilityBone.bone.Children.Count == 0) return false; + + Rigidbody[] rigidbodies = utilityBone.GetComponentsInChildren(); + + if(rigidbodies.Length > 0) return false; + + return true; + } + + void CreateHingeChain(){ + var utilBoneArr = utilityBone.GetComponentsInChildren(); + + foreach(var utilBone in utilBoneArr){ + AttachRigidbody(utilBone); + } + + utilityBone.rigidbody.isKinematic = true; + + foreach(var utilBone in utilBoneArr){ + if(utilBone == utilityBone) + continue; + + utilBone.mode = SkeletonUtilityBone.Mode.Override; + + HingeJoint joint = utilBone.gameObject.AddComponent(); + joint.axis = Vector3.forward; + joint.connectedBody = utilBone.transform.parent.rigidbody; + joint.useLimits = true; + JointLimits limits = new JointLimits(); + limits.min = -20; + limits.max = 20; + joint.limits = limits; + utilBone.rigidbody.mass = utilBone.transform.parent.rigidbody.mass * 0.75f; + } + } + + void AttachRigidbody(SkeletonUtilityBone utilBone){ + if(utilBone.GetComponent() == null){ + if(utilBone.bone.Data.Length == 0){ + SphereCollider sphere = utilBone.gameObject.AddComponent(); + sphere.radius = 0.1f; + } + else{ + float length = utilBone.bone.Data.Length; + BoxCollider box = utilBone.gameObject.AddComponent(); + box.size = new Vector3( length, length / 3, 0.2f); + box.center = new Vector3(length / 2, 0, 0); + } + } + + utilBone.gameObject.AddComponent(); + } +} diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta new file mode 100644 index 000000000..340d6e2eb --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b3ae20b4bcc31f645afd6f5b64f82473 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs new file mode 100644 index 000000000..7358c7635 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs @@ -0,0 +1,316 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), you + * may not (a) modify, translate, adapt or otherwise create derivative works, + * improvements of the Software or develop new applications using the Software + * or (b) remove, delete, alter or obscure any trademarks or any copyright, + * trademark, patent or other intellectual property or proprietary rights + * notices on or in the Software, including any copy thereof. Redistributions + * in binary or source form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +/***************************************************************************** + * Skeleton Utility created by Mitch Thompson + * Full irrevocable rights and permissions granted to Esoteric Software +*****************************************************************************/ + +using UnityEngine; +using UnityEditor; +#if UNITY_4_3 +//nothing +#else +using UnityEditor.AnimatedValues; +#endif +using System.Collections; +using System.Collections.Generic; +using Spine; + +using System.Reflection; + +[CustomEditor(typeof(SkeletonUtility))] +public class SkeletonUtilityInspector : Editor { + + public static void AttachIcon(SkeletonUtilityBone utilityBone){ + Skeleton skeleton = utilityBone.skeletonUtility.skeletonRenderer.skeleton; + Texture2D icon; + if(utilityBone.bone.Data.Length == 0) + icon = SpineEditorUtilities.Icons.nullBone; + else + icon = SpineEditorUtilities.Icons.boneNib; + + foreach(IkConstraint c in skeleton.IkConstraints){ + if(c.Target == utilityBone.bone){ + icon = SpineEditorUtilities.Icons.constraintNib; + break; + } + } + + + + typeof(EditorGUIUtility).InvokeMember("SetIconForObject", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic, null, null, new object[2]{ utilityBone.gameObject, icon}); + } + + static void AttachIconsToChildren(Transform root){ + if(root != null){ + var utilityBones = root.GetComponentsInChildren(); + foreach(var utilBone in utilityBones){ + AttachIcon(utilBone); + } + } + } + + + + static SkeletonUtilityInspector(){ + #if UNITY_4_3 + showSlots = false; + #else + showSlots = new AnimBool(false); + #endif + } + + SkeletonUtility skeletonUtility; + + Skeleton skeleton; + SkeletonRenderer skeletonRenderer; + Transform transform; + bool isPrefab; + + + Dictionary> attachmentTable = new Dictionary>(); + + + //GUI stuff +#if UNITY_4_3 + static bool showSlots; +#else + static AnimBool showSlots; +#endif + + void OnEnable(){ + skeletonUtility = (SkeletonUtility)target; + skeletonRenderer = skeletonUtility.GetComponent(); + skeleton = skeletonRenderer.skeleton; + transform = skeletonRenderer.transform; + + if(skeleton == null){ + skeletonRenderer.Reset(); + skeletonRenderer.LateUpdate(); + + skeleton = skeletonRenderer.skeleton; + } + + UpdateAttachments(); + + if(PrefabUtility.GetPrefabType(this.target) == PrefabType.Prefab) + isPrefab = true; + + } + + void OnDestroy(){ + + } + + void OnSceneGUI(){ + if(skeleton == null){ + OnEnable(); + return; + } + + float flipRotation = skeleton.FlipX ? -1 : 1; + + foreach(Bone b in skeleton.Bones){ + Vector3 vec = transform.TransformPoint(new Vector3(b.WorldX, b.WorldY, 0)); + + Quaternion rot = Quaternion.Euler(0,0,b.WorldRotation * flipRotation); + Vector3 forward = transform.TransformDirection( rot * Vector3.right); + forward *= flipRotation; + + SpineEditorUtilities.Icons.boneMaterial.SetPass(0); + Graphics.DrawMeshNow( SpineEditorUtilities.Icons.boneMesh, Matrix4x4.TRS ( vec, Quaternion.LookRotation(transform.forward, forward), Vector3.one * b.Data.Length * b.WorldScaleX)); + } + } + + void UpdateAttachments(){ + attachmentTable = new Dictionary>(); + Skin skin = skeleton.Skin; + + if(skin == null){ + skin = skeletonRenderer.skeletonDataAsset.GetSkeletonData(true).DefaultSkin; + } + + for(int i = skeleton.Slots.Count-1; i >= 0; i--){ + List attachments = new List(); + skin.FindAttachmentsForSlot(i, attachments); + + attachmentTable.Add(skeleton.Slots[i], attachments); + } + } + + void SpawnHierarchyButton(string label, string tooltip, SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca, params GUILayoutOption[] options){ + GUIContent content = new GUIContent(label, tooltip); + if(GUILayout.Button(content, options)){ + if(skeletonUtility.skeletonRenderer == null) + skeletonUtility.skeletonRenderer = skeletonUtility.GetComponent(); + + if(skeletonUtility.boneRoot != null){ + return; + } + + skeletonUtility.SpawnHierarchy(mode, pos, rot, sca); + + SkeletonUtilityBone[] boneComps = skeletonUtility.GetComponentsInChildren(); + foreach(SkeletonUtilityBone b in boneComps) + AttachIcon(b); + } + } + + public override void OnInspectorGUI () + { + if(isPrefab){ + GUILayout.Label(new GUIContent("Cannot edit Prefabs", SpineEditorUtilities.Icons.warning)); + return; + } + + skeletonUtility.boneRoot = (Transform)EditorGUILayout.ObjectField( "Bone Root", skeletonUtility.boneRoot, typeof(Transform), true); + + GUILayout.BeginHorizontal(); + EditorGUI.BeginDisabledGroup(skeletonUtility.boneRoot != null); + { + if(GUILayout.Button(new GUIContent("Spawn Hierarchy", SpineEditorUtilities.Icons.skeleton), GUILayout.Width(150), GUILayout.Height(24))) + SpawnHierarchyContextMenu(); + } + EditorGUI.EndDisabledGroup(); + + if(GUILayout.Button(new GUIContent("Spawn Submeshes", SpineEditorUtilities.Icons.subMeshRenderer), GUILayout.Width(150), GUILayout.Height(24))) + skeletonUtility.SpawnSubRenderers(true); + GUILayout.EndHorizontal(); + + EditorGUI.BeginChangeCheck(); + skeleton.FlipX = EditorGUILayout.ToggleLeft("Flip X", skeleton.FlipX); + skeleton.FlipY = EditorGUILayout.ToggleLeft("Flip Y", skeleton.FlipY); + if(EditorGUI.EndChangeCheck()){ + skeletonRenderer.LateUpdate(); + SceneView.RepaintAll(); + } + +#if UNITY_4_3 + showSlots = EditorGUILayout.Foldout(showSlots, "Slots"); +#else + showSlots.target = EditorGUILayout.Foldout(showSlots.target, "Slots"); + if(EditorGUILayout.BeginFadeGroup(showSlots.faded)){ +#endif + foreach(KeyValuePair> pair in attachmentTable){ + + Slot slot = pair.Key; + + EditorGUILayout.BeginHorizontal(); + EditorGUI.indentLevel = 1; + EditorGUILayout.LabelField(new GUIContent(slot.Data.Name, SpineEditorUtilities.Icons.slot), GUILayout.ExpandWidth(false)); + + EditorGUI.BeginChangeCheck(); + Color c = EditorGUILayout.ColorField(new Color(slot.R, slot.G, slot.B, slot.A), GUILayout.Width(60)); + + if(EditorGUI.EndChangeCheck()){ + slot.SetColor( c ); + skeletonRenderer.LateUpdate(); + } + + EditorGUILayout.EndHorizontal(); + + + + foreach(Attachment attachment in pair.Value){ + + if(slot.Attachment == attachment){ + GUI.contentColor = Color.white; + } + else{ + GUI.contentColor = Color.grey; + } + + EditorGUI.indentLevel = 2; + bool isAttached = attachment == slot.Attachment; + + Texture2D icon = null; + + if(attachment is MeshAttachment || attachment is SkinnedMeshAttachment) + icon = SpineEditorUtilities.Icons.mesh; + else + icon = SpineEditorUtilities.Icons.image; + + bool swap = EditorGUILayout.ToggleLeft( new GUIContent( attachment.Name, icon ), attachment == slot.Attachment ); + + if(!isAttached && swap){ + slot.Attachment = attachment; + skeletonRenderer.LateUpdate(); + } + else if(isAttached && !swap){ + slot.Attachment = null; + skeletonRenderer.LateUpdate(); + } + + GUI.contentColor = Color.white; + } + } + #if UNITY_4_3 + +#else + } + EditorGUILayout.EndFadeGroup(); + if(showSlots.isAnimating) + Repaint(); +#endif + } + + void SpawnHierarchyContextMenu(){ + GenericMenu menu = new GenericMenu(); + + menu.AddItem(new GUIContent("Follow"), false, SpawnFollowHierarchy); + menu.AddItem(new GUIContent("Follow (Root Only)"), false, SpawnFollowHierarchyRootOnly); + menu.AddSeparator(""); + menu.AddItem(new GUIContent("Override"), false, SpawnOverrideHierarchy); + menu.AddItem(new GUIContent("Override (Root Only)"), false, SpawnOverrideHierarchyRootOnly); + + menu.ShowAsContext(); + } + + void SpawnFollowHierarchy(){ + Selection.activeGameObject = skeletonUtility.SpawnHierarchy( SkeletonUtilityBone.Mode.Follow, true, true, true ); + AttachIconsToChildren( skeletonUtility.boneRoot ); + } + + void SpawnFollowHierarchyRootOnly(){ + Selection.activeGameObject = skeletonUtility.SpawnRoot( SkeletonUtilityBone.Mode.Follow, true, true, true ); + AttachIconsToChildren( skeletonUtility.boneRoot ); + } + + void SpawnOverrideHierarchy(){ + Selection.activeGameObject = skeletonUtility.SpawnHierarchy( SkeletonUtilityBone.Mode.Override, true, true, true ); + AttachIconsToChildren( skeletonUtility.boneRoot ); + } + + void SpawnOverrideHierarchyRootOnly(){ + Selection.activeGameObject = skeletonUtility.SpawnRoot( SkeletonUtilityBone.Mode.Override, true, true, true ); + AttachIconsToChildren( skeletonUtility.boneRoot ); + } +} diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta new file mode 100644 index 000000000..7820cbd6d --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5b90df955eb8c2429ac67c8b2de6c5c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs new file mode 100644 index 000000000..1813512a7 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs @@ -0,0 +1,335 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), you + * may not (a) modify, translate, adapt or otherwise create derivative works, + * improvements of the Software or develop new applications using the Software + * or (b) remove, delete, alter or obscure any trademarks or any copyright, + * trademark, patent or other intellectual property or proprietary rights + * notices on or in the Software, including any copy thereof. Redistributions + * in binary or source form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +/***************************************************************************** + * Skeleton Utility created by Mitch Thompson + * Full irrevocable rights and permissions granted to Esoteric Software +*****************************************************************************/ + +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using Spine; + +[RequireComponent(typeof(SkeletonAnimation))] +[ExecuteInEditMode] +public class SkeletonUtility : MonoBehaviour { + public delegate void SkeletonUtilityDelegate(); + public event SkeletonUtilityDelegate OnReset; + + public Transform boneRoot; + + void Update(){ + if(boneRoot != null && skeletonRenderer.skeleton != null){ + Vector3 flipScale = Vector3.one; + if(skeletonRenderer.skeleton.FlipX) + flipScale.x = -1; + + if(skeletonRenderer.skeleton.FlipY) + flipScale.y = -1; + + boneRoot.localScale = flipScale; + } + } + + [HideInInspector] + public SkeletonRenderer skeletonRenderer; + + [HideInInspector] + public SkeletonAnimation skeletonAnimation; + + [System.NonSerialized] + public List utilityBones = new List(); + + [System.NonSerialized] + public List utilityConstraints = new List(); +// Dictionary utilityBoneTable; + + + protected bool hasTransformBones; + protected bool hasUtilityConstraints; + protected bool needToReprocessBones; + + void OnEnable(){ + if(skeletonRenderer == null){ + skeletonRenderer = GetComponent(); + } + + if(skeletonAnimation == null){ + skeletonAnimation = GetComponent(); + } + + skeletonRenderer.OnReset -= HandleRendererReset; + skeletonRenderer.OnReset += HandleRendererReset; + + if(skeletonAnimation != null){ + skeletonAnimation.UpdateLocal -= UpdateLocal; + skeletonAnimation.UpdateLocal += UpdateLocal; + } + + + CollectBones(); + } + + void Start(){ + //recollect because order of operations failure when switching between game mode and edit mode... +// CollectBones(); + } + + + + void OnDisable(){ + skeletonRenderer.OnReset -= HandleRendererReset; + + if(skeletonAnimation != null){ + skeletonAnimation.UpdateLocal -= UpdateLocal; + skeletonAnimation.UpdateWorld -= UpdateWorld; + skeletonAnimation.UpdateComplete -= UpdateComplete; + } + } + + void HandleRendererReset(SkeletonRenderer r){ + if(OnReset != null) + OnReset(); + + CollectBones(); + } + + public void RegisterBone(SkeletonUtilityBone bone){ + if(utilityBones.Contains(bone)) + return; + else{ + utilityBones.Add(bone); + needToReprocessBones = true; + } + } + + public void UnregisterBone(SkeletonUtilityBone bone){ + utilityBones.Remove(bone); + } + + public void RegisterConstraint(SkeletonUtilityConstraint constraint){ + + if(utilityConstraints.Contains(constraint)) + return; + else{ + utilityConstraints.Add(constraint); + needToReprocessBones = true; + } + } + + public void UnregisterConstraint(SkeletonUtilityConstraint constraint){ + utilityConstraints.Remove(constraint); + } + + public void CollectBones(){ + if(skeletonRenderer.skeleton == null) + return; + + if(boneRoot != null){ + List constraintTargetNames = new List(); + + foreach(IkConstraint c in skeletonRenderer.skeleton.IkConstraints){ + constraintTargetNames.Add(c.Target.Data.Name); + } + + foreach(var b in utilityBones){ + if(b.bone == null){ + return; + } + if(b.mode == SkeletonUtilityBone.Mode.Override){ + hasTransformBones = true; + } + + if(constraintTargetNames.Contains( b.bone.Data.Name )){ + hasUtilityConstraints = true; + } + } + + if(utilityConstraints.Count > 0) + hasUtilityConstraints = true; + + if(skeletonAnimation != null){ + skeletonAnimation.UpdateWorld -= UpdateWorld; + skeletonAnimation.UpdateComplete -= UpdateComplete; + + if(hasTransformBones || hasUtilityConstraints){ + skeletonAnimation.UpdateWorld += UpdateWorld; + } + + if(hasUtilityConstraints){ + skeletonAnimation.UpdateComplete += UpdateComplete; + } + } + + needToReprocessBones = false; + } + else{ + utilityBones.Clear(); + utilityConstraints.Clear(); + } + + } + + void UpdateLocal(SkeletonAnimation anim){ + + if(needToReprocessBones) + CollectBones(); + + if(utilityBones == null) + return; + + foreach(SkeletonUtilityBone b in utilityBones){ + b.transformLerpComplete = false; + } + + UpdateAllBones(); + } + + void UpdateWorld(SkeletonAnimation anim){ + UpdateAllBones(); + + foreach(SkeletonUtilityConstraint c in utilityConstraints) + c.DoUpdate(); + } + + void UpdateComplete(SkeletonAnimation anim){ + UpdateAllBones(); + } + + void UpdateAllBones(){ + if(boneRoot == null){ + CollectBones(); + } + + if(utilityBones == null) + return; + + foreach(SkeletonUtilityBone b in utilityBones){ + b.DoUpdate(); + } + } + + public Transform GetBoneRoot(){ + if(boneRoot != null) + return boneRoot; + + boneRoot = new GameObject("SkeletonUtility-Root").transform; + boneRoot.parent = transform; + boneRoot.localPosition = Vector3.zero; + boneRoot.localRotation = Quaternion.identity; + boneRoot.localScale = Vector3.one; + + return boneRoot; + } + + public GameObject SpawnRoot(SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca){ + GetBoneRoot(); + Skeleton skeleton = this.skeletonRenderer.skeleton; + + GameObject go = SpawnBone( skeleton.RootBone, boneRoot, mode, pos, rot, sca ); + + CollectBones(); + + return go; + } + + public GameObject SpawnHierarchy(SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca){ + GetBoneRoot(); + + Skeleton skeleton = this.skeletonRenderer.skeleton; + + GameObject go = SpawnBoneRecursively(skeleton.RootBone, boneRoot, mode, pos, rot, sca); + + CollectBones(); + + return go; + } + + public GameObject SpawnBoneRecursively(Bone bone, Transform parent, SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca){ + GameObject go = SpawnBone(bone, parent, mode, pos, rot, sca); + + foreach(Bone child in bone.Children){ + SpawnBoneRecursively(child, go.transform, mode, pos, rot, sca); + } + + return go; + } + + public GameObject SpawnBone(Bone bone, Transform parent, SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca){ + GameObject go = new GameObject(bone.Data.Name); + go.transform.parent = parent; + + SkeletonUtilityBone b = go.AddComponent(); + b.skeletonUtility = this; + b.position = pos; + b.rotation = rot; + b.scale = sca; + b.mode = mode; + b.zPosition = true; + b.Reset(); + b.bone = bone; + b.boneName = bone.Data.Name; + b.valid = true; + + if(mode == SkeletonUtilityBone.Mode.Override){ + if(rot) + go.transform.localRotation = Quaternion.Euler(0, 0, b.bone.RotationIK); + + if(pos) + go.transform.localPosition = new Vector3(b.bone.X, b.bone.Y, 0); + + go.transform.localScale = new Vector3(b.bone.scaleX, b.bone.scaleY, 0); + } + + return go; + } + + public void SpawnSubRenderers(bool disablePrimaryRenderer){ + int submeshCount = GetComponent().sharedMesh.subMeshCount; + + for(int i = 0; i < submeshCount; i++){ + GameObject go = new GameObject("Submesh " + i, typeof(MeshFilter), typeof(MeshRenderer)); + go.transform.parent = transform; + go.transform.localPosition = Vector3.zero; + go.transform.localRotation = Quaternion.identity; + go.transform.localScale = Vector3.one; + + SkeletonUtilitySubmeshRenderer s = go.AddComponent(); + s.sortingOrder = i * 10; + s.submeshIndex = i; + s.Initialize( renderer ); + s.Update(); + } + + if(disablePrimaryRenderer) + renderer.enabled = false; + } +} diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs.meta new file mode 100644 index 000000000..7d3d7a44f --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f726fb798ad621458c431cb9966d91d +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs new file mode 100644 index 000000000..51dee1cc6 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs @@ -0,0 +1,218 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), you + * may not (a) modify, translate, adapt or otherwise create derivative works, + * improvements of the Software or develop new applications using the Software + * or (b) remove, delete, alter or obscure any trademarks or any copyright, + * trademark, patent or other intellectual property or proprietary rights + * notices on or in the Software, including any copy thereof. Redistributions + * in binary or source form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +/***************************************************************************** + * Skeleton Utility created by Mitch Thompson + * Full irrevocable rights and permissions granted to Esoteric Software +*****************************************************************************/ + +using System; +using System.IO; +using System.Collections.Generic; +using UnityEngine; +using Spine; + +/// Sets a GameObject's transform to match a bone on a Spine skeleton. +[ExecuteInEditMode] +[AddComponentMenu("Spine/SkeletonUtilityBone")] +public class SkeletonUtilityBone : MonoBehaviour { + + public enum Mode { Follow, Override } + + [System.NonSerialized] + public bool valid; + + [System.NonSerialized] + public SkeletonUtility skeletonUtility; + + [System.NonSerialized] + public Bone bone; + + public Mode mode; + + public bool zPosition = true; + public bool position; + public bool rotation; + public bool scale; + + [Range(0f,1f)] + public float overrideAlpha = 1; + + /// If a bone isn't set, boneName is used to find the bone. + public String boneName; + + public Transform parentReference; + + [HideInInspector] + public bool transformLerpComplete; + + protected Transform cachedTransform; + protected Transform skeletonTransform; + + public bool NonUniformScaleWarning{ + get{ + return nonUniformScaleWarning; + } + } + private bool nonUniformScaleWarning; + + public void Reset () { + bone = null; + cachedTransform = transform; + valid = skeletonUtility != null && skeletonUtility.skeletonRenderer != null && skeletonUtility.skeletonRenderer.valid; + if (!valid) return; + skeletonTransform = skeletonUtility.transform; + + skeletonUtility.OnReset -= HandleOnReset; + skeletonUtility.OnReset += HandleOnReset; + + DoUpdate(); + } + + void OnEnable(){ + skeletonUtility = GetComponentInParent(); + if(skeletonUtility == null) + return; + + skeletonUtility.RegisterBone(this); + + skeletonUtility.OnReset += HandleOnReset; + } + + void HandleOnReset () + { + Reset (); + } + + void OnDisable(){ + if(skeletonUtility != null){ + skeletonUtility.OnReset -= HandleOnReset; + + skeletonUtility.UnregisterBone(this); + } + } + + public void DoUpdate () { + + if (!valid) { + Reset(); + return; + } + + Spine.Skeleton skeleton = skeletonUtility.skeletonRenderer.skeleton; + + if (bone == null) { + if (boneName == null || boneName.Length == 0) return; + bone = skeleton.FindBone(boneName); + if (bone == null) { + Debug.LogError("Bone not found: " + boneName, this); + return; + } + } + + + float flipRotation = (skeleton.flipX ^ skeleton.flipY) ? -1f : 1f; + + + if(mode == Mode.Follow){ + if(position){ + cachedTransform.localPosition = new Vector3(bone.x, bone.y, 0); + } + + if(rotation){ + + if(bone.Data.InheritRotation){ + cachedTransform.localRotation = Quaternion.Euler(0,0,bone.rotationIK); + } + else{ + Vector3 euler = skeletonTransform.rotation.eulerAngles; + cachedTransform.rotation = Quaternion.Euler(euler.x, euler.y, skeletonTransform.rotation.eulerAngles.z + (bone.worldRotation * flipRotation) ); + } + + } + + if(scale){ + cachedTransform.localScale = new Vector3(bone.scaleX, bone.scaleY, 1); + + nonUniformScaleWarning = (bone.scaleX != bone.scaleY); + } + + } + else if(mode == Mode.Override){ + if(transformLerpComplete) + return; + + if(parentReference == null){ + if(position){ + bone.x = Mathf.Lerp(bone.x, cachedTransform.localPosition.x, overrideAlpha); + bone.y = Mathf.Lerp(bone.y, cachedTransform.localPosition.y, overrideAlpha); + } + + if(rotation){ + bone.rotation = Mathf.LerpAngle(bone.Rotation, cachedTransform.localRotation.eulerAngles.z, overrideAlpha); + } + + if(scale){ + bone.scaleX = Mathf.Lerp(bone.scaleX, cachedTransform.localScale.x, overrideAlpha); + bone.scaleY = Mathf.Lerp(bone.scaleY, cachedTransform.localScale.y, overrideAlpha); + + nonUniformScaleWarning = (bone.scaleX != bone.scaleY); + } + } + else{ + if(position){ + Vector3 pos = parentReference.InverseTransformPoint(cachedTransform.position); + bone.x = Mathf.Lerp(bone.x, pos.x, overrideAlpha); + bone.y = Mathf.Lerp(bone.y, pos.y, overrideAlpha); + } + + if(rotation){ + bone.rotation = Mathf.LerpAngle(bone.Rotation, Quaternion.LookRotation( Vector3.forward, parentReference.InverseTransformDirection( cachedTransform.up ) ).eulerAngles.z, overrideAlpha); + } + + //TODO: Something about this + if(scale){ + bone.scaleX = Mathf.Lerp(bone.scaleX, cachedTransform.localScale.x, overrideAlpha); + bone.scaleY = Mathf.Lerp(bone.scaleY, cachedTransform.localScale.y, overrideAlpha); + + nonUniformScaleWarning = (bone.scaleX != bone.scaleY); + } + } + + transformLerpComplete = true; + } + } + + void OnDrawGizmos(){ + if(NonUniformScaleWarning){ + Gizmos.DrawIcon(transform.position + new Vector3(0,0.128f,0), "icon-warning"); + } + } +} \ No newline at end of file diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs.meta new file mode 100644 index 000000000..f66d45053 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b238dfcde8209044b97d23f62bcaadf6 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs new file mode 100644 index 000000000..ffdcf1dd3 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs @@ -0,0 +1,22 @@ +using UnityEngine; +using System.Collections; + +[RequireComponent(typeof(SkeletonUtilityBone)), ExecuteInEditMode] + +public abstract class SkeletonUtilityConstraint : MonoBehaviour { + + protected SkeletonUtilityBone utilBone; + protected SkeletonUtility skeletonUtility; + + protected virtual void OnEnable(){ + utilBone = GetComponent(); + skeletonUtility = GetComponentInParent(); + skeletonUtility.RegisterConstraint(this); + } + + protected virtual void OnDisable(){ + skeletonUtility.UnregisterConstraint(this); + } + + public abstract void DoUpdate(); +} diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs.meta new file mode 100644 index 000000000..dad11e0a2 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 522dbfcc6c916df4396f14f35048d185 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityEyeConstraint.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityEyeConstraint.cs new file mode 100644 index 000000000..07203faef --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityEyeConstraint.cs @@ -0,0 +1,61 @@ +using UnityEngine; +using System.Collections; + +public class SkeletonUtilityEyeConstraint : SkeletonUtilityConstraint { + + public Transform[] eyes; + public float radius = 0.5f; + public Transform target; + public Vector3 targetPosition; + + public float speed = 10; + + Vector3[] origins; + Vector3 centerPoint; + + protected override void OnEnable () + { + if(!Application.isPlaying) + return; + + base.OnEnable (); + + Bounds centerBounds = new Bounds( eyes[0].localPosition, Vector3.zero ); + origins = new Vector3[eyes.Length]; + for(int i = 0; i < eyes.Length; i++){ + origins[i] = eyes[i].localPosition; + centerBounds.Encapsulate( origins[i] ); + } + + centerPoint = centerBounds.center; + } + + protected override void OnDisable () + { + if(!Application.isPlaying) + return; + + base.OnDisable (); + } + + public override void DoUpdate () + { + + if(target != null) + targetPosition = target.position; + + Vector3 goal = targetPosition; + + Vector3 center = transform.TransformPoint(centerPoint); + Vector3 dir = goal - center; + + if(dir.magnitude > 1) + dir.Normalize(); + + for(int i = 0; i < eyes.Length; i++){ + center = transform.TransformPoint(origins[i]); + eyes[i].position = Vector3.MoveTowards(eyes[i].position, center + (dir * radius), speed * Time.deltaTime); + } + + } +} \ No newline at end of file diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityEyeConstraint.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityEyeConstraint.cs.meta new file mode 100644 index 000000000..3e82746da --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityEyeConstraint.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0d994c65b6daec64f80ae2ae04e9d999 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityGroundConstraint.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityGroundConstraint.cs new file mode 100644 index 000000000..70301d92d --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityGroundConstraint.cs @@ -0,0 +1,58 @@ +using UnityEngine; +using System.Collections; + +[RequireComponent(typeof(SkeletonUtilityBone)), ExecuteInEditMode] +public class SkeletonUtilityGroundConstraint : SkeletonUtilityConstraint { + + public LayerMask groundMask; + public bool use2D = true; + public float castDistance = 5f; + Vector3 rayOrigin; + Vector3 rayDir = new Vector3(0,-1,0); + float hitY; + + protected override void OnEnable () + { + base.OnEnable (); + } + + protected override void OnDisable () + { + base.OnDisable (); + } + + public override void DoUpdate() + { + rayOrigin = transform.position + new Vector3(0,castDistance,0); + + hitY = float.MinValue; + if(use2D){ + RaycastHit2D hit = Physics2D.Raycast(rayOrigin , rayDir, castDistance, groundMask); + if(hit.collider != null){ + hitY = hit.point.y; + } + } + else{ + RaycastHit hit; + if(Physics.Raycast( rayOrigin, rayDir, out hit, castDistance, groundMask)){ + hitY = hit.point.y; + } + } + + Vector3 v = transform.position; + v.y = Mathf.Clamp(v.y, hitY, float.MaxValue); + transform.position = v; + + utilBone.bone.X = transform.localPosition.x; + utilBone.bone.Y = transform.localPosition.y; + + } + + void OnDrawGizmos(){ + Vector3 hitEnd = rayOrigin + (rayDir * Mathf.Min(castDistance, rayOrigin.y - hitY)); + Vector3 clearEnd = rayOrigin + (rayDir * castDistance); + Gizmos.DrawLine(rayOrigin, hitEnd); + Gizmos.color = Color.red; + Gizmos.DrawLine(hitEnd, clearEnd); + } +} diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityGroundConstraint.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityGroundConstraint.cs.meta new file mode 100644 index 000000000..5d9e6920c --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityGroundConstraint.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3662334b99de5fe4396ab24e30c4fd12 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityKinematicShadow.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityKinematicShadow.cs new file mode 100644 index 000000000..917eb5a45 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityKinematicShadow.cs @@ -0,0 +1,81 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +public class SkeletonUtilityKinematicShadow : MonoBehaviour { + + public bool hideShadow = true; + + Dictionary shadowTable; + GameObject shadowRoot; + + void Start(){ + shadowRoot = (GameObject)Instantiate(gameObject); + if(hideShadow) + shadowRoot.hideFlags = HideFlags.HideInHierarchy; + + shadowRoot.transform.parent = transform.root; + + shadowTable = new Dictionary(); + + Destroy(shadowRoot.GetComponent()); + + shadowRoot.transform.position = transform.position; + shadowRoot.transform.rotation = transform.rotation; + + Vector3 scaleRef = transform.TransformPoint(Vector3.right); + float scale = Vector3.Distance(transform.position, scaleRef); + shadowRoot.transform.localScale = Vector3.one; + + var shadowJoints = shadowRoot.GetComponentsInChildren(); + foreach(Joint j in shadowJoints){ + j.connectedAnchor *= scale; + } + + var joints = GetComponentsInChildren(); + foreach(var j in joints) + Destroy(j); + + var rbs = GetComponentsInChildren(); + foreach(var rb in rbs) + Destroy(rb); + + var colliders = GetComponentsInChildren(); + foreach(var c in colliders) + Destroy(c); + + + //match by bone name + var shadowBones = shadowRoot.GetComponentsInChildren(); + var bones = GetComponentsInChildren(); + + //build bone lookup + foreach(var b in bones){ + if(b.gameObject == gameObject) + continue; + + foreach(var sb in shadowBones){ + if(sb.rigidbody == null) + continue; + + if(sb.boneName == b.boneName){ + shadowTable.Add( sb.transform, b.transform ); + break; + } + } + } + + foreach(var b in shadowBones) + Destroy(b); + } + + void FixedUpdate(){ + shadowRoot.rigidbody.MovePosition( transform.position ); + shadowRoot.rigidbody.MoveRotation( transform.rotation ); + + foreach(var pair in shadowTable){ + pair.Value.localPosition = pair.Key.localPosition; + pair.Value.localRotation = pair.Key.localRotation; + } + } +} \ No newline at end of file diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityKinematicShadow.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityKinematicShadow.cs.meta new file mode 100644 index 000000000..06bcb6f4a --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilityKinematicShadow.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cfeac06b8a6aa1645813700e3e4c0863 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs new file mode 100644 index 000000000..f6a2e682b --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs @@ -0,0 +1,102 @@ +using UnityEngine; +using System.Collections; + +[ExecuteInEditMode] +public class SkeletonUtilitySubmeshRenderer : MonoBehaviour { + + public Renderer parentRenderer; + + [System.NonSerialized] + public Mesh mesh; + + public int submeshIndex = 0; + public int sortingOrder = 0; + public int sortingLayerID = 0; + + public Material hiddenPassMaterial; + Renderer cachedRenderer; + MeshFilter filter; + Material[] sharedMaterials; + MeshFilter parentFilter; + + void Awake(){ + cachedRenderer = renderer; + sharedMaterials = cachedRenderer.sharedMaterials; + filter = GetComponent(); + + if(parentRenderer != null) + Initialize( parentRenderer ); + } + + void OnEnable(){ + parentRenderer = transform.parent.GetComponent(); + parentRenderer.GetComponent().OnReset += HandleSkeletonReset; + } + + void OnDisable(){ + parentRenderer.GetComponent().OnReset -= HandleSkeletonReset; + } + + void HandleSkeletonReset(SkeletonRenderer r){ + if(parentRenderer != null) + Initialize(parentRenderer); + } + + public void Initialize(Renderer parentRenderer){ + this.parentRenderer = parentRenderer; + parentFilter = parentRenderer.GetComponent(); + mesh = parentFilter.sharedMesh; + filter.sharedMesh = mesh; + Debug.Log("Mesh: " + mesh); + } + + public void Update(){ + if(mesh == null || mesh != parentFilter.sharedMesh){ + mesh = parentFilter.sharedMesh; + filter.sharedMesh = mesh; + } + + if(cachedRenderer == null) + cachedRenderer = renderer; + + if(mesh == null || submeshIndex > mesh.subMeshCount - 1){ + cachedRenderer.enabled = false; + return; + } + else{ + renderer.enabled = true; + } + + bool changed = false; + + if(sharedMaterials.Length != parentRenderer.sharedMaterials.Length){ + sharedMaterials = parentRenderer.sharedMaterials; + changed = true; + } + + + + for(int i = 0; i < renderer.sharedMaterials.Length; i++){ + if(i == submeshIndex) + continue; + + if(sharedMaterials[i] != hiddenPassMaterial){ + sharedMaterials[i] = hiddenPassMaterial; + changed = true; + } + } + + if(sharedMaterials[submeshIndex] != parentRenderer.sharedMaterials[submeshIndex]){ + sharedMaterials[submeshIndex] = parentRenderer.sharedMaterials[submeshIndex]; + changed = true; + } + + if(changed){ + cachedRenderer.sharedMaterials = sharedMaterials; + } + + + cachedRenderer.sortingLayerID = sortingLayerID; + cachedRenderer.sortingOrder = sortingOrder; + } +} diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs.meta b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs.meta new file mode 100644 index 000000000..168ca8811 --- /dev/null +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7820c1c2b0e52c6408de899d6939996e +MonoImporter: + serializedVersion: 2 + defaultReferences: + - parentRenderer: {instanceID: 0} + - mesh: {instanceID: 0} + - hiddenPassMaterial: {fileID: 2100000, guid: 43227e5adadc6f24bb4bf74b92a56fb4, + type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: