From a6d9915c95b3f0c0db050b603fa3d5fd868f1346 Mon Sep 17 00:00:00 2001 From: pharan Date: Tue, 13 Dec 2016 03:59:33 +0800 Subject: [PATCH] [unity] Updated editors. (undo, sceneview, context menus) --- .../Editor/BoneFollowerInspector.cs | 45 +++++++++++++++++ .../Editor/SpineEditorUtilities.cs | 49 +++++++++++++++---- .../Editor/BoundingBoxFollowerInspector.cs | 6 ++- .../SkeletonRenderSeparatorInspector.cs | 4 +- .../Editor/SkeletonUtilityBoneInspector.cs | 1 - 5 files changed, 91 insertions(+), 14 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs index e0b24a344..56a44c072 100644 --- a/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs +++ b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs @@ -51,6 +51,51 @@ namespace Spine.Unity.Editor { targetBoneFollower.SkeletonRenderer.Initialize(false); } + public void OnSceneGUI () { + if (targetBoneFollower == null) return; + var skeletonRendererComponent = targetBoneFollower.skeletonRenderer; + if (skeletonRendererComponent == null) return; + + var transform = skeletonRendererComponent.transform; + var skeleton = skeletonRendererComponent.skeleton; + + if (string.IsNullOrEmpty(targetBoneFollower.boneName)) { + SpineHandles.DrawBones(transform, skeleton); + SpineHandles.DrawBoneNames(transform, skeleton); + Handles.Label(targetBoneFollower.transform.position, "No bone selected", EditorStyles.helpBox); + } else { + var targetBone = targetBoneFollower.bone; + if (targetBone == null) return; + SpineHandles.DrawBoneWireframe(transform, targetBone, SpineHandles.TransformContraintColor); + Handles.Label(targetBone.GetWorldPosition(transform), targetBone.Data.Name, SpineHandles.BoneNameStyle); + } + } + + #region Context Menu Item + [MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject")] + static void AddBoneFollowerGameObject (MenuCommand cmd) { + var skeletonRenderer = cmd.context as SkeletonRenderer; + var go = new GameObject("BoneFollower"); + var t = go.transform; + t.SetParent(skeletonRenderer.transform); + t.localPosition = Vector3.zero; + + var f = go.AddComponent(); + f.skeletonRenderer = skeletonRenderer; + + EditorGUIUtility.PingObject(t); + + Undo.RegisterCreatedObjectUndo(go, "Add BoneFollower"); + } + + // Validate + [MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject", true)] + static bool ValidateAddBoneFollowerGameObject (MenuCommand cmd) { + var skeletonRenderer = cmd.context as SkeletonRenderer; + return skeletonRenderer.valid; + } + #endregion + override public void OnInspectorGUI () { if (needsReset) { targetBoneFollower.Initialize(); diff --git a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs index c611631fb..5b8557248 100644 --- a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs @@ -531,7 +531,7 @@ namespace Spine.Unity.Editor { bool abortSkeletonImport = false; foreach (string sp in skeletonPaths) { if (!reimport && CheckForValidSkeletonData(sp)) { - ClearExistingSkeletonData(sp); + ReloadSkeletonData(sp); continue; } @@ -596,7 +596,7 @@ namespace Spine.Unity.Editor { // Any post processing of images } - static void ClearExistingSkeletonData (string skeletonJSONPath) { + static void ReloadSkeletonData (string skeletonJSONPath) { string dir = Path.GetDirectoryName(skeletonJSONPath); TextAsset textAsset = (TextAsset)AssetDatabase.LoadAssetAtPath(skeletonJSONPath, typeof(TextAsset)); DirectoryInfo dirInfo = new DirectoryInfo(dir); @@ -611,6 +611,7 @@ namespace Spine.Unity.Editor { if (Selection.activeObject == skeletonDataAsset) Selection.activeObject = null; + Debug.LogFormat("Changes to '{0}' detected. Clearing SkeletonDataAsset: {1}", skeletonJSONPath, localPath); skeletonDataAsset.Clear(); string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(skeletonDataAsset)); @@ -643,9 +644,8 @@ namespace Spine.Unity.Editor { // if (currentHash == null || lastHash != currentHash) // Do any upkeep on synchronized assets - if (currentHash != null) { + if (currentHash != null) EditorPrefs.SetString(guid + "_hash", currentHash); - } } } } @@ -1399,17 +1399,18 @@ namespace Spine.Unity.Editor { public static Color TransformContraintColor { get { return new Color(170/255f, 226/255f, 35/255f); } } public static Color IkColor { get { return new Color(228/255f,90/255f,43/255f); } } + static Vector3[] _boneMeshVerts = { + new Vector3(0, 0, 0), + new Vector3(0.1f, 0.1f, 0), + new Vector3(1, 0, 0), + new Vector3(0.1f, -0.1f, 0) + }; static Mesh _boneMesh; public static Mesh BoneMesh { get { if (_boneMesh == null) { _boneMesh = new Mesh { - vertices = new [] { - new Vector3(0, 0, 0), - new Vector3(0.1f, 0.1f, 0), - new Vector3(1, 0, 0), - new Vector3(0.1f, -0.1f, 0) - }, + vertices = _boneMeshVerts, uv = new Vector2[4], triangles = new [] { 0, 1, 2, 2, 3, 0 } }; @@ -1506,6 +1507,34 @@ namespace Spine.Unity.Editor { } } + static Vector3[] _boneWireBuffer = new Vector3[5]; + static Vector3[] GetBoneWireBuffer (Matrix4x4 m) { + for (int i = 0, n = _boneMeshVerts.Length; i < n; i++) + _boneWireBuffer[i] = m.MultiplyPoint(_boneMeshVerts[i]); + + _boneWireBuffer[4] = _boneWireBuffer[0]; // closed polygon. + return _boneWireBuffer; + } + public static void DrawBoneWireframe (Transform transform, Bone b, Color color) { + Handles.color = color; + var pos = new Vector3(b.WorldX, b.WorldY, 0); + float length = b.Data.Length; + + if (length > 0) { + Quaternion rot = Quaternion.Euler(0, 0, b.WorldRotationX); + Vector3 scale = Vector3.one * length * b.WorldScaleX; + const float my = 1.5f; + scale.y *= (SpineHandles.handleScale + 1f) * 0.5f; + scale.y = Mathf.Clamp(scale.x, -my, my); + Handles.DrawPolyLine(GetBoneWireBuffer(transform.localToWorldMatrix * Matrix4x4.TRS(pos, rot, scale))); + var wp = transform.TransformPoint(pos); + DrawBoneCircle(wp, color, transform.forward); + } else { + var wp = transform.TransformPoint(pos); + DrawBoneCircle(wp, color, transform.forward); + } + } + public static void DrawBone (Transform transform, Bone b, float boneScale) { var pos = new Vector3(b.WorldX, b.WorldY, 0); float length = b.Data.Length; diff --git a/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs b/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs index 63e0bb211..2974d3a9e 100644 --- a/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs +++ b/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs @@ -175,11 +175,12 @@ namespace Spine.Unity.Editor { #region Menus [MenuItem("CONTEXT/SkeletonRenderer/Add BoundingBoxFollower GameObject")] static void AddBoundingBoxFollowerChild (MenuCommand command) { - AddBoundingBoxFollowerChild((SkeletonRenderer)command.context); + var go = AddBoundingBoxFollowerChild((SkeletonRenderer)command.context); + Undo.RegisterCreatedObjectUndo(go, "Add BoundingBoxFollower"); } #endregion - static void AddBoundingBoxFollowerChild (SkeletonRenderer sr, BoundingBoxFollower original = null) { + static GameObject AddBoundingBoxFollowerChild (SkeletonRenderer sr, BoundingBoxFollower original = null) { var go = new GameObject("BoundingBoxFollower"); go.transform.SetParent(sr.transform, false); var newFollower = go.AddComponent(); @@ -196,6 +197,7 @@ namespace Spine.Unity.Editor { Selection.activeGameObject = go; EditorGUIUtility.PingObject(go); + return go; } } diff --git a/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs b/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs index b9a44fec3..a7fe321d3 100644 --- a/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs +++ b/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs @@ -266,7 +266,9 @@ namespace Spine.Unity.Modules { [MenuItem ("CONTEXT/SkeletonRenderer/Add Skeleton Render Separator")] static void AddRenderSeparatorComponent (MenuCommand cmd) { var skeletonRenderer = cmd.context as SkeletonRenderer; - skeletonRenderer.gameObject.AddComponent(); + var newComponent = skeletonRenderer.gameObject.AddComponent(); + + Undo.RegisterCreatedObjectUndo(newComponent, "Add SkeletonRenderSeparator"); } // Validate diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs index 53413a5fc..22a290666 100644 --- a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs @@ -233,7 +233,6 @@ namespace Spine.Unity.Editor { menu.AddItem(new GUIContent(bones.Items[i].Data.Name), bones.Items[i].Data.Name == current, callback, bones.Items[i]); menu.ShowAsContext(); - } void TargetBoneSelected (object obj) {