From 5906a0de0db627673bc4c53d9f0729d1849147de Mon Sep 17 00:00:00 2001 From: Fenrisul Date: Mon, 6 Oct 2014 16:16:49 -0700 Subject: [PATCH 1/2] [Unity TK2D] Brought inline with Spine Unity native runtime. --- spine-tk2d/Assets/Gizmos.meta | 5 + .../Assets/Gizmos/SkeletonDataAsset Icon.png | Bin 0 -> 4424 bytes .../Gizmos/SkeletonDataAsset Icon.png.meta | 46 ++ .../{BoneComponent.cs => BoneFollower.cs} | 66 ++- ...Component.cs.meta => BoneFollower.cs.meta} | 2 +- ...tInspector.cs => BoneFollowerInspector.cs} | 42 +- ....cs.meta => BoneFollowerInspector.cs.meta} | 2 +- spine-tk2d/Assets/spine-tk2d/Editor/GUI.meta | 5 + .../spine-tk2d/Editor/GUI/icon-animation.png | Bin 0 -> 3368 bytes .../Editor/GUI/icon-animation.png.meta | 47 ++ .../Editor/GUI/icon-animationRoot.png | Bin 0 -> 3302 bytes .../Editor/GUI/icon-animationRoot.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-bone.png | Bin 0 -> 515 bytes .../spine-tk2d/Editor/GUI/icon-bone.png.meta | 47 ++ .../spine-tk2d/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 ++ .../spine-tk2d/Editor/GUI/icon-event.png | Bin 0 -> 3116 bytes .../spine-tk2d/Editor/GUI/icon-event.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-hingeChain.png | Bin 0 -> 757 bytes .../Editor/GUI/icon-hingeChain.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-image.png | Bin 0 -> 3132 bytes .../spine-tk2d/Editor/GUI/icon-image.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-mesh.png | Bin 0 -> 603 bytes .../spine-tk2d/Editor/GUI/icon-mesh.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-null.png | Bin 0 -> 3023 bytes .../spine-tk2d/Editor/GUI/icon-null.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-poseBones.png | Bin 0 -> 555 bytes .../Editor/GUI/icon-poseBones.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-skeleton.png | Bin 0 -> 3207 bytes .../Editor/GUI/icon-skeleton.png.meta | 47 ++ .../Editor/GUI/icon-skeletonUtility.png | Bin 0 -> 1133 bytes .../Editor/GUI/icon-skeletonUtility.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-skin.png | Bin 0 -> 3430 bytes .../spine-tk2d/Editor/GUI/icon-skin.png.meta | 47 ++ .../Editor/GUI/icon-skinPlaceholder.png | Bin 0 -> 3370 bytes .../Editor/GUI/icon-skinPlaceholder.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-skinsRoot.png | Bin 0 -> 790 bytes .../Editor/GUI/icon-skinsRoot.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-slot.png | Bin 0 -> 3387 bytes .../spine-tk2d/Editor/GUI/icon-slot.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-spine.png | Bin 0 -> 4424 bytes .../spine-tk2d/Editor/GUI/icon-spine.png.meta | 47 ++ .../Editor/GUI/icon-subMeshRenderer.png | Bin 0 -> 3536 bytes .../Editor/GUI/icon-subMeshRenderer.png.meta | 47 ++ .../spine-tk2d/Editor/GUI/icon-warning.png | Bin 0 -> 1713 bytes .../Editor/GUI/icon-warning.png.meta | 47 ++ .../Editor/SkeletonAnimationInspector.cs | 41 +- .../Editor/SkeletonDataAssetInspector.cs | 542 +++++++++++++++++- .../Editor/SkeletonDataAssetInspector.cs.meta | 2 +- .../spine-tk2d/Editor/SpineEditorUtilities.cs | 268 +++++++++ .../Editor/SpineEditorUtilities.cs.meta | 8 + .../Assets/spine-tk2d/Shaders/Bones.shader | 69 +++ .../spine-tk2d/Shaders/Bones.shader.meta | 5 + .../Assets/spine-tk2d/Shaders/HiddenPass.mat | Bin 0 -> 4288 bytes .../spine-tk2d/Shaders/HiddenPass.mat.meta | 4 + .../spine-tk2d/Shaders/HiddenPass.shader | 21 + .../spine-tk2d/Shaders/HiddenPass.shader.meta | 5 + .../Assets/spine-tk2d/SkeletonAnimation.cs | 33 +- .../Assets/spine-tk2d/SkeletonDataAsset.cs | 9 +- .../Assets/spine-tk2d/SkeletonExtensions.cs | 108 ++++ .../spine-tk2d/SkeletonExtensions.cs.meta | 8 + .../Assets/spine-tk2d/SkeletonRenderer.cs | 119 ++-- .../Assets/spine-tk2d/SkeletonUtility.meta | 5 + .../spine-tk2d/SkeletonUtility/Editor.meta | 5 + .../Editor/SkeletonUtilityBoneInspector.cs | 304 ++++++++++ .../SkeletonUtilityBoneInspector.cs.meta | 8 + .../Editor/SkeletonUtilityInspector.cs | 311 ++++++++++ .../Editor/SkeletonUtilityInspector.cs.meta | 8 + .../SkeletonUtility/SkeletonUtility.cs | 346 +++++++++++ .../SkeletonUtility/SkeletonUtility.cs.meta | 8 + .../SkeletonUtility/SkeletonUtilityBone.cs | 293 ++++++++++ .../SkeletonUtilityBone.cs.meta | 8 + .../SkeletonUtilityConstraint.cs | 22 + .../SkeletonUtilityConstraint.cs.meta | 8 + .../SkeletonUtilityEyeConstraint.cs | 56 ++ .../SkeletonUtilityEyeConstraint.cs.meta | 8 + .../SkeletonUtilityGroundConstraint.cs | 120 ++++ .../SkeletonUtilityGroundConstraint.cs.meta | 8 + .../SkeletonUtilityKinematicShadow.cs | 79 +++ .../SkeletonUtilityKinematicShadow.cs.meta | 8 + .../SkeletonUtilitySubmeshRenderer.cs | 96 ++++ .../SkeletonUtilitySubmeshRenderer.cs.meta | 12 + 86 files changed, 3993 insertions(+), 117 deletions(-) create mode 100644 spine-tk2d/Assets/Gizmos.meta create mode 100644 spine-tk2d/Assets/Gizmos/SkeletonDataAsset Icon.png create mode 100644 spine-tk2d/Assets/Gizmos/SkeletonDataAsset Icon.png.meta rename spine-tk2d/Assets/spine-tk2d/{BoneComponent.cs => BoneFollower.cs} (80%) rename spine-tk2d/Assets/spine-tk2d/{BoneComponent.cs.meta => BoneFollower.cs.meta} (78%) rename spine-tk2d/Assets/spine-tk2d/Editor/{BoneComponentInspector.cs => BoneFollowerInspector.cs} (76%) rename spine-tk2d/Assets/spine-tk2d/Editor/{BoneComponentInspector.cs.meta => BoneFollowerInspector.cs.meta} (78%) create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animation.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animation.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animationRoot.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animationRoot.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-bone.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-bone.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-boneNib.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-boneNib.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-boundingBox.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-boundingBox.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-constraintNib.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-constraintNib.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-event.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-event.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-hingeChain.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-hingeChain.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-image.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-image.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-mesh.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-mesh.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-null.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-null.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-poseBones.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-poseBones.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeleton.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeleton.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeletonUtility.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeletonUtility.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skin.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skin.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinPlaceholder.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinPlaceholder.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinsRoot.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinsRoot.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-slot.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-slot.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-spine.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-spine.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-subMeshRenderer.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-subMeshRenderer.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-warning.png create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-warning.png.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/SpineEditorUtilities.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/Editor/SpineEditorUtilities.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Shaders/Bones.shader create mode 100644 spine-tk2d/Assets/spine-tk2d/Shaders/Bones.shader.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.mat create mode 100644 spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.mat.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.shader create mode 100644 spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.shader.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonExtensions.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonExtensions.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityInspector.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtility.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtility.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityBone.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityBone.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityConstraint.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityConstraint.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityEyeConstraint.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityEyeConstraint.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityGroundConstraint.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityGroundConstraint.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityKinematicShadow.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityKinematicShadow.cs.meta create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs create mode 100644 spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs.meta diff --git a/spine-tk2d/Assets/Gizmos.meta b/spine-tk2d/Assets/Gizmos.meta new file mode 100644 index 000000000..a7b083b0c --- /dev/null +++ b/spine-tk2d/Assets/Gizmos.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: a260a1ff5965c2c4f88aea3e7d433965 +folderAsset: yes +DefaultImporter: + userData: diff --git a/spine-tk2d/Assets/Gizmos/SkeletonDataAsset Icon.png b/spine-tk2d/Assets/Gizmos/SkeletonDataAsset Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd5473c1474be392c6ddff639c8817ec49e2860 GIT binary patch literal 4424 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 G#Qy+ll>ZC> literal 0 HcmV?d00001 diff --git a/spine-tk2d/Assets/Gizmos/SkeletonDataAsset Icon.png.meta b/spine-tk2d/Assets/Gizmos/SkeletonDataAsset Icon.png.meta new file mode 100644 index 000000000..22239ca4b --- /dev/null +++ b/spine-tk2d/Assets/Gizmos/SkeletonDataAsset Icon.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 68defdbc95b30a74a9ad396bfc9a2277 +TextureImporter: + 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-tk2d/Assets/spine-tk2d/BoneComponent.cs b/spine-tk2d/Assets/spine-tk2d/BoneFollower.cs similarity index 80% rename from spine-tk2d/Assets/spine-tk2d/BoneComponent.cs rename to spine-tk2d/Assets/spine-tk2d/BoneFollower.cs index acfe183cb..e900ba8ee 100644 --- a/spine-tk2d/Assets/spine-tk2d/BoneComponent.cs +++ b/spine-tk2d/Assets/spine-tk2d/BoneFollower.cs @@ -36,14 +36,14 @@ using Spine; /// Sets a GameObject's transform to match a bone on a Spine skeleton. [ExecuteInEditMode] -[AddComponentMenu("Spine/BoneComponent")] -public class BoneComponent : MonoBehaviour { - [System.NonSerialized] - public bool valid; +[AddComponentMenu("Spine/BoneFollower")] +public class BoneFollower : MonoBehaviour { + [System.NonSerialized] + public bool + valid; public SkeletonRenderer skeletonRenderer; public Bone bone; - public bool followZPosition = true; public bool followBoneRotation = true; @@ -51,46 +51,66 @@ public class BoneComponent : MonoBehaviour { get { return skeletonRenderer; } set { skeletonRenderer = value; - Reset (); + Reset(); } } - // 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; + 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; } if (bone == null) { - if (boneName == null || boneName.Length == 0) return; + if (boneName == null || boneName.Length == 0) + return; bone = skeletonRenderer.skeleton.FindBone(boneName); if (bone == null) { Debug.LogError("Bone not found: " + boneName, this); return; + } else { + } } @@ -100,22 +120,24 @@ public class BoneComponent : MonoBehaviour { if (cachedTransform.parent == skeletonTransform) { cachedTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : cachedTransform.localPosition.z); - if(followBoneRotation) { + if (followBoneRotation) { Vector3 rotation = cachedTransform.localRotation.eulerAngles; cachedTransform.localRotation = Quaternion.Euler(rotation.x, rotation.y, bone.worldRotation * flipRotation); } } else { Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f)); - if(!followZPosition) targetWorldPosition.z = cachedTransform.position.z; + if (!followZPosition) + targetWorldPosition.z = cachedTransform.position.z; cachedTransform.position = targetWorldPosition; - if(followBoneRotation) { + 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-tk2d/Assets/spine-tk2d/BoneComponent.cs.meta b/spine-tk2d/Assets/spine-tk2d/BoneFollower.cs.meta similarity index 78% rename from spine-tk2d/Assets/spine-tk2d/BoneComponent.cs.meta rename to spine-tk2d/Assets/spine-tk2d/BoneFollower.cs.meta index f2c537209..29dabc13e 100644 --- a/spine-tk2d/Assets/spine-tk2d/BoneComponent.cs.meta +++ b/spine-tk2d/Assets/spine-tk2d/BoneFollower.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d08aa5caf52eae44ba81cc81ca1dad5d +guid: a1fd8daaed7b64148a34acb96ba14ce1 MonoImporter: serializedVersion: 2 defaultReferences: [] diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/BoneComponentInspector.cs b/spine-tk2d/Assets/spine-tk2d/Editor/BoneFollowerInspector.cs similarity index 76% rename from spine-tk2d/Assets/spine-tk2d/Editor/BoneComponentInspector.cs rename to spine-tk2d/Assets/spine-tk2d/Editor/BoneFollowerInspector.cs index b7373393c..943a98715 100644 --- a/spine-tk2d/Assets/spine-tk2d/Editor/BoneComponentInspector.cs +++ b/spine-tk2d/Assets/spine-tk2d/Editor/BoneFollowerInspector.cs @@ -27,30 +27,57 @@ * 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(BoneComponent))] -public class BoneComponentInspector : Editor { +[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 = SkeletonUtility.GetInParent(component.transform); + + 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(); - BoneComponent component = (BoneComponent)target; + + FindRenderer(); EditorGUILayout.PropertyField(skeletonRenderer); if (component.valid) { - String[] bones = new String[component.skeletonRenderer.skeleton.Data.Bones.Count + 1]; + 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; @@ -64,13 +91,14 @@ public class BoneComponentInspector : Editor { 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") + (Event.current.type == EventType.ValidateCommand && Event.current.commandName == "UndoRedoPerformed") ) { component.Reset(); } diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/BoneComponentInspector.cs.meta b/spine-tk2d/Assets/spine-tk2d/Editor/BoneFollowerInspector.cs.meta similarity index 78% rename from spine-tk2d/Assets/spine-tk2d/Editor/BoneComponentInspector.cs.meta rename to spine-tk2d/Assets/spine-tk2d/Editor/BoneFollowerInspector.cs.meta index 7a90e80a3..a5cf9ae89 100644 --- a/spine-tk2d/Assets/spine-tk2d/Editor/BoneComponentInspector.cs.meta +++ b/spine-tk2d/Assets/spine-tk2d/Editor/BoneFollowerInspector.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 99e3e8311529bbc48a5c3a5b9714e162 +guid: c71ca35fd6241cb49a0b0756a664fcf7 MonoImporter: serializedVersion: 2 defaultReferences: [] diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/GUI.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI.meta new file mode 100644 index 000000000..d730a5573 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Editor/GUI.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: bfaea6b7e7f52bc46b8d1c3cb5e9eaa1 +folderAsset: yes +DefaultImporter: + userData: diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animation.png b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animation.png new file mode 100644 index 0000000000000000000000000000000000000000..f44d38e9030a52cbe6aaf31067f7f132faca511f GIT binary patch literal 3368 zcmV+@4cGFCP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00070NklQ%-nJ$ES@PYPvsEeDs`*!!&p(ib3LVaNv=J1*M z{)P`DBK&WdvjBhq;9oA|SEB<(`_6Sq0DRL|en&9IRA*r;0F)EmJ;5DEj)!AIgA0~rx$>)6mNlikx_4)_q2r7vwEt+ZNYkqQ4NY!;AY@nQ zbrl`gZr(1ftlGJ?ao53-;o*^x-v=pWv0)e^eSLjB0)QQAIb7!QZCTEkhRiORB~tU0 zHg}xfD}<|n(kV^I!qxIUZMv@O-Oh(50GJ#A#m)I808o78RxS}QSy?a=iRDF;vKa|Q zNi#)cgevC&%n;ERBAOwhl{HD!8!tc97HA&t(&sUE?9FpyVqzk7q5sikZ;kFvCzIyj z-CGaeKYMHtQ6}FoID)tU6kHz|YN^>?zdLQ)*{^S3&))C8G78`)fH;5@E#49}buyqTELCuK@rc(eL&SHsNvr0000ou@P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0006JNkl_3Pqxt!Ul%Uk3nN ztJR(o5%qe#&j38z_bwbLhr{6jzyk1DmUYvzEU+x=0l;kITn8Sr06fKF@m?enc_9cw zMA!A1D2nd@{M-TCNOl154F-cRw66JlPKu)Z0B{8WvxB$mxmvA0BO)pk3U7M79*ssL zG7RGvfU5x9+jyr<2h4K0bgHVVgu~%$e!m|)&qJ2wak*T6B1zKQ^E_~dLZLf`VVuQc zvHJ|eK$hiilgUJjMx&42Znw1qwjrR&WTGjGGUqrB01ylYJ)$VS4+H`a1wpubo{2~4 zbULQ%`l8e6kgn?n5z%xy{hmxFum6vUUP+QZtX3;hRaFCUtKaW;h=`ia=4$|)Ex~$x zZU6z(G#936E;5-+G@H%FHVP`0$^!uGAp)*cDm|LbW@n~pF3RQd^LRXddpsV0ZMWN> z5{bkO02cr_{vuefC$DMR>1Z@kbGh6xfJ?*Su&rs@DS*rSKksLOYcv`!y2|vxIgYysU`|B8Z9}tGz!MSGYPI|(Z2(;Pd_K@>wO;LSpIr++(=->YR_kN~ kUYp7RI9jLDcJzM+0Q=3q37m~rYXATM07*qoM6N<$f{xuFc>n+a literal 0 HcmV?d00001 diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animationRoot.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animationRoot.png.meta new file mode 100644 index 000000000..4bcf433e8 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-animationRoot.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 3d1be4ea889f3a14b864352fe49a1bde +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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-bone.png b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-boundingBox.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-boundingBox.png.meta new file mode 100644 index 000000000..c90f54d3c --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-constraintNib.png b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-constraintNib.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-constraintNib.png.meta new file mode 100644 index 000000000..e7ab7aca3 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-event.png b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-event.png new file mode 100644 index 0000000000000000000000000000000000000000..4547f254ca02538d7382258d7659e265b719927f GIT binary patch literal 3116 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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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-mesh.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-mesh.png.meta new file mode 100644 index 000000000..a98b0e9c8 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-null.png b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeleton.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeleton.png.meta new file mode 100644 index 000000000..f607575fb --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeleton.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: f2216037084d99d4481810cb521ed96f +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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeletonUtility.png b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeletonUtility.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4d937b20d040d8181baca98b1ec68a83396f96 GIT binary patch literal 1133 zcmV-z1d{uSP)jROreXx;4sNu~-<2Mf` zl4$y5G!he&CY6`15-i$cYitZfN-Wqwm5+i!OJN~fpcHn2Qs8or4|i7ATB?bYoMi5u zne#j6{AZ355&rK`O1XhNARU+oLL##IkBuVopAAre4M>c$B*5R&(sEivq`A5Iqz0?I z&nN20?i+ZVWdXZ@Oucqn!}CT)Mji#Q+wFUS0wAK4x(#evIfRMfzHm( zU}k1!y2s;5nwpvl8-`&^Nl8ibdcBTlG%5oF1FOMc@cY@>*~^`sog+X9m=KZ0e}ma{ znKE}36+LnI$dMO;ozY0txYYf__*47$yH{3Lq^72(va+%=#WYPKk%%}P4wagk%JlT~ z+}hgObYWrPArZMAuSWvl0@ARAei-lpCBSp1zdL{Hr{NLl9U7KPzYNN^-QAJA{QP?0 zKzVuj3DY!1M5M2;Zy9I;4g=2sWk7noW-cK2g`-EGbh=zwhG8T*9L|hfpRZtJW5e!t zyS>>tIqA_z#Qfx=4|_HZW76q#-Ez5-=YVVd{ry)&q+Th-+}zv}&<*qe1|Zrj81P7Y z$2Xtl`~3maG?m@yOfpRqQ)eBU-<+S{IMv#E6$q7fE-tz{JhW6-S62~}BRf0W zrJWlhvK22&43A5ee`zu$4<lc$%RaJk&lv3MXf*8yIcvKV7tY zclzFa``o4o<6~oU?>4^uC1Cga{h3QkOJ+D6HfCmKma(q;wyQvMDk=&tUg)~=Y4gV|z;8gQ$K!D}H8owUudnx* zrfC3MF`e!OTW);g_2a+=-~p`1x~|uh2F`wP>{u8`2ExENU~6b-c+BJRxQ2&^e@#e8 zNQ*=w3vp-f30nn5ff?W-tgD}l^&HlL6>X#XdsCM_FAxaij*X3lySlo5oS2yK+HAHh ztVXacEPjY~bVrwC6^Lrs9St(|K9|?)%?JjAJ;3kl>+6w%f`S}irw(>G-mxtXU}{He zdeb6s6IcM2^uJhnW7(P2)z#&trKJj(92y$BXt&$fJ32ZJ0?xa$P$Cj*ONoFTaA4`C zw8OtS=dVYqu)0i+4saHD5UW{7fk_dG#>4&qB?{b6GbmGu00000NkvXXu0mjfe3A@6 literal 0 HcmV?d00001 diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeletonUtility.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skeletonUtility.png.meta new file mode 100644 index 000000000..9d3c22794 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skin.png b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skin.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skin.png.meta new file mode 100644 index 000000000..3be7a6e69 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinPlaceholder.png b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinPlaceholder.png new file mode 100644 index 0000000000000000000000000000000000000000..3b11d379e43d42f770f6b3aaa58588f63774553b GIT binary patch literal 3370 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 literal 0 HcmV?d00001 diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinsRoot.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinsRoot.png.meta new file mode 100644 index 000000000..e332380e8 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-skinsRoot.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 8bd14c7643597a74ba2edc10a5e4c4ed +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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-slot.png b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-slot.png new file mode 100644 index 0000000000000000000000000000000000000000..ca938722d0792078eef7517d3a9ffc8248429cb5 GIT binary patch literal 3387 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.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 G#Qy+ll>ZC> literal 0 HcmV?d00001 diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-spine.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-spine.png.meta new file mode 100644 index 000000000..c0ec65ca2 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-spine.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 4e7c964fa5e07024c8bf1debecc3b7c8 +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-tk2d/Assets/spine-tk2d/Editor/GUI/icon-subMeshRenderer.png b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-subMeshRenderer.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7c9e64bb1a4cf1065652908425ac95aff2d17f GIT binary patch literal 3536 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 W*c~!{*LmCX6HzHP$&V*%EB^-QZFN}y literal 0 HcmV?d00001 diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-warning.png.meta b/spine-tk2d/Assets/spine-tk2d/Editor/GUI/icon-warning.png.meta new file mode 100644 index 000000000..e32950ca4 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Editor/SkeletonAnimationInspector.cs b/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonAnimationInspector.cs index bc6d6b19c..f338626b2 100644 --- a/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonAnimationInspector.cs +++ b/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonAnimationInspector.cs @@ -27,28 +27,47 @@ * 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; +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 () { base.gui(); SkeletonAnimation component = (SkeletonAnimation)target; - if (!component.valid) return; + 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; + } + } + } + + + //TODO: Refactor this to use GenericMenu and callbacks to avoid interfering with control by other behaviours. // Animation name. { String[] animations = new String[component.skeleton.Data.Animations.Count + 1]; @@ -67,12 +86,26 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector { EditorGUILayout.EndHorizontal(); String selectedAnimationName = animationIndex == 0 ? null : animations[animationIndex]; - component.AnimationName = selectedAnimationName; - animationName.stringValue = selectedAnimationName; + if (component.AnimationName != selectedAnimationName) { + 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-tk2d/Assets/spine-tk2d/Editor/SkeletonDataAssetInspector.cs b/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonDataAssetInspector.cs index 2642d4d46..f3cf146d1 100644 --- a/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonDataAssetInspector.cs +++ b/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonDataAssetInspector.cs @@ -28,8 +28,17 @@ * 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; + +#if !UNITY_4_3 +using UnityEditor.AnimatedValues; +#endif using UnityEngine; using Spine; @@ -37,39 +46,75 @@ using Spine; public class SkeletonDataAssetInspector : Editor { private SerializedProperty spriteCollection, skeletonJSON, scale, fromAnimation, toAnimation, duration, defaultMix; private bool showAnimationStateData = true; - + + #if UNITY_4_3 + private bool m_showAnimationList = true; + #else + private AnimBool m_showAnimationList = new AnimBool(true); + #endif + + private bool m_initialized = false; + private SkeletonDataAsset m_skeletonDataAsset; + private string m_skeletonDataAssetGUID; + void OnEnable () { - spriteCollection = serializedObject.FindProperty("spriteCollection"); - skeletonJSON = serializedObject.FindProperty("skeletonJSON"); - scale = serializedObject.FindProperty("scale"); - fromAnimation = serializedObject.FindProperty("fromAnimation"); - toAnimation = serializedObject.FindProperty("toAnimation"); - duration = serializedObject.FindProperty("duration"); - defaultMix = serializedObject.FindProperty("defaultMix"); - } + try { + spriteCollection = serializedObject.FindProperty("spriteCollection"); + 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 () { + m_initialized = false; + EditorApplication.update -= Update; + this.DestroyPreviewInstances(); + if (this.m_previewUtility != null) { + this.m_previewUtility.Cleanup(); + this.m_previewUtility = null; + } + } + override public void OnInspectorGUI () { serializedObject.Update(); SkeletonDataAsset asset = (SkeletonDataAsset)target; - - tk2dSpriteCollection sprites = EditorGUILayout.ObjectField("Sprite Collection", asset.spriteCollection, typeof(tk2dSpriteCollection), false) as tk2dSpriteCollection; - if (sprites != null) - spriteCollection.objectReferenceValue = sprites.spriteCollection; - + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(spriteCollection); EditorGUILayout.PropertyField(skeletonJSON); EditorGUILayout.PropertyField(scale); + if (EditorGUI.EndChangeCheck()) { + if (m_previewUtility != null) { + m_previewUtility.Cleanup(); + m_previewUtility = null; + } + } SkeletonData skeletonData = asset.GetSkeletonData(asset.spriteCollection == null || asset.skeletonJSON == null); if (skeletonData != null) { showAnimationStateData = EditorGUILayout.Foldout(showAnimationStateData, "Animation State Data"); if (showAnimationStateData) { EditorGUILayout.PropertyField(defaultMix); - - // Animation names. + + // Animation names String[] animations = new String[skeletonData.Animations.Count]; for (int i = 0; i < animations.Length; i++) animations[i] = skeletonData.Animations[i].Name; - + for (int i = 0; i < fromAnimation.arraySize; i++) { SerializedProperty from = fromAnimation.GetArrayElementAtIndex(i); SerializedProperty to = toAnimation.GetArrayElementAtIndex(i); @@ -95,14 +140,471 @@ public class SkeletonDataAssetInspector : Editor { EditorGUILayout.Space(); EditorGUILayout.EndHorizontal(); } + + if (GUILayout.Button(new GUIContent("Setup Pose", SpineEditorUtilities.Icons.skeleton), GUILayout.Width(105), GUILayout.Height(18))) { + StopAnimation(); + m_skeletonAnimation.skeleton.SetToSetupPose(); + m_requireRefresh = true; + } + + #if UNITY_4_3 + m_showAnimationList = EditorGUILayout.Foldout(m_showAnimationList, new GUIContent("Animations", SpineEditorUtilities.Icons.animationRoot)); + if(m_showAnimationList){ + #else + m_showAnimationList.target = EditorGUILayout.Foldout(m_showAnimationList.target, new GUIContent("Animations", SpineEditorUtilities.Icons.animationRoot)); + if (EditorGUILayout.BeginFadeGroup(m_showAnimationList.faded)) { + #endif + + + + + EditorGUILayout.LabelField("Name", "Duration"); + foreach (Spine.Animation a in skeletonData.Animations) { + GUILayout.BeginHorizontal(); + + if (m_skeletonAnimation != null && m_skeletonAnimation.state != null) { + if (m_skeletonAnimation.state.GetCurrent(0) != null && m_skeletonAnimation.state.GetCurrent(0).Animation == a) { + GUI.contentColor = Color.black; + if (GUILayout.Button("\u25BA", GUILayout.Width(24))) { + StopAnimation(); + } + GUI.contentColor = Color.white; + } else { + if (GUILayout.Button("\u25BA", GUILayout.Width(24))) { + PlayAnimation(a.Name, true); + } + } + } else { + GUILayout.Label("?", GUILayout.Width(24)); + } + EditorGUILayout.LabelField(new GUIContent(a.Name, SpineEditorUtilities.Icons.animation), new GUIContent(a.Duration.ToString("f3") + "s" + ("(" + (Mathf.RoundToInt(a.Duration * 30)) + ")").PadLeft(12, ' '))); + GUILayout.EndHorizontal(); + } + } + #if !UNITY_4_3 + EditorGUILayout.EndFadeGroup(); + #endif } - + if (!Application.isPlaying) { if (serializedObject.ApplyModifiedProperties() || (UnityEngine.Event.current.type == EventType.ValidateCommand && UnityEngine.Event.current.commandName == "UndoRedoPerformed") - ) { + ) { asset.Reset(); } } } -} + + //preview window stuff + private PreviewRenderUtility m_previewUtility; + private GameObject m_previewInstance; + private Vector2 previewDir; + private SkeletonAnimation m_skeletonAnimation; + private SkeletonData m_skeletonData; + private static int sliderHash = "Slider".GetHashCode(); + private float m_lastTime; + private bool m_playing; + private bool m_requireRefresh; + private Color m_originColor = new Color(0.3f, 0.3f, 0.3f, 1); + + private void StopAnimation () { + m_skeletonAnimation.state.ClearTrack(0); + m_playing = false; + } + + List m_animEvents = new List(); + List m_animEventFrames = new List(); + + private void PlayAnimation (string animName, bool loop) { + m_animEvents.Clear(); + m_animEventFrames.Clear(); + + m_skeletonAnimation.state.SetAnimation(0, animName, loop); + + Spine.Animation a = m_skeletonAnimation.state.GetCurrent(0).Animation; + foreach (Timeline t in a.Timelines) { + if (t.GetType() == typeof(EventTimeline)) { + EventTimeline et = (EventTimeline)t; + + for (int i = 0; i < et.Events.Length; i++) { + m_animEvents.Add(et.Events[i]); + m_animEventFrames.Add(et.Frames[i]); + } + + } + } + + m_playing = true; + } + + private void InitPreview () { + if (this.m_previewUtility == null) { + this.m_lastTime = Time.realtimeSinceStartup; + this.m_previewUtility = new PreviewRenderUtility(true); + this.m_previewUtility.m_Camera.isOrthoGraphic = true; + this.m_previewUtility.m_Camera.orthographicSize = (scale.floatValue * (m_skeletonDataAsset.spriteCollection.invOrthoSize * m_skeletonDataAsset.spriteCollection.halfTargetHeight)) / 100; + this.m_previewUtility.m_Camera.cullingMask = -2147483648; + this.CreatePreviewInstances(); + } + } + + private void CreatePreviewInstances () { + this.DestroyPreviewInstances(); + if (this.m_previewInstance == null) { + string skinName = EditorPrefs.GetString(m_skeletonDataAssetGUID + "_lastSkin", ""); + + m_previewInstance = SpineEditorUtilities.SpawnAnimatedSkeleton((SkeletonDataAsset)target, skinName).gameObject; + //m_previewInstance.transform.localScale = Vector3.one * 0.01f; + m_previewInstance.hideFlags = HideFlags.HideAndDontSave; + m_previewInstance.layer = 0x1f; + + + m_skeletonAnimation = m_previewInstance.GetComponent(); + m_skeletonAnimation.initialSkinName = skinName; + m_skeletonAnimation.LateUpdate(); + m_skeletonData = m_skeletonAnimation.skeletonDataAsset.GetSkeletonData(true); + + m_previewInstance.renderer.enabled = false; + + m_initialized = true; + AdjustCameraGoals(true); + } + } + + private void DestroyPreviewInstances () { + if (this.m_previewInstance != null) { + DestroyImmediate(this.m_previewInstance); + m_previewInstance = null; + } + m_initialized = false; + } + + public override bool HasPreviewGUI () { + //TODO: validate json data + return skeletonJSON.objectReferenceValue != null; + } + + Texture m_previewTex = new Texture(); + + public override void OnInteractivePreviewGUI (Rect r, GUIStyle background) { + this.InitPreview(); + + if (UnityEngine.Event.current.type == EventType.Repaint) { + if (m_requireRefresh) { + this.m_previewUtility.BeginPreview(r, background); + this.DoRenderPreview(true); + this.m_previewTex = this.m_previewUtility.EndPreview(); + m_requireRefresh = false; + } + if (this.m_previewTex != null) + GUI.DrawTexture(r, m_previewTex, ScaleMode.StretchToFill, false); + } + + DrawSkinToolbar(r); + NormalizedTimeBar(r); + //TODO: implement panning + // this.previewDir = Drag2D(this.previewDir, r); + MouseScroll(r); + } + + float m_orthoGoal = 1; + Vector3 m_posGoal = new Vector3(0, 0, -10); + double m_adjustFrameEndTime = 0; + + private void AdjustCameraGoals (bool calculateMixTime) { + if (calculateMixTime) { + if (m_skeletonAnimation.state.GetCurrent(0) != null) { + m_adjustFrameEndTime = EditorApplication.timeSinceStartup + m_skeletonAnimation.state.GetCurrent(0).Mix; + } + } + + GameObject go = this.m_previewInstance; + Bounds bounds = go.renderer.bounds; + m_orthoGoal = bounds.size.y; + m_posGoal = bounds.center + new Vector3(0, 0, -10); + } + + private void AdjustCameraGoals () { + AdjustCameraGoals(false); + } + + private void AdjustCamera () { + if (m_previewUtility == null) + return; + + + if (EditorApplication.timeSinceStartup < m_adjustFrameEndTime) { + AdjustCameraGoals(); + } + + float orthoSet = Mathf.Lerp(this.m_previewUtility.m_Camera.orthographicSize, m_orthoGoal, 0.1f); + + this.m_previewUtility.m_Camera.orthographicSize = orthoSet; + + + float dist = Vector3.Distance(m_previewUtility.m_Camera.transform.position, m_posGoal); + if (dist > m_skeletonDataAsset.scale) { + Vector3 pos = Vector3.Lerp(this.m_previewUtility.m_Camera.transform.position, m_posGoal, 0.1f); + pos.x = 0; + this.m_previewUtility.m_Camera.transform.position = pos; + this.m_previewUtility.m_Camera.transform.rotation = Quaternion.identity; + m_requireRefresh = true; + } + } + + private void DoRenderPreview (bool drawHandles) { + GameObject go = this.m_previewInstance; + + if (m_requireRefresh) { + go.renderer.enabled = true; + + if (EditorApplication.isPlaying) { + //do nothing + } else { + m_skeletonAnimation.Update((Time.realtimeSinceStartup - m_lastTime)); + } + + m_lastTime = Time.realtimeSinceStartup; + + if (!EditorApplication.isPlaying) + m_skeletonAnimation.LateUpdate(); + + if (drawHandles) { + Handles.SetCamera(m_previewUtility.m_Camera); + Handles.color = m_originColor; + + Handles.DrawLine(new Vector3(-1000 * m_skeletonDataAsset.scale, 0, 0), new Vector3(1000 * m_skeletonDataAsset.scale, 0, 0)); + Handles.DrawLine(new Vector3(0, 1000 * m_skeletonDataAsset.scale, 0), new Vector3(0, -1000 * m_skeletonDataAsset.scale, 0)); + } + + this.m_previewUtility.m_Camera.Render(); + go.renderer.enabled = false; + } + + + } + + void Update () { + AdjustCamera(); + + if (m_playing) { + m_requireRefresh = true; + Repaint(); + } else if (m_requireRefresh) { + Repaint(); + } else { + #if !UNITY_4_3 + if (m_showAnimationList.isAnimating) + Repaint(); + #endif + } + } + + void DrawSkinToolbar (Rect r) { + if (m_skeletonAnimation == null) + return; + + if (m_skeletonAnimation.skeleton != null) { + string label = (m_skeletonAnimation.skeleton != null && m_skeletonAnimation.skeleton.Skin != null) ? m_skeletonAnimation.skeleton.Skin.Name : "default"; + + Rect popRect = new Rect(r); + popRect.y += 32; + popRect.x += 4; + popRect.height = 24; + popRect.width = 40; + EditorGUI.DropShadowLabel(popRect, new GUIContent("Skin", SpineEditorUtilities.Icons.skinsRoot)); + + popRect.y += 11; + popRect.width = 150; + popRect.x += 44; + + if (GUI.Button(popRect, label, EditorStyles.popup)) { + SelectSkinContext(); + } + } + } + + void SelectSkinContext () { + GenericMenu menu = new GenericMenu(); + + foreach (Skin s in m_skeletonData.Skins) { + menu.AddItem(new GUIContent(s.Name), this.m_skeletonAnimation.skeleton.Skin == s, SetSkin, (object)s); + } + + menu.ShowAsContext(); + } + + void SetSkin (object o) { + Skin skin = (Skin)o; + + m_skeletonAnimation.initialSkinName = skin.Name; + m_skeletonAnimation.Reset(); + m_requireRefresh = true; + + EditorPrefs.SetString(m_skeletonDataAssetGUID + "_lastSkin", skin.Name); + } + + void NormalizedTimeBar (Rect r) { + Rect barRect = new Rect(r); + barRect.height = 32; + barRect.x += 4; + barRect.width -= 4; + + GUI.Box(barRect, ""); + + Rect lineRect = new Rect(barRect); + float width = lineRect.width; + TrackEntry t = m_skeletonAnimation.state.GetCurrent(0); + + if (t != null) { + int loopCount = (int)(t.Time / t.EndTime); + float currentTime = t.Time - (t.EndTime * loopCount); + + float normalizedTime = currentTime / t.Animation.Duration; + + lineRect.x = barRect.x + (width * normalizedTime) - 0.5f; + lineRect.width = 2; + + GUI.color = Color.red; + GUI.DrawTexture(lineRect, EditorGUIUtility.whiteTexture); + GUI.color = Color.white; + + for (int i = 0; i < m_animEvents.Count; i++) { + //TODO: Tooltip + //Spine.Event spev = animEvents[i]; + + float fr = m_animEventFrames[i]; + + Rect evRect = new Rect(barRect); + evRect.x = Mathf.Clamp(((fr / t.Animation.Duration) * width) - (SpineEditorUtilities.Icons._event.width / 2), barRect.x, float.MaxValue); + evRect.width = SpineEditorUtilities.Icons._event.width; + evRect.height = SpineEditorUtilities.Icons._event.height; + evRect.y += SpineEditorUtilities.Icons._event.height; + GUI.DrawTexture(evRect, SpineEditorUtilities.Icons._event); + + + //TODO: Tooltip + /* + UnityEngine.Event ev = UnityEngine.Event.current; + if(ev.isMouse){ + if(evRect.Contains(ev.mousePosition)){ + Rect tooltipRect = new Rect(evRect); + tooltipRect.width = 500; + tooltipRect.y -= 4; + tooltipRect.x += 4; + GUI.Label(tooltipRect, spev.Data.Name); + } + } + */ + } + } + } + + void MouseScroll (Rect position) { + UnityEngine.Event current = UnityEngine.Event.current; + int controlID = GUIUtility.GetControlID(sliderHash, FocusType.Passive); + + switch (current.GetTypeForControl(controlID)) { + case EventType.ScrollWheel: + if (position.Contains(current.mousePosition)) { + + m_orthoGoal += current.delta.y * ((SkeletonDataAsset)target).scale * 10; + GUIUtility.hotControl = controlID; + current.Use(); + } + break; + } + + } + + //TODO: Implement preview panning + /* + static Vector2 Drag2D(Vector2 scrollPosition, Rect position) + { + int controlID = GUIUtility.GetControlID(sliderHash, FocusType.Passive); + UnityEngine.Event current = UnityEngine.Event.current; + switch (current.GetTypeForControl(controlID)) + { + case EventType.MouseDown: + if (position.Contains(current.mousePosition) && (position.width > 50f)) + { + GUIUtility.hotControl = controlID; + current.Use(); + EditorGUIUtility.SetWantsMouseJumping(1); + } + return scrollPosition; + + case EventType.MouseUp: + if (GUIUtility.hotControl == controlID) + { + GUIUtility.hotControl = 0; + } + EditorGUIUtility.SetWantsMouseJumping(0); + return scrollPosition; + + case EventType.MouseMove: + return scrollPosition; + + case EventType.MouseDrag: + if (GUIUtility.hotControl == controlID) + { + scrollPosition -= (Vector2) (((current.delta * (!current.shift ? ((float) 1) : ((float) 3))) / Mathf.Min(position.width, position.height)) * 140f); + scrollPosition.y = Mathf.Clamp(scrollPosition.y, -90f, 90f); + current.Use(); + GUI.changed = true; + } + return scrollPosition; + } + return scrollPosition; + } + */ + + public override GUIContent GetPreviewTitle () { + return new GUIContent("Preview"); + } + + public override void OnPreviewSettings () { + if (!m_initialized) { + GUILayout.HorizontalSlider(0, 0, 2, GUILayout.MaxWidth(64)); + } else { + float speed = GUILayout.HorizontalSlider(m_skeletonAnimation.timeScale, 0, 2, GUILayout.MaxWidth(64)); + + //snap to nearest 0.25 + float y = speed / 0.25f; + int q = Mathf.RoundToInt(y); + speed = q * 0.25f; + + m_skeletonAnimation.timeScale = speed; + } + } + + //TODO: Fix first-import error + //TODO: Update preview without thumbnail + public override Texture2D RenderStaticPreview (string assetPath, UnityEngine.Object[] subAssets, int width, int height) { + Texture2D tex = new Texture2D(width, height, TextureFormat.ARGB32, false); + + this.InitPreview(); + + if (this.m_previewUtility.m_Camera == null) + return null; + + m_requireRefresh = true; + this.DoRenderPreview(false); + AdjustCameraGoals(false); + + this.m_previewUtility.m_Camera.orthographicSize = m_orthoGoal / 2; + this.m_previewUtility.m_Camera.transform.position = m_posGoal; + this.m_previewUtility.BeginStaticPreview(new Rect(0, 0, width, height)); + this.DoRenderPreview(false); + + //TODO: Figure out why this is throwing errors on first attempt + // if(m_previewUtility != null){ + // Handles.SetCamera(this.m_previewUtility.m_Camera); + // Handles.BeginGUI(); + // GUI.DrawTexture(new Rect(40,60,width,height), SpineEditorUtilities.Icons.spine, ScaleMode.StretchToFill); + // Handles.EndGUI(); + // } + tex = this.m_previewUtility.EndStaticPreview(); + return tex; + } +} \ No newline at end of file diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonDataAssetInspector.cs.meta b/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonDataAssetInspector.cs.meta index e7eaac24c..fba64b6e3 100644 --- a/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonDataAssetInspector.cs.meta +++ b/spine-tk2d/Assets/spine-tk2d/Editor/SkeletonDataAssetInspector.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cffb121e3cd80644d84c585b9c7448e8 +guid: 01cbef8f24d105f4bafa9668d669e040 MonoImporter: serializedVersion: 2 defaultReferences: [] diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/SpineEditorUtilities.cs b/spine-tk2d/Assets/spine-tk2d/Editor/SpineEditorUtilities.cs new file mode 100644 index 000000000..7bb412ce6 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Editor/SpineEditorUtilities.cs @@ -0,0 +1,268 @@ +#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; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Spine; + +[InitializeOnLoad] +public class SpineEditorUtilities : AssetPostprocessor { + + public static class Icons { + 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; + public static Texture2D image; + public static Texture2D boundingBox; + public static Texture2D mesh; + public static Texture2D skin; + public static Texture2D skinsRoot; + public static Texture2D animation; + 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 { + if (_boneMesh == null) { + _boneMesh = new Mesh(); + _boneMesh.vertices = new Vector3[4] { + Vector3.zero, + new Vector3(-0.1f, 0.1f, 0), + Vector3.up, + new Vector3(0.1f, 0.1f, 0) + }; + _boneMesh.uv = new Vector2[4]; + _boneMesh.triangles = new int[6]{0,1,2,2,3,0}; + _boneMesh.RecalculateBounds(); + _boneMesh.RecalculateNormals(); + } + + return _boneMesh; + } + } + + internal static Mesh _boneMesh; + + public static Material boneMaterial { + get { + if (_boneMaterial == null) { +#if UNITY_4_3 + _boneMaterial = new Material(Shader.Find("Particles/Alpha Blended")); + _boneMaterial.SetColor("_TintColor", new Color(0.4f, 0.4f, 0.4f, 0.25f)); +#else + _boneMaterial = new Material(Shader.Find("Spine/Bones")); + _boneMaterial.SetColor("_Color", new Color(0.4f, 0.4f, 0.4f, 0.25f)); +#endif + + } + + return _boneMaterial; + } + } + + internal static Material _boneMaterial; + + public static void Initialize () { + 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"); + image = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-image.png"); + boundingBox = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-boundingBox.png"); + mesh = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-mesh.png"); + skin = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-skinPlaceholder.png"); + skinsRoot = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-skinsRoot.png"); + animation = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-animation.png"); + 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"); + } + } + + public static string editorPath = ""; + public static string editorGUIPath = ""; + static Dictionary skeletonRendererTable; + static Dictionary skeletonUtilityBoneTable; + public static float defaultScale = 0.01f; + public static float defaultMix = 0.2f; + public static string defaultShader = "Spine/Skeleton"; + + static SpineEditorUtilities () { + DirectoryInfo rootDir = new DirectoryInfo(Application.dataPath); + FileInfo[] files = rootDir.GetFiles("SpineEditorUtilities.cs", SearchOption.AllDirectories); + editorPath = Path.GetDirectoryName(files[0].FullName.Replace("\\", "/").Replace(Application.dataPath, "Assets")); + editorGUIPath = editorPath + "/GUI"; + + Icons.Initialize(); + + skeletonRendererTable = new Dictionary(); + skeletonUtilityBoneTable = new Dictionary(); + + EditorApplication.hierarchyWindowChanged += HierarchyWindowChanged; + EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI; + + HierarchyWindowChanged(); + } + + static void HierarchyWindowChanged () { + skeletonRendererTable.Clear(); + skeletonUtilityBoneTable.Clear(); + + SkeletonRenderer[] arr = Object.FindObjectsOfType(); + + foreach (SkeletonRenderer r in arr) + 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 (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 -= 26; + + if (skeletonUtilityBoneTable[instanceId] != null) { + if (skeletonUtilityBoneTable[instanceId].transform.childCount == 0) + r.x += 13; + + r.y += 2; + + r.width = 13; + r.height = 13; + + if (skeletonUtilityBoneTable[instanceId].mode == SkeletonUtilityBone.Mode.Follow) { + GUI.DrawTexture(r, Icons.bone); + } else { + GUI.DrawTexture(r, Icons.poseBones); + } + } + + } + + } + + [MenuItem("Assets/Spine/Spawn")] + static void SpawnAnimatedSkeleton () { + Object[] arr = Selection.objects; + foreach (Object o in arr) { + string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(o)); + string skinName = EditorPrefs.GetString(guid + "_lastSkin", ""); + + SpawnAnimatedSkeleton((SkeletonDataAsset)o, skinName); + SceneView.RepaintAll(); + } + } + + [MenuItem("Assets/Spine/Spawn", true)] + static bool ValidateSpawnAnimatedSkeleton () { + Object[] arr = Selection.objects; + + if (arr.Length == 0) + return false; + + foreach (Object o in arr) { + if (o.GetType() != typeof(SkeletonDataAsset)) + return false; + } + + return true; + } + + public static SkeletonAnimation SpawnAnimatedSkeleton (SkeletonDataAsset skeletonDataAsset, string skinName) { + return SpawnAnimatedSkeleton(skeletonDataAsset, skeletonDataAsset.GetSkeletonData(true).FindSkin(skinName)); + } + + public static SkeletonAnimation SpawnAnimatedSkeleton (SkeletonDataAsset skeletonDataAsset, Skin skin = null) { + GameObject go = new GameObject(skeletonDataAsset.name.Replace("_SkeletonData", ""), typeof(MeshFilter), typeof(MeshRenderer), typeof(SkeletonAnimation)); + SkeletonAnimation anim = go.GetComponent(); + anim.skeletonDataAsset = skeletonDataAsset; + + + + SkeletonData data = skeletonDataAsset.GetSkeletonData(true); + + if (data == null) { + return null; + } + + if (skin == null) + skin = data.DefaultSkin; + + if (skin == null) + skin = data.Skins[0]; + + anim.Reset(); + + anim.skeleton.SetSkin(skin); + anim.initialSkinName = skin.Name; + + anim.skeleton.Update(1); + anim.state.Update(1); + anim.state.Apply(anim.skeleton); + anim.skeleton.UpdateWorldTransform(); + + return anim; + } +} diff --git a/spine-tk2d/Assets/spine-tk2d/Editor/SpineEditorUtilities.cs.meta b/spine-tk2d/Assets/spine-tk2d/Editor/SpineEditorUtilities.cs.meta new file mode 100644 index 000000000..544e47769 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Editor/SpineEditorUtilities.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f834d5cd806ec4645915ac315edbdc60 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-tk2d/Assets/spine-tk2d/Shaders/Bones.shader b/spine-tk2d/Assets/spine-tk2d/Shaders/Bones.shader new file mode 100644 index 000000000..61fc977e5 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Shaders/Bones.shader.meta b/spine-tk2d/Assets/spine-tk2d/Shaders/Bones.shader.meta new file mode 100644 index 000000000..d01814ef9 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Shaders/Bones.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 66988de88a15abd4e8846c6805485f57 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.mat b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.mat.meta b/spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.mat.meta new file mode 100644 index 000000000..ef267ef07 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.mat.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 43227e5adadc6f24bb4bf74b92a56fb4 +NativeFormatImporter: + userData: diff --git a/spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.shader b/spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.shader new file mode 100644 index 000000000..3a0de6756 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.shader.meta b/spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.shader.meta new file mode 100644 index 000000000..bcc031d30 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/Shaders/HiddenPass.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 913475501bf19374c84390868a9d6d3d +ShaderImporter: + defaultTextures: [] + userData: diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonAnimation.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonAnimation.cs index 8810a5383..0c4c9a44f 100644 --- a/spine-tk2d/Assets/spine-tk2d/SkeletonAnimation.cs +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonAnimation.cs @@ -41,18 +41,23 @@ public class SkeletonAnimation : SkeletonRenderer { public bool loop; public Spine.AnimationState state; - public delegate void UpdateBonesDelegate(SkeletonAnimation skeleton); - public UpdateBonesDelegate UpdateBones; + public delegate void UpdateBonesDelegate (SkeletonAnimation skeleton); + public UpdateBonesDelegate UpdateLocal; + public UpdateBonesDelegate UpdateWorld; + public UpdateBonesDelegate UpdateComplete; [SerializeField] - private String _animationName; + private String + _animationName; + public String AnimationName { get { TrackEntry entry = state.GetCurrent(0); return entry == null ? null : entry.Animation.Name; } set { - if (_animationName == value) return; + if (_animationName == value) + return; _animationName = value; if (value == null || value.Length == 0) state.ClearTrack(0); @@ -63,7 +68,8 @@ public class SkeletonAnimation : SkeletonRenderer { public override void Reset () { base.Reset(); - if (!valid) return; + if (!valid) + return; state = new Spine.AnimationState(skeletonDataAsset.GetAnimationStateData()); if (_animationName != null && _animationName.Length > 0) { @@ -77,13 +83,26 @@ public class SkeletonAnimation : SkeletonRenderer { } public virtual void Update (float deltaTime) { - if (!valid) return; + if (!valid) + return; deltaTime *= timeScale; 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-tk2d/Assets/spine-tk2d/SkeletonDataAsset.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonDataAsset.cs index 9323a2d31..3e760787e 100644 --- a/spine-tk2d/Assets/spine-tk2d/SkeletonDataAsset.cs +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonDataAsset.cs @@ -53,14 +53,14 @@ public class SkeletonDataAsset : ScriptableObject { public SkeletonData GetSkeletonData (bool quiet) { if (spriteCollection == null) { if (!quiet) - Debug.LogError("Sprite collection not set for skeleton data asset: " + name, this); + Debug.LogError("SpriteCollection not set for SkeletonData asset: " + name, this); Reset(); return null; } - + if (skeletonJSON == null) { if (!quiet) - Debug.LogError("Skeleton JSON file not set for skeleton data asset: " + name, this); + Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); Reset(); return null; } @@ -81,7 +81,8 @@ public class SkeletonDataAsset : ScriptableObject { stateData = new AnimationStateData(skeletonData); stateData.DefaultMix = defaultMix; for (int i = 0, n = fromAnimation.Length; i < n; i++) { - if (fromAnimation[i].Length == 0 || toAnimation[i].Length == 0) continue; + if (fromAnimation[i].Length == 0 || toAnimation[i].Length == 0) + continue; stateData.SetMix(fromAnimation[i], toAnimation[i], duration[i]); } diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonExtensions.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonExtensions.cs new file mode 100644 index 000000000..a483e47e6 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonExtensions.cs @@ -0,0 +1,108 @@ +/****************************************************************************** + * 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; + +public static class SkeletonExtensions { + + public static void SetColor (this Slot slot, Color color) { + slot.A = color.a; + slot.R = color.r; + slot.G = color.g; + slot.B = color.b; + } + + public static void SetColor (this Slot slot, Color32 color) { + slot.A = color.a / 255f; + slot.R = color.r / 255f; + slot.G = color.g / 255f; + slot.B = color.b / 255f; + } + + public static void SetColor (this RegionAttachment attachment, Color color) { + attachment.A = color.a; + attachment.R = color.r; + attachment.G = color.g; + attachment.B = color.b; + } + + public static void SetColor (this RegionAttachment attachment, Color32 color) { + attachment.A = color.a / 255f; + attachment.R = color.r / 255f; + attachment.G = color.g / 255f; + attachment.B = color.b / 255f; + } + + public static void SetColor (this MeshAttachment attachment, Color color) { + attachment.A = color.a; + attachment.R = color.r; + attachment.G = color.g; + attachment.B = color.b; + } + + public static void SetColor (this MeshAttachment attachment, Color32 color) { + attachment.A = color.a / 255f; + attachment.R = color.r / 255f; + attachment.G = color.g / 255f; + attachment.B = color.b / 255f; + } + + public static void SetColor (this SkinnedMeshAttachment attachment, Color color) { + attachment.A = color.a; + attachment.R = color.r; + attachment.G = color.g; + attachment.B = color.b; + } + + public static void SetColor (this SkinnedMeshAttachment attachment, Color32 color) { + attachment.A = color.a / 255f; + attachment.R = color.r / 255f; + attachment.G = color.g / 255f; + attachment.B = color.b / 255f; + } + + public static void SetPosition (this Bone bone, Vector2 position) { + bone.X = position.x; + bone.Y = position.y; + } + + public static void SetPosition (this Bone bone, Vector3 position) { + bone.X = position.x; + bone.Y = position.y; + } + +} diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonExtensions.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonExtensions.cs.meta new file mode 100644 index 000000000..427cdd10a --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonExtensions.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea85c8f6a91a6ab45881b0dbdaabb7d0 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonRenderer.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonRenderer.cs index 355ac0e46..5f4da3adb 100644 --- a/spine-tk2d/Assets/spine-tk2d/SkeletonRenderer.cs +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonRenderer.cs @@ -37,17 +37,20 @@ 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] public Skeleton skeleton; - public SkeletonDataAsset skeletonDataAsset; public String initialSkinName; public bool calculateNormals, calculateTangents; public float zSpacing; public bool renderMeshes = true, immutableTriangles; - + public bool logErrors = false; private MeshFilter meshFilter; private Mesh mesh, mesh1, mesh2; private bool useMesh1; @@ -61,9 +64,12 @@ public class SkeletonRenderer : MonoBehaviour { private readonly List submeshes = new List(); public virtual void Reset () { - if (meshFilter != null) meshFilter.sharedMesh = null; - if (mesh != null) DestroyImmediate(mesh); - if (renderer != null) renderer.sharedMaterial = null; + if (meshFilter != null) + meshFilter.sharedMesh = null; + if (mesh != null) + DestroyImmediate(mesh); + if (renderer != null) + renderer.sharedMaterial = null; mesh = null; mesh1 = null; mesh2 = null; @@ -78,11 +84,14 @@ public class SkeletonRenderer : MonoBehaviour { valid = false; if (!skeletonDataAsset) { - Debug.LogError("Missing SkeletonData asset.", this); + if (logErrors) + Debug.LogError("Missing SkeletonData asset.", this); + return; } SkeletonData skeletonData = skeletonDataAsset.GetSkeletonData(false); - if (skeletonData == null) return; + if (skeletonData == null) + return; valid = true; meshFilter = GetComponent(); @@ -93,6 +102,8 @@ 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 () { @@ -108,8 +119,8 @@ public class SkeletonRenderer : MonoBehaviour { } public virtual void LateUpdate () { - if (!valid) return; - + if (!valid) + return; // Count vertices and submesh triangles. int vertexCount = 0; int submeshTriangleCount = 0, submeshFirstVertex = 0, submeshStartSlotIndex = 0; @@ -119,7 +130,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; @@ -129,24 +141,25 @@ public class SkeletonRenderer : MonoBehaviour { attachmentVertexCount = 4; attachmentTriangleCount = 6; } else { - if (!renderMeshes) continue; + if (!renderMeshes) + continue; if (attachment is MeshAttachment) { MeshAttachment meshAttachment = (MeshAttachment)attachment; rendererObject = meshAttachment.RendererObject; attachmentVertexCount = meshAttachment.vertices.Length >> 1; attachmentTriangleCount = meshAttachment.triangles.Length; } else if (attachment is SkinnedMeshAttachment) { - SkinnedMeshAttachment meshAttachment = (SkinnedMeshAttachment)attachment; - rendererObject = meshAttachment.RendererObject; - attachmentVertexCount = meshAttachment.uvs.Length >> 1; - attachmentTriangleCount = meshAttachment.triangles.Length; - } else - continue; + SkinnedMeshAttachment meshAttachment = (SkinnedMeshAttachment)attachment; + rendererObject = meshAttachment.RendererObject; + attachmentVertexCount = meshAttachment.uvs.Length >> 1; + attachmentTriangleCount = meshAttachment.triangles.Length; + } else + continue; } // Populate submesh when material changes. Material material = (Material)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; @@ -209,7 +222,8 @@ public class SkeletonRenderer : MonoBehaviour { color.r = (byte)(r * slot.r * regionAttachment.r * color.a); color.g = (byte)(g * slot.g * regionAttachment.g * color.a); color.b = (byte)(b * slot.b * regionAttachment.b * color.a); - if (slot.data.additiveBlending) color.a = 0; + if (slot.data.additiveBlending) + color.a = 0; colors[vertexIndex] = color; colors[vertexIndex + 1] = color; colors[vertexIndex + 2] = color; @@ -223,18 +237,21 @@ public class SkeletonRenderer : MonoBehaviour { vertexIndex += 4; } else { - if (!renderMeshes) continue; + if (!renderMeshes) + continue; if (attachment is MeshAttachment) { MeshAttachment meshAttachment = (MeshAttachment)attachment; int meshVertexCount = meshAttachment.vertices.Length; - if (tempVertices.Length < meshVertexCount) tempVertices = new float[meshVertexCount]; + if (tempVertices.Length < meshVertexCount) + tempVertices = new float[meshVertexCount]; meshAttachment.ComputeWorldVertices(slot, tempVertices); color.a = (byte)(a * slot.a * meshAttachment.a); color.r = (byte)(r * slot.r * meshAttachment.r * color.a); color.g = (byte)(g * slot.g * meshAttachment.g * color.a); color.b = (byte)(b * slot.b * meshAttachment.b * color.a); - if (slot.data.additiveBlending) color.a = 0; + if (slot.data.additiveBlending) + color.a = 0; float[] meshUVs = meshAttachment.uvs; float z = i * zSpacing; @@ -244,25 +261,27 @@ public class SkeletonRenderer : MonoBehaviour { uvs[vertexIndex] = new Vector2(meshUVs[ii], meshUVs[ii + 1]); } } else if (attachment is SkinnedMeshAttachment) { - SkinnedMeshAttachment meshAttachment = (SkinnedMeshAttachment)attachment; - int meshVertexCount = meshAttachment.uvs.Length; - if (tempVertices.Length < meshVertexCount) tempVertices = new float[meshVertexCount]; - meshAttachment.ComputeWorldVertices(slot, tempVertices); + SkinnedMeshAttachment meshAttachment = (SkinnedMeshAttachment)attachment; + int meshVertexCount = meshAttachment.uvs.Length; + if (tempVertices.Length < meshVertexCount) + tempVertices = new float[meshVertexCount]; + meshAttachment.ComputeWorldVertices(slot, tempVertices); - color.a = (byte)(a * slot.a * meshAttachment.a); - color.r = (byte)(r * slot.r * meshAttachment.r * color.a); - color.g = (byte)(g * slot.g * meshAttachment.g * color.a); - color.b = (byte)(b * slot.b * meshAttachment.b * color.a); - if (slot.data.additiveBlending) color.a = 0; + color.a = (byte)(a * slot.a * meshAttachment.a); + color.r = (byte)(r * slot.r * meshAttachment.r * color.a); + color.g = (byte)(g * slot.g * meshAttachment.g * color.a); + color.b = (byte)(b * slot.b * meshAttachment.b * color.a); + if (slot.data.additiveBlending) + color.a = 0; - float[] meshUVs = meshAttachment.uvs; - float z = i * zSpacing; - for (int ii = 0; ii < meshVertexCount; ii += 2, vertexIndex++) { - vertices[vertexIndex] = new Vector3(tempVertices[ii], tempVertices[ii + 1], z); - colors[vertexIndex] = color; - uvs[vertexIndex] = new Vector2(meshUVs[ii], meshUVs[ii + 1]); + float[] meshUVs = meshAttachment.uvs; + float z = i * zSpacing; + for (int ii = 0; ii < meshVertexCount; ii += 2, vertexIndex++) { + vertices[vertexIndex] = new Vector3(tempVertices[ii], tempVertices[ii + 1], z); + colors[vertexIndex] = color; + uvs[vertexIndex] = new Vector2(meshUVs[ii], meshUVs[ii + 1]); + } } - } } } @@ -310,7 +329,7 @@ public class SkeletonRenderer : MonoBehaviour { if (submeshes.Count <= submeshIndex) submeshes.Add(new Submesh()); else if (immutableTriangles) - return; + return; Submesh submesh = submeshes[submeshIndex]; @@ -322,10 +341,10 @@ public class SkeletonRenderer : MonoBehaviour { triangles[i] = 0; submesh.triangleCount = triangleCount; } else if (trianglesCapacity != triangleCount) { - // Reallocate triangles when not the exact size needed. - submesh.triangles = triangles = new int[triangleCount]; - submesh.triangleCount = 0; - } + // Reallocate triangles when not the exact size needed. + submesh.triangles = triangles = new int[triangleCount]; + submesh.triangleCount = 0; + } if (!renderMeshes) { // Use stored triangles if possible. @@ -366,18 +385,18 @@ public class SkeletonRenderer : MonoBehaviour { attachmentVertexCount = meshAttachment.vertices.Length >> 1; attachmentTriangles = meshAttachment.triangles; } else if (attachment is SkinnedMeshAttachment) { - SkinnedMeshAttachment meshAttachment = (SkinnedMeshAttachment)attachment; - attachmentVertexCount = meshAttachment.uvs.Length >> 1; - attachmentTriangles = meshAttachment.triangles; - } else - continue; + SkinnedMeshAttachment meshAttachment = (SkinnedMeshAttachment)attachment; + attachmentVertexCount = meshAttachment.uvs.Length >> 1; + attachmentTriangles = meshAttachment.triangles; + } else + continue; for (int ii = 0, nn = attachmentTriangles.Length; ii < nn; ii++, triangleIndex++) triangles[triangleIndex] = firstVertex + attachmentTriangles[ii]; firstVertex += attachmentVertexCount; } } - #if UNITY_EDITOR +#if UNITY_EDITOR void OnDrawGizmos() { // Make selection easier by drawing a clear gizmo over the skeleton. if (vertices == null) return; @@ -397,7 +416,7 @@ public class SkeletonRenderer : MonoBehaviour { Gizmos.matrix = transform.localToWorldMatrix; Gizmos.DrawCube(gizmosCenter, gizmosSize); } - #endif +#endif } class Submesh { diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonUtility.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility.meta new file mode 100644 index 000000000..d690c94de --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: f6e0caaafe294de48af468a6a9321473 +folderAsset: yes +DefaultImporter: + userData: diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor.meta new file mode 100644 index 000000000..386e1e90b --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: a751a9d1e3e26d64d997b66a781df8e9 +folderAsset: yes +DefaultImporter: + userData: diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs new file mode 100644 index 000000000..a6950aa84 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs @@ -0,0 +1,304 @@ +/****************************************************************************** + * 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, flip, flipX; + + //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"); + flip = this.serializedObject.FindProperty("flip"); + flipX = this.serializedObject.FindProperty("flipX"); + + EvaluateFlags(); + + if (utilityBone.valid == false && skeletonUtility != null && skeletonUtility.skeletonRenderer != null) { + skeletonUtility.skeletonRenderer.Reset(); + } + + canCreateHingeChain = CanCreateHingeChain(); + } + + 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); + EditorGUILayout.PropertyField(flip); + + EditorGUI.BeginDisabledGroup(containsFollows); + { + EditorGUILayout.PropertyField(overrideAlpha); + EditorGUILayout.PropertyField(parentReference); + + EditorGUI.BeginDisabledGroup(multiObject || !flip.boolValue); + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(flipX); + if (EditorGUI.EndChangeCheck()) { + FlipX(flipX.boolValue); + } + } + EditorGUI.EndDisabledGroup(); + + } + 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 FlipX (bool state) { + utilityBone.FlipX(state); + if (Application.isPlaying == false) { + skeletonUtility.skeletonAnimation.LateUpdate(); + } + } + + 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-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta new file mode 100644 index 000000000..340d6e2eb --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityInspector.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityInspector.cs new file mode 100644 index 000000000..4c6d02d09 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityInspector.cs @@ -0,0 +1,311 @@ +/****************************************************************************** + * 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-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta new file mode 100644 index 000000000..7820cbd6d --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtility.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtility.cs new file mode 100644 index 000000000..c274c3db6 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtility.cs @@ -0,0 +1,346 @@ +/****************************************************************************** + * 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 static T GetInParent (Transform origin) where T : Component { +#if UNITY_4_3 + Transform parent = origin.parent; + while(parent.GetComponent() == null){ + parent = parent.parent; + if(parent == null) + return default(T); + } + + return parent.GetComponent(); +#else + return origin.GetComponentInParent(); +#endif + } + + + 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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtility.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtility.cs.meta new file mode 100644 index 000000000..7d3d7a44f --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityBone.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityBone.cs new file mode 100644 index 000000000..99c561499 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityBone.cs @@ -0,0 +1,293 @@ +/****************************************************************************** + * 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; + public bool flip; + public bool flipX; + [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 = SkeletonUtility.GetInParent(transform); + + 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 skeletonFlipRotation = (skeleton.flipX ^ skeleton.flipY) ? -1f : 1f; + + float flipCompensation = 0; + if (flip && (flipX || (flipX != bone.flipX)) && bone.parent != null) { + flipCompensation = bone.parent.WorldRotation * -2; + } + + if (mode == Mode.Follow) { + if (flip) { + flipX = bone.flipX; + } + + + if (position) { + cachedTransform.localPosition = new Vector3(bone.x, bone.y, 0); + } + + if (rotation) { + + if (bone.Data.InheritRotation) { + if (bone.FlipX) { + cachedTransform.localRotation = Quaternion.Euler(0, 180, bone.rotationIK - flipCompensation); + } else { + 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 * skeletonFlipRotation)); + } + + } + + 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) { + float angle = Mathf.LerpAngle(bone.Rotation, cachedTransform.localRotation.eulerAngles.z, overrideAlpha) + flipCompensation; + + if (flip) { + if ((!flipX && bone.flipX)) { + angle -= flipCompensation; + } + + //TODO fix this... + if (angle >= 360) + angle -= 360; + else if (angle <= -360) + angle += 360; + } + + bone.Rotation = angle; + } + + 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); + } + + if (flip) { + bone.flipX = flipX; + } + } else { + + if (transformLerpComplete) + return; + + 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) { + float angle = Mathf.LerpAngle(bone.Rotation, Quaternion.LookRotation(flipX ? Vector3.forward * -1 : Vector3.forward, parentReference.InverseTransformDirection(cachedTransform.up)).eulerAngles.z, overrideAlpha) + flipCompensation; + + if (flip) { + if ((!flipX && bone.flipX)) { + angle -= flipCompensation; + } + + //TODO fix this... + if (angle >= 360) + angle -= 360; + else if (angle <= -360) + angle += 360; + } + + bone.Rotation = angle; + } + + //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); + } + + if (flip) { + bone.flipX = flipX; + } + + } + + transformLerpComplete = true; + } + } + + public void FlipX (bool state) { + if (state != flipX) { + flipX = state; + if (flipX && Mathf.Abs(transform.localRotation.eulerAngles.y) > 90) { + skeletonUtility.skeletonAnimation.LateUpdate(); + return; + } else if (!flipX && Mathf.Abs(transform.localRotation.eulerAngles.y) < 90) { + skeletonUtility.skeletonAnimation.LateUpdate(); + return; + } + } + + bone.FlipX = state; + transform.RotateAround(transform.position, skeletonUtility.transform.up, 180); + Vector3 euler = transform.localRotation.eulerAngles; + euler.x = 0; + euler.y = bone.FlipX ? 180 : 0; + transform.localRotation = Quaternion.Euler(euler); + } + + 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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityBone.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityBone.cs.meta new file mode 100644 index 000000000..f66d45053 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityConstraint.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityConstraint.cs new file mode 100644 index 000000000..3be62228c --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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 = SkeletonUtility.GetInParent(transform); + skeletonUtility.RegisterConstraint(this); + } + + protected virtual void OnDisable () { + skeletonUtility.UnregisterConstraint(this); + } + + public abstract void DoUpdate (); +} diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityConstraint.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityConstraint.cs.meta new file mode 100644 index 000000000..dad11e0a2 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityEyeConstraint.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityEyeConstraint.cs new file mode 100644 index 000000000..6aefded5a --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityEyeConstraint.cs @@ -0,0 +1,56 @@ +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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityEyeConstraint.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityEyeConstraint.cs.meta new file mode 100644 index 000000000..3e82746da --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityGroundConstraint.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityGroundConstraint.cs new file mode 100644 index 000000000..b9608e9bc --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityGroundConstraint.cs @@ -0,0 +1,120 @@ +using UnityEngine; +using System.Collections; + +[RequireComponent(typeof(SkeletonUtilityBone)), ExecuteInEditMode] +public class SkeletonUtilityGroundConstraint : SkeletonUtilityConstraint { + +#if UNITY_4_3 + public LayerMask groundMask; + public bool use2D = false; + public bool useRadius = false; + public float castRadius = 0.1f; + public float castDistance = 5f; + public float castOffset = 0; + public float groundOffset = 0; + public float adjustSpeed = 5; +#else + [Tooltip("LayerMask for what objects to raycast against")] + public LayerMask groundMask; + [Tooltip("The 2D")] + public bool use2D = false; + [Tooltip("Uses SphereCast for 3D mode and CircleCast for 2D mode")] + public bool useRadius = false; + [Tooltip("The Radius")] + public float castRadius = 0.1f; + [Tooltip("How high above the target bone to begin casting from")] + public float castDistance = 5f; + [Tooltip("X-Axis adjustment")] + public float castOffset = 0; + [Tooltip("Y-Axis adjustment")] + public float groundOffset = 0; + [Tooltip("How fast the target IK position adjusts to the ground. Use smaller values to prevent snapping")] + public float adjustSpeed = 5; +#endif + + + Vector3 rayOrigin; + Vector3 rayDir = new Vector3(0, -1, 0); + float hitY; + float lastHitY; + + protected override void OnEnable () { + base.OnEnable(); + } + + protected override void OnDisable () { + base.OnDisable(); + } + + public override void DoUpdate () { + rayOrigin = transform.position + new Vector3(castOffset, castDistance, 0); + + hitY = float.MinValue; + if (use2D) { + RaycastHit2D hit; + + if (useRadius) { +#if UNITY_4_3 + //NOTE: Unity 4.3.x does not have CircleCast + hit = Physics2D.Raycast(rayOrigin , rayDir, castDistance + groundOffset, groundMask); +#else + hit = Physics2D.CircleCast(rayOrigin, castRadius, rayDir, castDistance + groundOffset, groundMask); +#endif + } else { + hit = Physics2D.Raycast(rayOrigin, rayDir, castDistance + groundOffset, groundMask); + } + + if (hit.collider != null) { + hitY = hit.point.y + groundOffset; + if (Application.isPlaying) { + hitY = Mathf.MoveTowards(lastHitY, hitY, adjustSpeed * Time.deltaTime); + } + } else { + if (Application.isPlaying) + hitY = Mathf.MoveTowards(lastHitY, transform.position.y, adjustSpeed * Time.deltaTime); + } + } else { + RaycastHit hit; + bool validHit = false; + + if (useRadius) { + validHit = Physics.SphereCast(rayOrigin, castRadius, rayDir, out hit, castDistance + groundOffset, groundMask); + } else { + validHit = Physics.Raycast(rayOrigin, rayDir, out hit, castDistance + groundOffset, groundMask); + } + + if (validHit) { + hitY = hit.point.y + groundOffset; + if (Application.isPlaying) { + hitY = Mathf.MoveTowards(lastHitY, hitY, adjustSpeed * Time.deltaTime); + } + } else { + if (Application.isPlaying) + hitY = Mathf.MoveTowards(lastHitY, transform.position.y, adjustSpeed * Time.deltaTime); + } + } + + Vector3 v = transform.position; + v.y = Mathf.Clamp(v.y, Mathf.Min(lastHitY, hitY), float.MaxValue); + transform.position = v; + + utilBone.bone.X = transform.localPosition.x; + utilBone.bone.Y = transform.localPosition.y; + + lastHitY = hitY; + } + + void OnDrawGizmos () { + Vector3 hitEnd = rayOrigin + (rayDir * Mathf.Min(castDistance, rayOrigin.y - hitY)); + Vector3 clearEnd = rayOrigin + (rayDir * castDistance); + Gizmos.DrawLine(rayOrigin, hitEnd); + + if (useRadius) { + Gizmos.DrawLine(new Vector3(hitEnd.x - castRadius, hitEnd.y - groundOffset, hitEnd.z), new Vector3(hitEnd.x + castRadius, hitEnd.y - groundOffset, hitEnd.z)); + Gizmos.DrawLine(new Vector3(clearEnd.x - castRadius, clearEnd.y, clearEnd.z), new Vector3(clearEnd.x + castRadius, clearEnd.y, clearEnd.z)); + } + + Gizmos.color = Color.red; + Gizmos.DrawLine(hitEnd, clearEnd); + } +} diff --git a/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityGroundConstraint.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityGroundConstraint.cs.meta new file mode 100644 index 000000000..5d9e6920c --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityKinematicShadow.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityKinematicShadow.cs new file mode 100644 index 000000000..c088353f2 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityKinematicShadow.cs @@ -0,0 +1,79 @@ +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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityKinematicShadow.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilityKinematicShadow.cs.meta new file mode 100644 index 000000000..06bcb6f4a --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs new file mode 100644 index 000000000..fc8867e6b --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs @@ -0,0 +1,96 @@ +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-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs.meta b/spine-tk2d/Assets/spine-tk2d/SkeletonUtility/SkeletonUtilitySubmeshRenderer.cs.meta new file mode 100644 index 000000000..168ca8811 --- /dev/null +++ b/spine-tk2d/Assets/spine-tk2d/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: From 315c4e8c0cb65e05460ac53e795472c907937f82 Mon Sep 17 00:00:00 2001 From: Fenrisul Date: Mon, 6 Oct 2014 16:19:52 -0700 Subject: [PATCH 2/2] [Unity TK2D] goblin script fix --- spine-tk2d/Assets/examples/goblins/Goblins.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spine-tk2d/Assets/examples/goblins/Goblins.cs b/spine-tk2d/Assets/examples/goblins/Goblins.cs index c30e677b0..bf3a78079 100644 --- a/spine-tk2d/Assets/examples/goblins/Goblins.cs +++ b/spine-tk2d/Assets/examples/goblins/Goblins.cs @@ -40,11 +40,11 @@ public class Goblins : MonoBehaviour { public void Start () { skeletonAnimation = GetComponent(); headBone = skeletonAnimation.skeleton.FindBone("head"); - skeletonAnimation.UpdateBones += UpdateBones; + skeletonAnimation.UpdateLocal += UpdateLocal; } // This is called after the animation is applied to the skeleton and can be used to adjust the bones dynamically. - public void UpdateBones (SkeletonAnimation skeletonAnimation) { + public void UpdateLocal (SkeletonAnimation skeletonAnimation) { headBone.Rotation += 15; }